Check-in [2a5e1397d4]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:merge with trunk
Timelines: family | ancestors | descendants | both | wtf-8-experiment
Files: files | file ages | folders
SHA1: 2a5e1397d46fe2b5aad5e9d42e1da87899d8175a
User & Date: chw 2019-12-27 11:43:56.602
Context
2019-12-30
05:39
merge with trunk check-in: 913904ba68 user: chw tags: wtf-8-experiment
2019-12-27
11:43
merge with trunk check-in: 2a5e1397d4 user: chw tags: wtf-8-experiment
11:42
recreate zint configure script check-in: 50b021c465 user: chw tags: trunk
2019-12-24
05:31
merge with trunk check-in: 6f85033e05 user: chw tags: wtf-8-experiment
Changes
Unified Diff Ignore Whitespace Patch
Deleted assets/zint2.6.5/demo.tcl.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package require Tk
package require zint
wm title . "ZINT Demo"
wm minsize . 480 320
if {[info command sdltk] eq "sdltk"} {
    wm attributes . -fullscreen 1
    set padx 30
    set pady 20
} else {
    wm geometry . 480x320
    set padx 5
    set pady 5
}
image create photo ::zintimg
pack [::ttk::combobox .c -values [lsort [zint symbologies]] -state readonly] \
    -side top -fill x -padx $padx -pady $pady
.c set Datamatrix
pack [::ttk::entry .e] -side top -fill x -padx $padx -pady $pady
.e insert end 12345
bind .e <Return> Generate
pack [::ttk::button .b -text Generate -command Generate] -fill x -side top \
    -padx $padx -pady $pady
proc Generate {} {
    ::zintimg blank
    ::zintimg configure -width 1 -height 1
    ::zintimg blank
    ::zintimg configure -width 0 -height 0
    if {[catch {zint encode [.e get] ::zintimg -barcode [.c get]} e]} {
        tk_messageBox -message $e -title "Zint error"
    } else {
	set w [image width ::zintimg]
	set h [image height ::zintimg]
	set lw [winfo width .l]
	set lh [winfo height .l]
	set sx [expr {int(1.0 * $lw / $w)}]
	set sy [expr {int(1.0 * $lh / $h)}]
	if {$sy < $sx} {
	    set sx $sy
	}
	if {$sx <= 0} {
	    set sx [expr {1.1 * $lw / $w}]
	    set sy [expr {1.1 * $lh / $h}]
	    if {$sy < $sx} {
		set sx $sy
	    }
	}
	::zintimg blank
	::zintimg configure -width 1 -height 1
	::zintimg blank
	::zintimg configure -width 0 -height 0
	catch {
	    zint encode [.e get] ::zintimg -barcode [.c get] -scale $sx
	}
    }
}
pack [label .l -image ::zintimg -bg white] -side top -fill both -expand 1 \
    -padx $padx -pady $pady
bind .e <Configure> {
    after cancel Generate
    after idle Generate
}
bind .c <<ComboboxSelected>> {
    after cancel Generate
    after idle Generate
}
bind all <Break> exit
bind all <Control-q> exit
bind all <Alt-q> exit
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








































































































































Deleted assets/zint2.6.5/pkgIndex.tcl.
1
2
package ifneeded zint 2.6.5 \
    [list load libzint[info sharedlibextension] Zint]
<
<




Added assets/zint2.7.0/demo.tcl.








































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package require Tk
package require zint
wm title . "ZINT Demo"
wm minsize . 480 320
if {[info command sdltk] eq "sdltk"} {
    wm attributes . -fullscreen 1
    set padx 30
    set pady 20
} else {
    wm geometry . 480x320
    set padx 5
    set pady 5
}
image create photo ::zintimg
pack [::ttk::combobox .c -values [lsort [zint symbologies]] -state readonly] \
    -side top -fill x -padx $padx -pady $pady
.c set Datamatrix
pack [::ttk::entry .e] -side top -fill x -padx $padx -pady $pady
.e insert end 12345
bind .e <Return> Generate
pack [::ttk::button .b -text Generate -command Generate] -fill x -side top \
    -padx $padx -pady $pady
proc Generate {} {
    ::zintimg blank
    ::zintimg configure -width 1 -height 1
    ::zintimg blank
    ::zintimg configure -width 0 -height 0
    if {[catch {zint encode [.e get] ::zintimg -barcode [.c get]} e]} {
        tk_messageBox -message $e -title "Zint error"
    } else {
	set w [image width ::zintimg]
	set h [image height ::zintimg]
	set lw [winfo width .l]
	set lh [winfo height .l]
	set sx [expr {int(1.0 * $lw / $w)}]
	set sy [expr {int(1.0 * $lh / $h)}]
	if {$sy < $sx} {
	    set sx $sy
	}
	if {$sx <= 0} {
	    set sx [expr {1.1 * $lw / $w}]
	    set sy [expr {1.1 * $lh / $h}]
	    if {$sy < $sx} {
		set sx $sy
	    }
	}
	::zintimg blank
	::zintimg configure -width 1 -height 1
	::zintimg blank
	::zintimg configure -width 0 -height 0
	catch {
	    zint encode [.e get] ::zintimg -barcode [.c get] -scale $sx
	}
    }
}
pack [label .l -image ::zintimg -bg white] -side top -fill both -expand 1 \
    -padx $padx -pady $pady
bind .e <Configure> {
    after cancel Generate
    after idle Generate
}
bind .c <<ComboboxSelected>> {
    after cancel Generate
    after idle Generate
}
bind all <Break> exit
bind all <Control-q> exit
bind all <Alt-q> exit
Added assets/zint2.7.0/pkgIndex.tcl.




>
>
1
2
package ifneeded zint 2.7.0 \
    [list load libzint[info sharedlibextension] Zint]
Changes to jni/tcl/generic/tclStrToD.c.
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
/*
 * Static functions defined in this file.
 */

static int		AccumulateDecimalDigit(unsigned, int,
			    Tcl_WideUInt *, mp_int *, int);
static double		MakeHighPrecisionDouble(int signum,
			    mp_int *significand, int nSigDigs, int exponent);
static double		MakeLowPrecisionDouble(int signum,
			    Tcl_WideUInt significand, int nSigDigs,
			    int exponent);
#ifdef IEEE_FLOATING_POINT
static double		MakeNaN(int signum, Tcl_WideUInt tag);
#endif
static double		RefineApproximation(double approx,
			    mp_int *exactSignificand, int exponent);
static void		MulPow5(mp_int *, unsigned, mp_int *);
static int 		NormalizeRightward(Tcl_WideUInt *);







|


|







292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
/*
 * Static functions defined in this file.
 */

static int		AccumulateDecimalDigit(unsigned, int,
			    Tcl_WideUInt *, mp_int *, int);
static double		MakeHighPrecisionDouble(int signum,
			    mp_int *significand, int nSigDigs, long exponent);
static double		MakeLowPrecisionDouble(int signum,
			    Tcl_WideUInt significand, int nSigDigs,
			    long exponent);
#ifdef IEEE_FLOATING_POINT
static double		MakeNaN(int signum, Tcl_WideUInt tag);
#endif
static double		RefineApproximation(double approx,
			    mp_int *exactSignificand, int exponent);
static void		MulPow5(mp_int *, unsigned, mp_int *);
static int 		NormalizeRightward(Tcl_WideUInt *);
1339
1340
1341
1342
1343
1344
1345




1346
1347



























1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
	     * to whether 'significandOverflow' is set. The desired floating
	     * point value is significand * 10**k, where
	     * k = numTrailZeros+exponent-numDigitsAfterDp.
	     */

	    objPtr->typePtr = &tclDoubleType;
	    if (exponentSignum) {




		exponent = -exponent;
	    }



























	    if (!significandOverflow) {
		objPtr->internalRep.doubleValue = MakeLowPrecisionDouble(
			signum, significandWide, numSigDigs,
			numTrailZeros + exponent - numDigitsAfterDp);
	    } else {
		objPtr->internalRep.doubleValue = MakeHighPrecisionDouble(
			signum, &significandBig, numSigDigs,
			numTrailZeros + exponent - numDigitsAfterDp);
	    }
	    break;

	case sINF:
	case sINFINITY:
	    if (signum) {
		objPtr->internalRep.doubleValue = -HUGE_VAL;







>
>
>
>


>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


|
<


|
<







1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381

1382
1383
1384

1385
1386
1387
1388
1389
1390
1391
	     * to whether 'significandOverflow' is set. The desired floating
	     * point value is significand * 10**k, where
	     * k = numTrailZeros+exponent-numDigitsAfterDp.
	     */

	    objPtr->typePtr = &tclDoubleType;
	    if (exponentSignum) {
		/* 
		 * At this point exponent>=0, so the following calculation
		 * cannot underflow. 
		 */
		exponent = -exponent;
	    }

	    /*
	     * Adjust the exponent for the number of trailing zeros that
	     * have not been accumulated, and the number of digits after
	     * the decimal point. Pin any overflow to LONG_MAX/LONG_MIN
	     * respectively.
	     */

	    if (exponent >= 0) {
		if (exponent - numDigitsAfterDp > LONG_MAX - numTrailZeros) {
		    exponent = LONG_MAX;
		} else {
		    exponent = exponent - numDigitsAfterDp + numTrailZeros;
		}
	    } else {
		if (exponent + numTrailZeros < LONG_MIN + numDigitsAfterDp) {
		    exponent = LONG_MIN;
		} else {
		    exponent = exponent + numTrailZeros - numDigitsAfterDp;
		}
	    }

	    /* 
	     * The desired number is now significandWide * 10**exponent
	     * or significandBig * 10**exponent, depending on whether
	     * the significand has overflowed a wide int.
	     */
	    if (!significandOverflow) {
		objPtr->internalRep.doubleValue = MakeLowPrecisionDouble(
			signum, significandWide, numSigDigs, exponent);

	    } else {
		objPtr->internalRep.doubleValue = MakeHighPrecisionDouble(
			signum, &significandBig, numSigDigs, exponent);

	    }
	    break;

	case sINF:
	case sINFINITY:
	    if (signum) {
		objPtr->internalRep.doubleValue = -HUGE_VAL;
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559



1560
1561
1562
1563
1564
1565
1566
 *
 *----------------------------------------------------------------------
 */

static double
MakeLowPrecisionDouble(
    int signum,			/* 1 if the number is negative, 0 otherwise */
    Tcl_WideUInt significand,	/* Significand of the number. */
    int numSigDigs,		/* Number of digits in the significand. */
    int exponent)		/* Power of ten. */
{
    double retval;		/* Value of the number. */
    mp_int significandBig;	/* Significand expressed as a bignum. */

    /*
     * With gcc on x86, the floating point rounding mode is double-extended.
     * This causes the result of double-precision calculations to be rounded
     * twice: once to the precision of double-extended and then again to the
     * precision of double. Double-rounding introduces gratuitous errors of 1
     * ulp, so we need to change rounding mode to 53-bits.
     */

    TCL_IEEE_DOUBLE_ROUNDING;

    /*
     * Test for the easy cases.
     */




    if (numSigDigs <= QUICK_MAX) {
	if (exponent >= 0) {
	    if (exponent <= mmaxpow) {
		/*
		 * The significand is an exact integer, and so is
		 * 10**exponent. The product will be correct to within 1/2 ulp
		 * without special handling.







|
|
|


















>
>
>







1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
 *
 *----------------------------------------------------------------------
 */

static double
MakeLowPrecisionDouble(
    int signum,			/* 1 if the number is negative, 0 otherwise */
    Tcl_WideUInt significand,	/* Significand of the number */
    int numSigDigs,		/* Number of digits in the significand */
    long exponent)		/* Power of ten */
{
    double retval;		/* Value of the number. */
    mp_int significandBig;	/* Significand expressed as a bignum. */

    /*
     * With gcc on x86, the floating point rounding mode is double-extended.
     * This causes the result of double-precision calculations to be rounded
     * twice: once to the precision of double-extended and then again to the
     * precision of double. Double-rounding introduces gratuitous errors of 1
     * ulp, so we need to change rounding mode to 53-bits.
     */

    TCL_IEEE_DOUBLE_ROUNDING;

    /*
     * Test for the easy cases.
     */

    if (significand == 0) {
	return copysign(0.0, -signum);
    }
    if (numSigDigs <= QUICK_MAX) {
	if (exponent >= 0) {
	    if (exponent <= mmaxpow) {
		/*
		 * The significand is an exact integer, and so is
		 * 10**exponent. The product will be correct to within 1/2 ulp
		 * without special handling.
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671

1672
1673



1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
 *	the answer in high precision.
 *
 *----------------------------------------------------------------------
 */

static double
MakeHighPrecisionDouble(
    int signum,			/* 1=negative, 0=nonnegative. */
    mp_int *significand,	/* Exact significand of the number. */
    int numSigDigs,		/* Number of significant digits. */
    int exponent)		/* Power of 10 by which to multiply. */
{
    double retval;
    int machexp;		/* Machine exponent of a power of 10. */

    /*
     * With gcc on x86, the floating point rounding mode is double-extended.
     * This causes the result of double-precision calculations to be rounded
     * twice: once to the precision of double-extended and then again to the
     * precision of double. Double-rounding introduces gratuitous errors of 1
     * ulp, so we need to change rounding mode to 53-bits.
     */

    TCL_IEEE_DOUBLE_ROUNDING;

    /*
     * Quick checks for over/underflow.

     */




    if (numSigDigs+exponent-1 > maxDigits) {
	retval = HUGE_VAL;
	goto returnValue;
    }
    if (numSigDigs+exponent-1 < minDigits) {
	retval = 0;
	goto returnValue;
    }

    /*
     * Develop a first approximation to the significand. It is tempting simply
     * to force bignum to double, but that will overflow on input numbers like
     * 1.[string repeat 0 1000]1; while this is a not terribly likely







|
|
|
|















|
>


>
>
>
|


<
|
|







1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712

1713
1714
1715
1716
1717
1718
1719
1720
1721
 *	the answer in high precision.
 *
 *----------------------------------------------------------------------
 */

static double
MakeHighPrecisionDouble(
    int signum,			/* 1=negative, 0=nonnegative */
    mp_int *significand,	/* Exact significand of the number */
    int numSigDigs,		/* Number of significant digits */
    long exponent)		/* Power of 10 by which to multiply */
{
    double retval;
    int machexp;		/* Machine exponent of a power of 10. */

    /*
     * With gcc on x86, the floating point rounding mode is double-extended.
     * This causes the result of double-precision calculations to be rounded
     * twice: once to the precision of double-extended and then again to the
     * precision of double. Double-rounding introduces gratuitous errors of 1
     * ulp, so we need to change rounding mode to 53-bits.
     */

    TCL_IEEE_DOUBLE_ROUNDING;

    /*
     * Quick checks for zero, and over/underflow. Be careful to avoid
     * integer overflow when calculating with 'exponent'.
     */

    if (mp_iszero(significand)) {
	return copysign(0.0, -signum);
    }
    if (exponent >= 0 && exponent-1 > maxDigits-numSigDigs) {
	retval = HUGE_VAL;
	goto returnValue;

    } else if (exponent < 0 && numSigDigs+exponent < minDigits+1) {
	retval = 0.0;
	goto returnValue;
    }

    /*
     * Develop a first approximation to the significand. It is tempting simply
     * to force bignum to double, but that will overflow on input numbers like
     * 1.[string repeat 0 1000]1; while this is a not terribly likely
1807
1808
1809
1810
1811
1812
1813



1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825

1826
1827
1828









1829

1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887






1888
1889
1890
1891
1892
1893

1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910





1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926



1927
1928
1929




1930
1931
1932
1933
1934
1935
1936
1937
1938










1939
1940
1941
1942
1943
1944
1945
    double quot;		/* Correction term. */
    double minincr;		/* Lower bound on the absolute value of the
				 * correction term. */
    int roundToEven = 0;	/* Flag == TRUE if we need to invoke
				 * "round to even" functionality */
    double rteSignificand;	/* Significand of the round-to-even result */
    int rteExponent;		/* Exponent of the round-to-even result */



    Tcl_WideInt rteSigWide;	/* Wide integer version of the significand
				 * for testing evenness */
    int i;

    /*
     * The first approximation is always low. If we find that it's HUGE_VAL,
     * we're done.
     */

    if (approxResult == HUGE_VAL) {
	return approxResult;
    }


    /*
     * Find a common denominator for the decimal and binary fractions. The









     * common denominator will be 2**M2 + 5**M5.

     */

    significand = frexp(approxResult, &binExponent);
    i = mantBits - binExponent;
    if (i < 0) {
	M2 = 0;
    } else {
	M2 = i;
    }
    if (exponent > 0) {
	M5 = 0;
    } else {
	M5 = -exponent;
	if (M5 - 1 > M2) {
	    M2 = M5 - 1;
	}
    }

    /*
     * The floating point number is significand*2**binExponent. Compute the
     * large integer significand*2**(binExponent+M2+1). The 2**-1 bit of the
     * significand (the most significant) corresponds to the
     * 2**(binExponent+M2 + 1) bit of 2*M2*v. Allocate enough digits to hold
     * that quantity, then convert the significand to a large integer, scaled
     * appropriately. Then multiply by the appropriate power of 5.
     */

    msb = binExponent + M2;	/* 1008 */
    nDigits = msb / MP_DIGIT_BIT + 1;
    mp_init_size(&twoMv, nDigits);
    i = (msb % MP_DIGIT_BIT + 1);
    twoMv.used = nDigits;
    significand *= SafeLdExp(1.0, i);
    while (--nDigits >= 0) {
	twoMv.dp[nDigits] = (mp_digit) significand;
	significand -= (mp_digit) significand;
	significand = SafeLdExp(significand, MP_DIGIT_BIT);
    }
    for (i = 0; i <= 8; ++i) {
	if (M5 & (1 << i)) {
	    mp_mul(&twoMv, pow5+i, &twoMv);
	}
    }

    /*
     * Collect the decimal significand as a high precision integer. The least
     * significant bit corresponds to bit M2+exponent+1 so it will need to be
     * shifted left by that many bits after being multiplied by
     * 5**(M5+exponent).
     */

    mp_init_copy(&twoMd, exactSignificand);
    for (i=0; i<=8; ++i) {
	if ((M5 + exponent) & (1 << i)) {
	    mp_mul(&twoMd, pow5+i, &twoMd);
	}
    }
    mp_mul_2d(&twoMd, M2+exponent+1, &twoMd);






    mp_sub(&twoMd, &twoMv, &twoMd);

    /*
     * The result, 2Mv-2Md, needs to be divided by 2M to yield a correction
     * term. Because 2M may well overflow a double, we need to scale the
     * denominator by a factor of 2**binExponent-mantBits.

     */

    scale = binExponent - mantBits - 1;

    mp_set(&twoMv, 1);
    for (i=0; i<=8; ++i) {
	if (M5 & (1 << i)) {
	    mp_mul(&twoMv, pow5+i, &twoMv);
	}
    }
    multiplier = M2 + scale + 1;
    if (multiplier > 0) {
	mp_mul_2d(&twoMv, multiplier, &twoMv);
    } else if (multiplier < 0) {
	mp_div_2d(&twoMv, -multiplier, &twoMv, NULL);
    }






    switch (mp_cmp_mag(&twoMd, &twoMv)) {
    case MP_LT:
	/*
	 * If the result is less than unity, the error is less than 1/2 unit in
	 * the last place, so there's no correction to make.
	 */
	mp_clear(&twoMd);
	mp_clear(&twoMv);
	return approxResult;
    case MP_EQ:
	/*
	 * If the result is exactly unity, we need to round to even.
	 */
	roundToEven = 1;
	break;
    case MP_GT:



	break;
    }





    if (roundToEven) {
	rteSignificand = frexp(approxResult, &rteExponent);
	rteSigWide = (Tcl_WideInt) ldexp(rteSignificand, FP_PRECISION);
	if ((rteSigWide & 1) == 0) {
	    mp_clear(&twoMd);
	    mp_clear(&twoMv);
	    return approxResult;
	}
    }











    /*
     * Convert the numerator and denominator of the corrector term accurately
     * to floating point numbers.
     */

    num = TclBignumToDouble(&twoMd);







>
>
>












>


<
>
>
>
>
>
>
>
>
>
|
>


<
















|
<
|
<
<
|




















|
|
<
|









>
>
>
>
>
>





|
>



<













>
>
>
>
>



<
|






|




>
>
>



>
>
>
>









>
>
>
>
>
>
>
>
>
>







1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866

1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879

1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896

1897


1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920

1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946

1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967

1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
    double quot;		/* Correction term. */
    double minincr;		/* Lower bound on the absolute value of the
				 * correction term. */
    int roundToEven = 0;	/* Flag == TRUE if we need to invoke
				 * "round to even" functionality */
    double rteSignificand;	/* Significand of the round-to-even result */
    int rteExponent;		/* Exponent of the round-to-even result */
    int shift;			/* Shift count for converting numerator
				 * and denominator of corrector to floating
				 * point */
    Tcl_WideInt rteSigWide;	/* Wide integer version of the significand
				 * for testing evenness */
    int i;

    /*
     * The first approximation is always low. If we find that it's HUGE_VAL,
     * we're done.
     */

    if (approxResult == HUGE_VAL) {
	return approxResult;
    }
    significand = frexp(approxResult, &binExponent);

    /*

     * We are trying to compute a corrector term that, when added to the
     * approximate result, will yield close to the exact result.
     * The exact result is exactSignificand * 10**exponent.
     * The approximate result is significand * 2**binExponent
     * If exponent<0, we need to multiply the exact value by 10**-exponent
     * to make it an integer, plus another factor of 2 to decide on rounding.
     *  Similarly if binExponent<FP_PRECISION, we need
     * to multiply by 2**FP_PRECISION to make the approximate value an integer.
     *
     * Let M = 2**M2 * 5**M5 be the least common multiple of these two
     * multipliers.
     */


    i = mantBits - binExponent;
    if (i < 0) {
	M2 = 0;
    } else {
	M2 = i;
    }
    if (exponent > 0) {
	M5 = 0;
    } else {
	M5 = -exponent;
	if (M5 - 1 > M2) {
	    M2 = M5 - 1;
	}
    }

    /*
     * Compute twoMv as 2*M*v, where v is the approximate value.

     * This is done by bit-whacking to calculate 2**(M2+1)*significand, 


     * and then multiplying by 5**M5.
     */

    msb = binExponent + M2;	/* 1008 */
    nDigits = msb / MP_DIGIT_BIT + 1;
    mp_init_size(&twoMv, nDigits);
    i = (msb % MP_DIGIT_BIT + 1);
    twoMv.used = nDigits;
    significand *= SafeLdExp(1.0, i);
    while (--nDigits >= 0) {
	twoMv.dp[nDigits] = (mp_digit) significand;
	significand -= (mp_digit) significand;
	significand = SafeLdExp(significand, MP_DIGIT_BIT);
    }
    for (i = 0; i <= 8; ++i) {
	if (M5 & (1 << i)) {
	    mp_mul(&twoMv, pow5+i, &twoMv);
	}
    }

    /*
     * Compute twoMd as 2*M*d, where d is the exact value.
     * This is done by multiplying by 5**(M5+exponent) and then multiplying

     * by 2**(M5+exponent+1), which is, of couse, a left shift.
     */

    mp_init_copy(&twoMd, exactSignificand);
    for (i=0; i<=8; ++i) {
	if ((M5 + exponent) & (1 << i)) {
	    mp_mul(&twoMd, pow5+i, &twoMd);
	}
    }
    mp_mul_2d(&twoMd, M2+exponent+1, &twoMd);

    /* 
     * Now let twoMd = twoMd - twoMv, the difference between the exact and
     * approximate values.
     */

    mp_sub(&twoMd, &twoMv, &twoMd);

    /*
     * The result, 2Mv-2Md, needs to be divided by 2M to yield a correction
     * term. Because 2M may well overflow a double, we need to scale the
     * denominator by a factor of 2**binExponent-mantBits. Place that factor
     * times 1/2 ULP into twoMd.
     */

    scale = binExponent - mantBits - 1;

    mp_set(&twoMv, 1);
    for (i=0; i<=8; ++i) {
	if (M5 & (1 << i)) {
	    mp_mul(&twoMv, pow5+i, &twoMv);
	}
    }
    multiplier = M2 + scale + 1;
    if (multiplier > 0) {
	mp_mul_2d(&twoMv, multiplier, &twoMv);
    } else if (multiplier < 0) {
	mp_div_2d(&twoMv, -multiplier, &twoMv, NULL);
    }

    /*
     * Will the eventual correction term be less than, equal to, or
     * greater than 1/2 ULP?
     */

    switch (mp_cmp_mag(&twoMd, &twoMv)) {
    case MP_LT:
	/*

	 * If the error is less than 1/2 ULP, there's no correction to make.
	 */
	mp_clear(&twoMd);
	mp_clear(&twoMv);
	return approxResult;
    case MP_EQ:
	/*
	 * If the error is exactly 1/2 ULP, we need to round to even.
	 */
	roundToEven = 1;
	break;
    case MP_GT:
	/*
	 * We need to correct the result if the error exceeds 1/2 ULP.
	 */
	break;
    }

    /*
     * If we're in the 'round to even' case, and the significand is already
     * even, we're done. Return the approximate result.
     */
    if (roundToEven) {
	rteSignificand = frexp(approxResult, &rteExponent);
	rteSigWide = (Tcl_WideInt) ldexp(rteSignificand, FP_PRECISION);
	if ((rteSigWide & 1) == 0) {
	    mp_clear(&twoMd);
	    mp_clear(&twoMv);
	    return approxResult;
	}
    }

    /* 
     * Reduce the numerator and denominator of the corrector term so that
     * they will fit in the floating point precision.
     */
    shift = mp_count_bits(&twoMv) - FP_PRECISION - 1;
    if (shift > 0) {
	mp_div_2d(&twoMv, shift, &twoMv, NULL);
	mp_div_2d(&twoMd, shift, &twoMd, NULL);
    }

    /*
     * Convert the numerator and denominator of the corrector term accurately
     * to floating point numbers.
     */

    num = TclBignumToDouble(&twoMd);
Changes to jni/tcl/tests/expr.test.
6840
6841
6842
6843
6844
6845
6846


































































6847
6848
6849
6850
6851
6852
6853

test expr-41.1 {exponent overflow} {
    expr 1.0e2147483630
} Inf
test expr-41.2 {exponent underflow} {
    expr 1.0e-2147483630
} 0.0



































































test expr-42.1 {denormals} ieeeFloatingPoint {
    expr 7e-324
} 5e-324

# TIP 114








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919

test expr-41.1 {exponent overflow} {
    expr 1.0e2147483630
} Inf
test expr-41.2 {exponent underflow} {
    expr 1.0e-2147483630
} 0.0

test expr-41.3 {exponent overflow} {
    expr 1e2147483647
} Inf
test expr-41.4 {exponent overflow} {
    expr 1e2147483648
} Inf
test expr-41.5 {exponent overflow} {
    expr 100e2147483645
} Inf
test expr-41.6 {exponent overflow} {
    expr 100e2147483646
} Inf
test expr-41.7 {exponent overflow} {
    expr 1.0e2147483647
} Inf
test expr-41.8 {exponent overflow} {
    expr 1.0e2147483648
} Inf
test expr-41.9 {exponent overflow} {
    expr 1.2e2147483647
} Inf
test expr-41.10 {exponent overflow} {
    expr 1.2e2147483648
} Inf

test expr-41.11 {exponent overflow} {
    expr 1e-2147483648
} 0.0
test expr-41.12 {exponent overflow} {
    expr 1e-2147483649
} 0.0
test expr-41.13 {exponent overflow} {
    expr 100e-2147483650
} 0.0
test expr-41.14 {exponent overflow} {
    expr 100e-2147483651
} 0.0 
test expr-41.15 {exponent overflow} {
    expr 1.0e-2147483648
} 0.0 
test expr-41.16 {exponent overflow} {
    expr 1.0e-2147483649
} 0.0 
test expr-41.17 {exponent overflow} {
    expr 1.23e-2147483646
} 0.0
test expr-41.18 {exponent overflow} {
    expr 1.23e-2147483647
} 0.0 

test expr-41.19 {numSigDigs == 0} {
    expr 0e309
} 0.0
test expr-41.20 {numSigDigs == 0} {
    expr 0e310
} 0.0
test expr-41.21 {negative zero, large exponent} {
    expr -0e309
} -0.0
test expr-41.22 {negative zero, large exponent} {
    expr -0e310
} -0.0
test expr-41.23 {floating point overflow on significand (Bug 1de6b0629e)} {
    expr 123[string repeat 0 309]1e-310
} 123.0

test expr-42.1 {denormals} ieeeFloatingPoint {
    expr 7e-324
} 5e-324

# TIP 114

Changes to jni/tcl/unix/tclUnixPort.h.
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
    __declspec(dllimport) extern __stdcall int GetModuleHandleExW(unsigned int, const char *, void *);
    __declspec(dllimport) extern __stdcall int GetModuleFileNameW(void *, const char *, int);
    __declspec(dllimport) extern __stdcall int WideCharToMultiByte(int, int, const void *, int,
	    char *, int, const char *, void *);
    __declspec(dllimport) extern __stdcall int MultiByteToWideChar(int, int, const char *, int,
	    WCHAR *, int);
    __declspec(dllimport) extern __stdcall void OutputDebugStringW(const WCHAR *);
    __declspec(dllimport) extern __stdcall int IsDebuggerPresent();
    __declspec(dllimport) extern __stdcall int GetLastError();
    __declspec(dllimport) extern __stdcall int GetFileAttributesW(const WCHAR *);
    __declspec(dllimport) extern __stdcall int SetFileAttributesW(const WCHAR *, int);

    __declspec(dllimport) extern int cygwin_conv_path(int, const void *, void *, int);
/* On Cygwin, the environment is imported from the Cygwin DLL. */
#ifndef __x86_64__
#   define environ __cygwin_environ







|
|







99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
    __declspec(dllimport) extern __stdcall int GetModuleHandleExW(unsigned int, const char *, void *);
    __declspec(dllimport) extern __stdcall int GetModuleFileNameW(void *, const char *, int);
    __declspec(dllimport) extern __stdcall int WideCharToMultiByte(int, int, const void *, int,
	    char *, int, const char *, void *);
    __declspec(dllimport) extern __stdcall int MultiByteToWideChar(int, int, const char *, int,
	    WCHAR *, int);
    __declspec(dllimport) extern __stdcall void OutputDebugStringW(const WCHAR *);
    __declspec(dllimport) extern __stdcall int IsDebuggerPresent(void);
    __declspec(dllimport) extern __stdcall int GetLastError(void);
    __declspec(dllimport) extern __stdcall int GetFileAttributesW(const WCHAR *);
    __declspec(dllimport) extern __stdcall int SetFileAttributesW(const WCHAR *, int);

    __declspec(dllimport) extern int cygwin_conv_path(int, const void *, void *, int);
/* On Cygwin, the environment is imported from the Cygwin DLL. */
#ifndef __x86_64__
#   define environ __cygwin_environ
Changes to jni/tcl/win/tclWinChan.c.
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066

Tcl_Channel
Tcl_MakeFileChannel(
    ClientData rawHandle,	/* OS level handle */
    int mode)			/* ORed combination of TCL_READABLE and
				 * TCL_WRITABLE to indicate file mode. */
{
#if defined(HAVE_NO_SEH) && !defined(_WIN64)
    TCLEXCEPTION_REGISTRATION registration;
#endif
    char channelName[16 + TCL_INTEGER_SPACE];
    Tcl_Channel channel = NULL;
    HANDLE handle = (HANDLE) rawHandle;
    HANDLE dupedHandle;
    TclFile readFile = NULL, writeFile = NULL;







|







1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066

Tcl_Channel
Tcl_MakeFileChannel(
    ClientData rawHandle,	/* OS level handle */
    int mode)			/* ORed combination of TCL_READABLE and
				 * TCL_WRITABLE to indicate file mode. */
{
#if defined(HAVE_NO_SEH) && !defined(_WIN64) && !defined(__clang__)
    TCLEXCEPTION_REGISTRATION registration;
#endif
    char channelName[16 + TCL_INTEGER_SPACE];
    Tcl_Channel channel = NULL;
    HANDLE handle = (HANDLE) rawHandle;
    HANDLE dupedHandle;
    TclFile readFile = NULL, writeFile = NULL;
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132

	result = DuplicateHandle(GetCurrentProcess(), handle,
		GetCurrentProcess(), &dupedHandle, 0, FALSE,
		DUPLICATE_SAME_ACCESS);

	if (result == 0) {
	    /*
	     * Unable to make a duplicate. It's definately invalid at this
	     * point.
	     */

	    return NULL;
	}

	/*
	 * Use structured exception handling (Win32 SEH) to protect the close
	 * of this duped handle which might throw EXCEPTION_INVALID_HANDLE.
	 */

	result = 0;
#if defined(HAVE_NO_SEH) && !defined(_WIN64)
	/*
	 * Don't have SEH available, do things the hard way. Note that this
	 * needs to be one block of asm, to avoid stack imbalance; also, it is
	 * illegal for one asm block to contain a jump to another.
	 */

	__asm__ __volatile__ (







|












|







1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132

	result = DuplicateHandle(GetCurrentProcess(), handle,
		GetCurrentProcess(), &dupedHandle, 0, FALSE,
		DUPLICATE_SAME_ACCESS);

	if (result == 0) {
	    /*
	     * Unable to make a duplicate. It's definitely invalid at this
	     * point.
	     */

	    return NULL;
	}

	/*
	 * Use structured exception handling (Win32 SEH) to protect the close
	 * of this duped handle which might throw EXCEPTION_INVALID_HANDLE.
	 */

	result = 0;
#if defined(HAVE_NO_SEH) && !defined(_WIN64) && !defined(__clang__)
	/*
	 * Don't have SEH available, do things the hard way. Note that this
	 * needs to be one block of asm, to avoid stack imbalance; also, it is
	 * illegal for one asm block to contain a jump to another.
	 */

	__asm__ __volatile__ (
Changes to jni/zint/Android.mk.
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

LOCAL_ADDITIONAL_DEPENDENCIES += $(tk_path)/tk-config.mk

LOCAL_C_INCLUDES := $(tcl_includes) $(tk_includes) \
	$(LOCAL_PATH)/../libpng $(LOCAL_PATH)/backend

LOCAL_CFLAGS := $(tcl_cflags) $(tk_cflags) \
	-DZINT_VERSION="\"2.6.0\"" \
	-Dmain=zint \
	-O2

LOCAL_SRC_FILES := \
	backend/2of5.c \
	backend/auspost.c \
	backend/aztec.c \







|







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

LOCAL_ADDITIONAL_DEPENDENCIES += $(tk_path)/tk-config.mk

LOCAL_C_INCLUDES := $(tcl_includes) $(tk_includes) \
	$(LOCAL_PATH)/../libpng $(LOCAL_PATH)/backend

LOCAL_CFLAGS := $(tcl_cflags) $(tk_cflags) \
	-DZINT_VERSION="\"2.7.0\"" \
	-Dmain=zint \
	-O2

LOCAL_SRC_FILES := \
	backend/2of5.c \
	backend/auspost.c \
	backend/aztec.c \
44
45
46
47
48
49
50



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
	backend/common.c \
	backend/composite.c \
	backend/dllversion.c \
	backend/dmatrix.c \
	backend/dotcode.c \
	backend/eci.c \
	backend/emf.c \



	backend/gif.c \
	backend/gridmtx.c \
	backend/gs1.c \
	backend/hanxin.c \
	backend/imail.c \
	backend/large.c \
	backend/library.c \
	backend/mailmark.c \
	backend/maxicode.c \
	backend/medical.c \
	backend/pcx.c \
	backend/pdf417.c \
	backend/plessey.c \
	backend/png.c \
	backend/postal.c \
	backend/ps.c \
	backend/qr.c \
	backend/raster.c \
	backend/reedsol.c \
	backend/render.c \
	backend/rss.c \
	backend/svg.c \
	backend/telepen.c \
	backend/tif.c \
	backend/upcean.c \
	backend/ultra.c \
	backend/vector.c \
	backend_tcl/zint.c \







>
>
>



















|
|







44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
	backend/common.c \
	backend/composite.c \
	backend/dllversion.c \
	backend/dmatrix.c \
	backend/dotcode.c \
	backend/eci.c \
	backend/emf.c \
	backend/gb18030.c \
	backend/gb2312.c \
	backend/general_field.c \
	backend/gif.c \
	backend/gridmtx.c \
	backend/gs1.c \
	backend/hanxin.c \
	backend/imail.c \
	backend/large.c \
	backend/library.c \
	backend/mailmark.c \
	backend/maxicode.c \
	backend/medical.c \
	backend/pcx.c \
	backend/pdf417.c \
	backend/plessey.c \
	backend/png.c \
	backend/postal.c \
	backend/ps.c \
	backend/qr.c \
	backend/raster.c \
	backend/reedsol.c \
	backend/rss.c \
	backend/sjis.c \
	backend/svg.c \
	backend/telepen.c \
	backend/tif.c \
	backend/upcean.c \
	backend/ultra.c \
	backend/vector.c \
	backend_tcl/zint.c \
Changes to jni/zint/CMakeLists.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40



41
42
43
44
45
46
47
# (c) 2008 by BogDan Vatra < bogdan@licentia.eu >

cmake_minimum_required(VERSION 2.6)
project(zint-package)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

#set(CMAKE_VERBOSE_MAKEFILE ON)
#comment or remove the above line before release

set (ZINT_VERSION_MAJOR 2)
set (ZINT_VERSION_MINOR 6)
set (ZINT_VERSION_RELEASE 5)
set (ZINT_VERSION "${ZINT_VERSION_MAJOR}.${ZINT_VERSION_MINOR}.${ZINT_VERSION_RELEASE}" )

add_definitions (-DZINT_VERSION=\"${ZINT_VERSION}\" -Wall)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules" )

set(ZINT_DEBUG FALSE CACHE BOOL "Set debug compile flag")
set(ZINT_SANITIZE FALSE CACHE BOOL "Set sanitize compile/link flags")


include (SetPaths.cmake)

INCLUDE (CheckCXXCompilerFlag)

if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
    check_cxx_compiler_flag("-Wall" CXX_COMPILER_FLAG_WALL)
    if (CXX_COMPILER_FLAG_WALL)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
    endif (CXX_COMPILER_FLAG_WALL)
    if (ZINT_DEBUG)
        add_compile_options("-g")
        add_compile_options("-O0")
    endif (ZINT_DEBUG)
    if (ZINT_SANITIZE)
        add_compile_options("-fsanitize=undefined")
        add_compile_options("-fsanitize=address")
        set (CMAKE_EXE_LINKER_FLAGS "-fsanitize=undefined -fsanitize=address")
    endif (ZINT_SANITIZE)



endif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)


IF(APPLE)
    IF (UNIVERSAL) # TODO: make univeral binary
        IF(NOT ZINT_HAS_BEEN_RUN_BEFORE and UNIVERAL)
            IF(EXISTS /Developer/SDKs/MacOSX10.5.sdk OR EXISTS /SDKs/MacOSX10.5.sdk)











|
|








>

















|

>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# (c) 2008 by BogDan Vatra < bogdan@licentia.eu >

cmake_minimum_required(VERSION 2.6)
project(zint-package)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

#set(CMAKE_VERBOSE_MAKEFILE ON)
#comment or remove the above line before release

set (ZINT_VERSION_MAJOR 2)
set (ZINT_VERSION_MINOR 7)
set (ZINT_VERSION_RELEASE 0)
set (ZINT_VERSION "${ZINT_VERSION_MAJOR}.${ZINT_VERSION_MINOR}.${ZINT_VERSION_RELEASE}" )

add_definitions (-DZINT_VERSION=\"${ZINT_VERSION}\" -Wall)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules" )

set(ZINT_DEBUG FALSE CACHE BOOL "Set debug compile flag")
set(ZINT_SANITIZE FALSE CACHE BOOL "Set sanitize compile/link flags")
set(ZINT_TEST FALSE CACHE BOOL "Set test compile flag")

include (SetPaths.cmake)

INCLUDE (CheckCXXCompilerFlag)

if (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
    check_cxx_compiler_flag("-Wall" CXX_COMPILER_FLAG_WALL)
    if (CXX_COMPILER_FLAG_WALL)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
    endif (CXX_COMPILER_FLAG_WALL)
    if (ZINT_DEBUG)
        add_compile_options("-g")
        add_compile_options("-O0")
    endif (ZINT_DEBUG)
    if (ZINT_SANITIZE)
        add_compile_options("-fsanitize=undefined")
        add_compile_options("-fsanitize=address")
        set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address")
    endif (ZINT_SANITIZE)
    if (ZINT_TEST)
        add_definitions("-DZINT_TEST")
    endif (ZINT_TEST)
endif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)


IF(APPLE)
    IF (UNIVERSAL) # TODO: make univeral binary
        IF(NOT ZINT_HAS_BEEN_RUN_BEFORE and UNIVERAL)
            IF(EXISTS /Developer/SDKs/MacOSX10.5.sdk OR EXISTS /SDKs/MacOSX10.5.sdk)
Deleted jni/zint/INSTALL.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
     **********************************************************************
     * PLEASE NOTE: This is just a simple guide to getting Zint working.  *
     * More complete documentation is available from the project website: *
     *                  >>>  http://www.zint.org.uk  <<<                  *
     **********************************************************************

The easiest way to configure compilation is to take advantage of the CMake
utilities. You will need to install CMake first. If no Qt libraries are
installed then CMake will not attempt to build the Zint Barcode Studio
GUI. Similarly if libpng is not detected then CMake will not attempt to
compile PNG image support. This method is recommened in most cases, the
notable exception being MinGW.

Once CMake is installed follow these steps:

	cd build
	cmake ..
	make
	make install

The command line program can be accessed by typing:

	zint {options} -d {data}

Notice that the data needs to be entered after all other options. Any options
given after the data will be ignored. The GUI can be accessed by typing:

	zint-qt

The MakeFile Method:
MakeFiles are provided for some systems although this method is now
deprecated. It compiles and installs the library and CLI only. If you have
installed Zint using this method before please note that the binaries will
now install to a different location than version 2.3.0 or earlier (/usr/bin
rather than /usr/local/bin and /usr/lib rather than /usr/local/lib). This
makes installation easier on Red Hat based systems (RHEL, CentOS, Fedora
etc.) and on BSD-like systems (FreeBSD, OpenBSD etc.) and is more correctly
in line with the LSB.

    *** UNINSTALL ANY PREVIOUS VERSION OF ZINT BEFORE USING THIS METHOD ***

To compile using this method simply run:

	make
	make install

If compiling on MinGW substitute the Makefile.mingw files for the default
Makefiles in both the /frontend and /backend folders.

MS Windows:
Compiling on Cygwin and MinGW are covered above. Compiling with MS Visual
Studio is more involved!  Full instructions are currently not ready for
publication but will be placed on the project website as soon as possible.

Mac OSX:
It is possible to compile Zint using methods similar to those
given above, but this has not been thoroughly tested yet. An install
binary for OSX is also in development. As of feb 2012 the easiest way to 
get zint install on Mac OSX is to use HomeBrew with:

        brew install zint
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


























































































































Deleted jni/zint/Makefile.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Make libzint and zint together

zint:
	$(MAKE) -C backend/
	$(MAKE) -C frontend/

install:
	$(MAKE) install -C backend/
	$(MAKE) install -C frontend/

uninstall:
	$(MAKE) uninstall -C frontend/
	$(MAKE) uninstall -C backend/

clean:
	$(MAKE) clean -C backend/
	$(MAKE) clean -C frontend/

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































Changes to jni/zint/README.
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
128, EAN-128, NVE-18, Code 16k, PDF417, MicroPDF417, Two-Track Pharmacode,
PostNet, PLANET, Australia Post 4-State Symbols, RM4SCC, USPS OneCode, GS1
DataBar, DataBar-14, DataBar Limited, DataBar Extended, DataBar Stacked,
Composite Symbology, Data Matrix, QR Code, Maxicode, Aztec Code, EAN-13,
Micro QR, Korea Post Barcode, HIBC Code 128, HIBC Code 39, HIBC Data Matrix,
HIBC PDF417, HIBC MicroPDF417, HIBC QR Code, HIBC Aztec Code, Japanese Postal
Code, Code 49, Channel Code, Code One, Grid Matrix, FIM and Flattermarken,
Codablock-F, DotCode, Han Xin Code.

Output can be saved as BMP, EPS, GIF, PCX, TIF, EMF, PNG or SVG. 

PROJECT HISTORY
---------------

Version 2.5.0:







|







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
128, EAN-128, NVE-18, Code 16k, PDF417, MicroPDF417, Two-Track Pharmacode,
PostNet, PLANET, Australia Post 4-State Symbols, RM4SCC, USPS OneCode, GS1
DataBar, DataBar-14, DataBar Limited, DataBar Extended, DataBar Stacked,
Composite Symbology, Data Matrix, QR Code, Maxicode, Aztec Code, EAN-13,
Micro QR, Korea Post Barcode, HIBC Code 128, HIBC Code 39, HIBC Data Matrix,
HIBC PDF417, HIBC MicroPDF417, HIBC QR Code, HIBC Aztec Code, Japanese Postal
Code, Code 49, Channel Code, Code One, Grid Matrix, FIM and Flattermarken,
Codablock-F, DotCode, Han Xin Code, rMQR.

Output can be saved as BMP, EPS, GIF, PCX, TIF, EMF, PNG or SVG. 

PROJECT HISTORY
---------------

Version 2.5.0:
69
70
71
72
73
74
75



































76
77
78
79
80
81
82
eci ISO 8859-16 table missing data line
upce check for 7 digit input (causes crash) and BARCODE_UPCE_CHK -> BARCODE_UPCE mapping removed
US imail check for invalid barcode identifier and allow 0/5/9/11 length zip
maxicode code set correction
cmake flags for debugging and sanitize options
unit tests for the changes, with a simple test suite based on qrencode/tests





































CONTACT US
----------
The home of Zint is:

	<http://www.sourceforge.net/projects/zint>








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
eci ISO 8859-16 table missing data line
upce check for 7 digit input (causes crash) and BARCODE_UPCE_CHK -> BARCODE_UPCE mapping removed
US imail check for invalid barcode identifier and allow 0/5/9/11 length zip
maxicode code set correction
cmake flags for debugging and sanitize options
unit tests for the changes, with a simple test suite based on qrencode/tests

Version 2.6.6:
Fixed bugs:
Ticket 161: PDF row size may be set
Ticket 155: PDF numeric compaction
Ticket 164: crash due to call of svg_plot withnull vector
Ticket 119: Crash on bullseye raster drawing
qtzint: Micro-QR version option choice corrected (+1 missing).
Datamatrix: code corruption when ECI was encoded and base256 encoding was automatically chosen.

Version 2.6.7 2019-10-07:

Changes:
Ticket 127: Allow to code ECI 3 if explicitly given for debug purposes.
***Incompatible change**
"--eci 3" now leads to included ECI information.
"--eci 0" may now be used to not include any ECI information.
The default of the parameter changed from 3 to 0.

Fixed bugs:
Ticket 146, 165: fix wrong encoding of RSS composite codes

Version 2.7.0 2019-12-05:
Changes:
- Automatic height option added to qzint
- DotCode in line with new specification
- New GS1 AIs 7240, 235, 417, 7040, 8026, updated checks for 7007, 8008
- New Symbology rMQR
- QR and Qridmatrix optimisation for GB2312
- removed depreciated interface for gLabels program. Please use current interface.

Fixed bugs:
- Many improvements in composite codes
- SVG output corrected for messages containing "<" and "&".
- GS1-128 and RSS may only be used with GS1 contents
- Han Xin chinese character handling

CONTACT US
----------
The home of Zint is:

	<http://www.sourceforge.net/projects/zint>

Changes to jni/zint/backend/2of5.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#ifdef _MSC_VER
#include <malloc.h>







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#ifdef _MSC_VER
#include <malloc.h>
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
};

static inline char check_digit(unsigned int count) {
    return itoc((10 - (count % 10)) % 10);
}

/* Code 2 of 5 Standard (Code 2 of 5 Matrix) */
int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number;
    char dest[512]; /* 6 + 80 * 6 + 6 + 1 ~ 512*/

    if (length > 80) {
        strcpy(symbol->errtxt, "301: Input too long");
        return ZINT_ERROR_TOO_LONG;







|







56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
};

static inline char check_digit(unsigned int count) {
    return itoc((10 - (count % 10)) % 10);
}

/* Code 2 of 5 Standard (Code 2 of 5 Matrix) */
INTERNAL int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number;
    char dest[512]; /* 6 + 80 * 6 + 6 + 1 ~ 512*/

    if (length > 80) {
        strcpy(symbol->errtxt, "301: Input too long");
        return ZINT_ERROR_TOO_LONG;
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Code 2 of 5 Industrial */
int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number;
    char dest[512]; /* 6 + 40 * 10 + 6 + 1 */

    if (length > 45) {
        strcpy(symbol->errtxt, "303: Input too long");
        return ZINT_ERROR_TOO_LONG;







|







87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Code 2 of 5 Industrial */
INTERNAL int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number;
    char dest[512]; /* 6 + 40 * 10 + 6 + 1 */

    if (length > 45) {
        strcpy(symbol->errtxt, "303: Input too long");
        return ZINT_ERROR_TOO_LONG;
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Code 2 of 5 IATA */
int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, error_number;
    char dest[512]; /* 4 + 45 * 10 + 3 + 1 */

    if (length > 45) {
        strcpy(symbol->errtxt, "305: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }







|







118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Code 2 of 5 IATA */
INTERNAL int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, error_number;
    char dest[512]; /* 4 + 45 * 10 + 3 + 1 */

    if (length > 45) {
        strcpy(symbol->errtxt, "305: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Code 2 of 5 Data Logic */
int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number;
    char dest[512]; /* 4 + 80 * 6 + 3 + 1 */

    if (length > 80) {
        strcpy(symbol->errtxt, "307: Input too long");
        return ZINT_ERROR_TOO_LONG;







|







148
149
150
151
152
153
154
155
156
157
158
159
160
161
162

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Code 2 of 5 Data Logic */
INTERNAL int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number;
    char dest[512]; /* 4 + 80 * 6 + 3 + 1 */

    if (length > 80) {
        strcpy(symbol->errtxt, "307: Input too long");
        return ZINT_ERROR_TOO_LONG;
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Code 2 of 5 Interleaved */
int interleaved_two_of_five(struct zint_symbol *symbol, const unsigned char source[], size_t length) {

    int i, j, error_number;
    char bars[7], spaces[7], mixed[14], dest[1000];
#ifndef _MSC_VER
    unsigned char temp[length + 2];
#else
    unsigned char* temp = (unsigned char *) _alloca((length + 2) * sizeof (unsigned char));







|







179
180
181
182
183
184
185
186
187
188
189
190
191
192
193

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Code 2 of 5 Interleaved */
INTERNAL int interleaved_two_of_five(struct zint_symbol *symbol, const unsigned char source[], size_t length) {

    int i, j, error_number;
    char bars[7], spaces[7], mixed[14], dest[1000];
#ifndef _MSC_VER
    unsigned char temp[length + 2];
#else
    unsigned char* temp = (unsigned char *) _alloca((length + 2) * sizeof (unsigned char));
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
    expand(symbol, dest);
    ustrcpy(symbol->text, temp);
    return error_number;

}

/* Interleaved 2-of-5 (ITF) */
int itf14(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, error_number, zeroes;
    unsigned int count;
    char localstr[16];

    count = 0;

    if (length > 13) {







|







240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
    expand(symbol, dest);
    ustrcpy(symbol->text, temp);
    return error_number;

}

/* Interleaved 2-of-5 (ITF) */
INTERNAL int itf14(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, error_number, zeroes;
    unsigned int count;
    char localstr[16];

    count = 0;

    if (length > 13) {
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
    localstr[14] = '\0';
    error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr));
    ustrcpy(symbol->text, (unsigned char*) localstr);
    return error_number;
}

/* Deutshe Post Leitcode */
int dpleit(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, error_number;
    unsigned int count;
    char localstr[16];
    int zeroes;

    count = 0;
    if (length > 13) {







|







281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
    localstr[14] = '\0';
    error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr));
    ustrcpy(symbol->text, (unsigned char*) localstr);
    return error_number;
}

/* Deutshe Post Leitcode */
INTERNAL int dpleit(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, error_number;
    unsigned int count;
    char localstr[16];
    int zeroes;

    count = 0;
    if (length > 13) {
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
    localstr[14] = '\0';
    error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr));
    ustrcpy(symbol->text, (unsigned char*) localstr);
    return error_number;
}

/* Deutsche Post Identcode */
int dpident(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, error_number, zeroes;
    unsigned int count;
    char localstr[16];

    count = 0;
    if (length > 11) {
        strcpy(symbol->errtxt, "315: Input wrong length");







|







318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
    localstr[14] = '\0';
    error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr));
    ustrcpy(symbol->text, (unsigned char*) localstr);
    return error_number;
}

/* Deutsche Post Identcode */
INTERNAL int dpident(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, error_number, zeroes;
    unsigned int count;
    char localstr[16];

    count = 0;
    if (length > 11) {
        strcpy(symbol->errtxt, "315: Input wrong length");
351
352
353
354
355
356
357
358
359
    }
    localstr[11] = check_digit(count);
    localstr[12] = '\0';
    error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr));
    ustrcpy(symbol->text, (unsigned char*) localstr);
    return error_number;
}









<
<
352
353
354
355
356
357
358


    }
    localstr[11] = check_digit(count);
    localstr[12] = '\0';
    error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr));
    ustrcpy(symbol->text, (unsigned char*) localstr);
    return error_number;
}


Changes to jni/zint/backend/CMakeLists.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# (c) 2008 by BogDan Vatra < bogdan@licentia.eu >

project(zint)

find_package(PNG)

set(zint_COMMON_SRCS common.c library.c render.c large.c reedsol.c gs1.c eci.c)
set(zint_ONEDIM_SRCS code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c)
set(zint_POSTAL_SRCS postal.c auspost.c imail.c mailmark.c)
set(zint_TWODIM_SRCS code16k.c codablock.c dmatrix.c pdf417.c qr.c maxicode.c composite.c aztec.c code49.c code1.c gridmtx.c hanxin.c dotcode.c ultra.c)
set(zint_OUTPUT_SRCS vector.c render.c ps.c svg.c emf.c bmp.c pcx.c gif.c png.c tif.c raster.c)
set(zint_SRCS ${zint_OUTPUT_SRCS} ${zint_COMMON_SRCS} ${zint_ONEDIM_SRCS} ${zint_POSTAL_SRCS} ${zint_TWODIM_SRCS})

if(PNG_FOUND)
    include_directories( ${PNG_INCLUDES} )
else(PNG_FOUND)
    add_definitions (-DNO_PNG)
endif(PNG_FOUND)






|



|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# (c) 2008 by BogDan Vatra < bogdan@licentia.eu >

project(zint)

find_package(PNG)

set(zint_COMMON_SRCS common.c library.c large.c reedsol.c gs1.c eci.c general_field.c sjis.c gb2312.c gb18030.c)
set(zint_ONEDIM_SRCS code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c)
set(zint_POSTAL_SRCS postal.c auspost.c imail.c mailmark.c)
set(zint_TWODIM_SRCS code16k.c codablock.c dmatrix.c pdf417.c qr.c maxicode.c composite.c aztec.c code49.c code1.c gridmtx.c hanxin.c dotcode.c ultra.c)
set(zint_OUTPUT_SRCS vector.c ps.c svg.c emf.c bmp.c pcx.c gif.c png.c tif.c raster.c)
set(zint_SRCS ${zint_OUTPUT_SRCS} ${zint_COMMON_SRCS} ${zint_ONEDIM_SRCS} ${zint_POSTAL_SRCS} ${zint_TWODIM_SRCS})

if(PNG_FOUND)
    include_directories( ${PNG_INCLUDES} )
else(PNG_FOUND)
    add_definitions (-DNO_PNG)
endif(PNG_FOUND)
Deleted jni/zint/backend/Makefile.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# Linux makefile for libzint
#
# make			compiles
# make install		copies to /usr/local/lib
# make uninstall	removes library
# make clean		cleans up a previous compilation and any object or editor files
#

ZINT_VERSION:=-DZINT_VERSION=\"2.6.0\"


CC := gcc
INCLUDE := -I/usr/include
CFLAGS := -g

prefix := /usr
includedir := $(prefix)/include
libdir := $(prefix)/lib
DESTDIR :=

COMMON:= common.c render.c png.c library.c ps.c large.c reedsol.c gs1.c svg.c tif.c emf.c
COMMON_OBJ:= common.o render.o png.o library.o ps.o large.o reedsol.o gs1.o svg.o tif.o emf.o
ONEDIM:= code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c
ONEDIM_OBJ:= code.o code128.o 2of5.o upcean.o telepen.o medical.o plessey.o rss.o
POSTAL:= postal.c auspost.c imail.c
POSTAL_OBJ:= postal.o auspost.o imail.o
TWODIM:= code16k.c dmatrix.c pdf417.c qr.c maxicode.c composite.c aztec.c code49.c code1.c gridmtx.c
TWODIM_OBJ:= code16k.o dmatrix.o pdf417.o qr.o maxicode.o composite.o aztec.o code49.o code1.o gridmtx.o
OBJS:=$(COMMON_OBJ) $(ONEDIM_OBJ) $(TWODIM_OBJ) $(POSTAL_OBJ)
LIBS:= -lz -lm -lpng

all: libzint.a libzint.so

libzint.a: $(OBJS)
	$(AR) rcs libzint.a $(OBJS)
 
libzint.so.2.4.4: $(OBJS)
	$(CC) $(CFLAGS) $(ZINT_VERSION) -shared -Wl,-soname,libzint.so -o libzint.so.2.4.4 $(INCLUDE) $(OBJS) $(LIBS)

libzint.so: libzint.so.2.4.4
	rm -f libzint.so
	ln -s libzint.so.* libzint.so

%.o: %.c
	$(CC) -Wall -fPIC $(CFLAGS) $(ZINT_VERSION) -c -o $@ $<

.PHONY: install uninstall clean dist

install:
	test "$(UID)" = "0" && ldconfig -n $(PWD) || true
	install -d $(DESTDIR)$(libdir)
	mv libzint.* $(DESTDIR)$(libdir)
	install -D -p --mode=0644 zint.h $(DESTDIR)$(includedir)/zint.h

uninstall:
	rm $(DESTDIR)$(libdir)/libzint.*
	rm $(DESTDIR)$(includedir)/zint.h

clean:
	rm -f libzint.* *.o *.a *~


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




























































































































Changes to jni/zint/backend/auspost.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#define GDSET 	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz #"

static const char *AusNTable[10] = {
    "00", "01", "02", "10", "11", "12", "20", "21", "22", "30"
};








>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#define GDSET 	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz #"

static const char *AusNTable[10] = {
    "00", "01", "02", "10", "11", "12", "20", "21", "22", "30"
};

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#endif

static inline char convert_pattern(char data, int shift) {
    return (data - '0') << shift;
}

/* Adds Reed-Solomon error correction to auspost */
void rs_error(char data_pattern[]) {
    size_t reader, triple_writer = 0;
    char triple[31];
    unsigned char result[5];

    for (reader = 2; reader < strlen(data_pattern); reader += 3, triple_writer++) {
        triple[triple_writer] = convert_pattern(data_pattern[reader], 4)
                + convert_pattern(data_pattern[reader + 1], 2)







|







65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#endif

static inline char convert_pattern(char data, int shift) {
    return (data - '0') << shift;
}

/* Adds Reed-Solomon error correction to auspost */
static void rs_error(char data_pattern[]) {
    size_t reader, triple_writer = 0;
    char triple[31];
    unsigned char result[5];

    for (reader = 2; reader < strlen(data_pattern); reader += 3, triple_writer++) {
        triple[triple_writer] = convert_pattern(data_pattern[reader], 4)
                + convert_pattern(data_pattern[reader + 1], 2)
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    for (reader = 4; reader > 0; reader--) {
        strcat(data_pattern, AusBarTable[(int) result[reader - 1]]);
    }
    rs_free();
}

/* Handles Australia Posts's 4 State Codes */
int australia_post(struct zint_symbol *symbol, unsigned char source[], int length) {
    /* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically
       (i.e. the FCC doesn't need to be specified by the user) dependent
       on the length of the input string */

    /* The contents of data_pattern conform to the following standard:
       0 = Tracker, Ascender and Descender
       1 = Tracker and Ascender







|







87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
    for (reader = 4; reader > 0; reader--) {
        strcat(data_pattern, AusBarTable[(int) result[reader - 1]]);
    }
    rs_free();
}

/* Handles Australia Posts's 4 State Codes */
INTERNAL int australia_post(struct zint_symbol *symbol, unsigned char source[], int length) {
    /* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically
       (i.e. the FCC doesn't need to be specified by the user) dependent
       on the length of the input string */

    /* The contents of data_pattern conform to the following standard:
       0 = Tracker, Ascender and Descender
       1 = Tracker and Ascender
244
245
246
247
248
249
250
251
252
253
    symbol->row_height[2] = 3;

    symbol->rows = 3;
    symbol->width = writer - 1;

    return error_number;
}










<
<
<
245
246
247
248
249
250
251



    symbol->row_height[2] = 3;

    symbol->rows = 3;
    symbol->width = writer - 1;

    return error_number;
}



Changes to jni/zint/backend/aztec.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539

    if (gs1) {
        bin_append(0, 5, binary_string); // P/S
        bin_append(0, 5, binary_string); // FLG(n)
        bin_append(0, 3, binary_string); // FLG(0)
    }

    if (eci != 3) {
        bin_append(0, 5, binary_string); // P/S
        bin_append(0, 5, binary_string); // FLG(n)
        if (eci < 10) {
            bin_append(1, 3, binary_string); // FLG(1)
            bin_append(2 + eci, 4, binary_string);
        }
        if ((eci >= 10) && (eci <= 99)) {







|







526
527
528
529
530
531
532
533
534
535
536
537
538
539
540

    if (gs1) {
        bin_append(0, 5, binary_string); // P/S
        bin_append(0, 5, binary_string); // FLG(n)
        bin_append(0, 3, binary_string); // FLG(0)
    }

    if (eci != 0) {
        bin_append(0, 5, binary_string); // P/S
        bin_append(0, 5, binary_string); // FLG(n)
        if (eci < 10) {
            bin_append(1, 3, binary_string); // FLG(1)
            bin_append(2 + eci, 4, binary_string);
        }
        if ((eci >= 10) && (eci <= 99)) {
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
    AztecMap[(avoidReferenceGrid(65) * 151) + avoidReferenceGrid(64)] = 1;
    AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(65)] = 1;
    AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(77)] = 1;
    AztecMap[(avoidReferenceGrid(65) * 151) + avoidReferenceGrid(77)] = 1;
    AztecMap[(avoidReferenceGrid(76) * 151) + avoidReferenceGrid(77)] = 1;
}

int aztec(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    int x, y, i, j, p, data_blocks, ecc_blocks, layers, total_bits;
    char binary_string[20000], bit_pattern[20045], descriptor[42];
    char adjusted_string[20000];
    unsigned char desc_data[4], desc_ecc[6];
    int err_code, ecc_level, compact, data_length, data_maxsize, codeword_size, adjusted_length;
    int remainder, padbits, count, gs1, adjustment_size;
    int debug = symbol->debug, reader = 0;
    int comp_loop = 4;

#ifdef _MSC_VER
    unsigned int* data_part;
    unsigned int* ecc_part;
#endif

    memset(binary_string, 0, 20000);
    memset(adjusted_string, 0, 20000);

    if (symbol->input_mode == GS1_MODE) {
        gs1 = 1;
    } else {
        gs1 = 0;
    }
    if (symbol->output_options & READER_INIT) {
        reader = 1;
        comp_loop = 1;







|

















|







966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
    AztecMap[(avoidReferenceGrid(65) * 151) + avoidReferenceGrid(64)] = 1;
    AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(65)] = 1;
    AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(77)] = 1;
    AztecMap[(avoidReferenceGrid(65) * 151) + avoidReferenceGrid(77)] = 1;
    AztecMap[(avoidReferenceGrid(76) * 151) + avoidReferenceGrid(77)] = 1;
}

INTERNAL int aztec(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    int x, y, i, j, p, data_blocks, ecc_blocks, layers, total_bits;
    char binary_string[20000], bit_pattern[20045], descriptor[42];
    char adjusted_string[20000];
    unsigned char desc_data[4], desc_ecc[6];
    int err_code, ecc_level, compact, data_length, data_maxsize, codeword_size, adjusted_length;
    int remainder, padbits, count, gs1, adjustment_size;
    int debug = symbol->debug, reader = 0;
    int comp_loop = 4;

#ifdef _MSC_VER
    unsigned int* data_part;
    unsigned int* ecc_part;
#endif

    memset(binary_string, 0, 20000);
    memset(adjusted_string, 0, 20000);

    if ((symbol->input_mode & 0x07) == GS1_MODE) {
        gs1 = 1;
    } else {
        gs1 = 0;
    }
    if (symbol->output_options & READER_INIT) {
        reader = 1;
        comp_loop = 1;
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
        symbol->width = 151 - (2 * AztecOffset[layers - 1]);
    }

    return err_code;
}

/* Encodes Aztec runes as specified in ISO/IEC 24778:2008 Annex A */
int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length) {
    int input_value, error_number, i, y, x;
    char binary_string[28];
    unsigned char data_codewords[3], ecc_codewords[6];

    error_number = 0;
    input_value = 0;
    if (length > 3) {







|







1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
        symbol->width = 151 - (2 * AztecOffset[layers - 1]);
    }

    return err_code;
}

/* Encodes Aztec runes as specified in ISO/IEC 24778:2008 Annex A */
INTERNAL int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length) {
    int input_value, error_number, i, y, x;
    char binary_string[28];
    unsigned char data_codewords[3], ecc_codewords[6];

    error_number = 0;
    input_value = 0;
    if (length > 3) {
1687
1688
1689
1690
1691
1692
1693
1694
        symbol->row_height[y - 8] = 1;
    }
    symbol->rows = 11;
    symbol->width = 11;

    return 0;
}








<
1688
1689
1690
1691
1692
1693
1694

        symbol->row_height[y - 8] = 1;
    }
    symbol->rows = 11;
    symbol->width = 11;

    return 0;
}

Changes to jni/zint/backend/bmp.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include "bmp.h"        /* Bitmap header structure */
#include <math.h>
#ifdef _MSC_VER
#include <io.h>
#include <fcntl.h>
#endif

#define SSET	"0123456789ABCDEF"

int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    int i, row, column;
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int row_size;
    unsigned int data_size;
    unsigned char *bitmap_file_start, *bmp_posn;
    char *bitmap;
    FILE *bmp_file;







>














|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include "bmp.h"        /* Bitmap header structure */
#include <math.h>
#ifdef _MSC_VER
#include <io.h>
#include <fcntl.h>
#endif

#define SSET	"0123456789ABCDEF"

INTERNAL int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    int i, row, column;
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int row_size;
    unsigned int data_size;
    unsigned char *bitmap_file_start, *bmp_posn;
    char *bitmap;
    FILE *bmp_file;
141
142
143
144
145
146
147
148
    fwrite(bitmap_file_start, file_header.file_size, 1, bmp_file);
    fclose(bmp_file);

    free(bitmap_file_start);
    free(bitmap);
    return 0;
}








<
142
143
144
145
146
147
148

    fwrite(bitmap_file_start, file_header.file_size, 1, bmp_file);
    fclose(bmp_file);

    free(bitmap_file_start);
    free(bitmap);
    return 0;
}

Changes to jni/zint/backend/codablock.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
    int CFollowing;     /* Still following Characters in Charset C */
} CharacterSetTable;

/* Find the possible Code-128 Character sets for a character
 * The result is an or of CodeA,CodeB,CodeC,CodeFNC1 in dependency of the
 * possible Code 128 character sets.
 */
int GetPossibleCharacterSet(unsigned char C)
{
    if (C<='\x19')      /* Dec:31 */
        return CodeA;
    if (C>='0' && C<='9')
        return ZTNum;   /* ZTNum=CodeA+CodeB+CodeC */
    if (C==aFNC1)
        return ZTFNC1;  /* ZTFNC1=CodeA+CodeB+CodeC+CodeFNC1 */







|







90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
    int CFollowing;     /* Still following Characters in Charset C */
} CharacterSetTable;

/* Find the possible Code-128 Character sets for a character
 * The result is an or of CodeA,CodeB,CodeC,CodeFNC1 in dependency of the
 * possible Code 128 character sets.
 */
static int GetPossibleCharacterSet(unsigned char C)
{
    if (C<='\x19')      /* Dec:31 */
        return CodeA;
    if (C>='0' && C<='9')
        return ZTNum;   /* ZTNum=CodeA+CodeB+CodeC */
    if (C==aFNC1)
        return ZTFNC1;  /* ZTFNC1=CodeA+CodeB+CodeC+CodeFNC1 */
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
    }
}

/* Find the amount of numerical characters in pairs which will fit in
 * one bundle into the line (up to here). This is calculated online because
 * it depends on the space in the line.
 */
int RemainingDigits(CharacterSetTable *T, int charCur,int emptyColumns)
{
    int digitCount;     /* Numerical digits fitting in the line */
    int runChar;
    runChar=charCur;
    digitCount=0;
    while(emptyColumns>0 && runChar<charCur+T[charCur].CFollowing)
    {







|







169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
    }
}

/* Find the amount of numerical characters in pairs which will fit in
 * one bundle into the line (up to here). This is calculated online because
 * it depends on the space in the line.
 */
static int RemainingDigits(CharacterSetTable *T, int charCur,int emptyColumns)
{
    int digitCount;     /* Numerical digits fitting in the line */
    int runChar;
    runChar=charCur;
    digitCount=0;
    while(emptyColumns>0 && runChar<charCur+T[charCur].CFollowing)
    {
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
            ++testColumns;
        }
    }
}

/* Print a character in character set A
 */
void A2C128_A(uchar **ppOutPos,uchar c)
{
    uchar * pOutPos = *ppOutPos;
    switch(c){
    case aCodeB: *pOutPos=100; break;
    case aFNC4: *pOutPos=101; break;
    case aFNC1: *pOutPos=102; break;
    case aFNC2: *pOutPos=97; break;







|







537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
            ++testColumns;
        }
    }
}

/* Print a character in character set A
 */
static void A2C128_A(uchar **ppOutPos,uchar c)
{
    uchar * pOutPos = *ppOutPos;
    switch(c){
    case aCodeB: *pOutPos=100; break;
    case aFNC4: *pOutPos=101; break;
    case aFNC1: *pOutPos=102; break;
    case aFNC2: *pOutPos=97; break;
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
            *pOutPos=(uchar)(c+64);
        break;
    }
    (*ppOutPos)++;
}
/* Output c in Set B
 */
void A2C128_B(uchar **ppOutPos,uchar c)
{
    uchar * pOutPos = *ppOutPos;
    switch(c){
    case aFNC1: *pOutPos=102; break;
    case aFNC2: *pOutPos=97; break;
    case aFNC3: *pOutPos=96; break;
    case aFNC4: *pOutPos=100; break;
    case aCodeA: *pOutPos=101; break;
    case aCodeC: *pOutPos=99; break;
    case aShift: *pOutPos=98; break;
    default: *pOutPos=(uchar)(c-' '); break;
    }
    ++(*ppOutPos);
}
/* Output c1, c2 in Set C
 */
void A2C128_C(uchar **ppOutPos,uchar c1,uchar c2)
{
    uchar * pOutPos = *ppOutPos;
    switch(c1){
    case aFNC1: *pOutPos=102; break;
    case aCodeB: *pOutPos=100; break;
    case aCodeA: *pOutPos=101; break;
    default: *pOutPos=(char)(10 * (c1- '0') + (c2 - '0'));break;
    }
    (*ppOutPos)++;
}
/* Output a character in Characterset
 */
void ASCIIZ128(uchar **ppOutPos, int CharacterSet,uchar c1, uchar c2)
{
    if (CharacterSet==CodeA)
        A2C128_A(ppOutPos,c1);
    else if(CharacterSet==CodeB)
        A2C128_B(ppOutPos,c1);
    else
        A2C128_C(ppOutPos,c1,c2);
}
/* XLate Table A of Codablock-F Specification and call output
 */
void SumASCII(uchar **ppOutPos, int Sum, int CharacterSet)
{
    switch (CharacterSet){
    case CodeA:
        A2C128_A(ppOutPos, (uchar)Sum);
        break;
    case CodeB:
        if (Sum<=31)







|
















|












|










|







560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
            *pOutPos=(uchar)(c+64);
        break;
    }
    (*ppOutPos)++;
}
/* Output c in Set B
 */
static void A2C128_B(uchar **ppOutPos,uchar c)
{
    uchar * pOutPos = *ppOutPos;
    switch(c){
    case aFNC1: *pOutPos=102; break;
    case aFNC2: *pOutPos=97; break;
    case aFNC3: *pOutPos=96; break;
    case aFNC4: *pOutPos=100; break;
    case aCodeA: *pOutPos=101; break;
    case aCodeC: *pOutPos=99; break;
    case aShift: *pOutPos=98; break;
    default: *pOutPos=(uchar)(c-' '); break;
    }
    ++(*ppOutPos);
}
/* Output c1, c2 in Set C
 */
static void A2C128_C(uchar **ppOutPos,uchar c1,uchar c2)
{
    uchar * pOutPos = *ppOutPos;
    switch(c1){
    case aFNC1: *pOutPos=102; break;
    case aCodeB: *pOutPos=100; break;
    case aCodeA: *pOutPos=101; break;
    default: *pOutPos=(char)(10 * (c1- '0') + (c2 - '0'));break;
    }
    (*ppOutPos)++;
}
/* Output a character in Characterset
 */
static void ASCIIZ128(uchar **ppOutPos, int CharacterSet,uchar c1, uchar c2)
{
    if (CharacterSet==CodeA)
        A2C128_A(ppOutPos,c1);
    else if(CharacterSet==CodeB)
        A2C128_B(ppOutPos,c1);
    else
        A2C128_C(ppOutPos,c1,c2);
}
/* XLate Table A of Codablock-F Specification and call output
 */
static void SumASCII(uchar **ppOutPos, int Sum, int CharacterSet)
{
    switch (CharacterSet){
    case CodeA:
        A2C128_A(ppOutPos, (uchar)Sum);
        break;
    case CodeB:
        if (Sum<=31)
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
            ,(char)(Sum/10+'0') ,(uchar)(Sum%10+'0'));
        break;
    }
}

/* Main function called by zint framework
 */
int codablock(struct zint_symbol *symbol,const unsigned char source[], const size_t length) {
    size_t charCur,dataLength;
    int Error;
    int rows, columns, useColumns;
    int fillings;
    int Sum1,Sum2;
    uchar * pOutPos;
    int rowCur;







|







624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
            ,(char)(Sum/10+'0') ,(uchar)(Sum%10+'0'));
        break;
    }
}

/* Main function called by zint framework
 */
INTERNAL int codablock(struct zint_symbol *symbol,const unsigned char source[], const size_t length) {
    size_t charCur,dataLength;
    int Error;
    int rows, columns, useColumns;
    int fillings;
    int Sum1,Sum2;
    uchar * pOutPos;
    int rowCur;
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
    /* option_2: (usable data) columns: 0: automatic, 6..66 */
    columns = symbol->option_2;
    if ( ! (columns <= 0 || (columns >= 6 && columns <=66)) ) {
        strcpy(symbol->errtxt, "411: Columns parameter not in 0,6..66");
        return ZINT_ERROR_INVALID_OPTION;
    }
    /* GS1 not implemented */
    if  (symbol->input_mode == GS1_MODE) {
        strcpy(symbol->errtxt, "412: GS1 mode not supported");
        return ZINT_ERROR_INVALID_OPTION;
    }
#ifndef _MSC_VER
    unsigned char data[length*2+1];
#else
    data = (unsigned char *) _alloca(length * 2+1);







|







657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
    /* option_2: (usable data) columns: 0: automatic, 6..66 */
    columns = symbol->option_2;
    if ( ! (columns <= 0 || (columns >= 6 && columns <=66)) ) {
        strcpy(symbol->errtxt, "411: Columns parameter not in 0,6..66");
        return ZINT_ERROR_INVALID_OPTION;
    }
    /* GS1 not implemented */
    if  ((symbol->input_mode & 0x07) == GS1_MODE) {
        strcpy(symbol->errtxt, "412: GS1 mode not supported");
        return ZINT_ERROR_INVALID_OPTION;
    }
#ifndef _MSC_VER
    unsigned char data[length*2+1];
#else
    data = (unsigned char *) _alloca(length * 2+1);
1000
1001
1002
1003
1004
1005
1006
1007
1008
    }

    if (symbol->border_width < 2) {
        symbol->border_width = 2;
    }
    return 0;
}









<
<
1001
1002
1003
1004
1005
1006
1007


    }

    if (symbol->border_width < 2) {
        symbol->border_width = 2;
    }
    return 0;
}


Changes to jni/zint/backend/code.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* In version 0.5 this file was 1,553 lines long! */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* In version 0.5 this file was 1,553 lines long! */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
    "112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122",
    "131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221",
    "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131",
    "121221", "312111", "311121", "122211"
};

/* Global Variables for Channel Code */
int S[11], B[11];
long value;
long target_value;
char pattern[30];

/* Function Prototypes */
void NextS(int Chan, int i, int MaxS, int MaxB);
void NextB(int Chan, int i, int MaxB, int MaxS);

/* *********************** CODE 11 ******************** */
int code_11(struct zint_symbol *symbol, unsigned char source[], int length) { /* Code 11 */

    unsigned int i;
    int h, c_digit, c_weight, c_count, k_digit, k_weight, k_count;
    int weight[128], error_number;
    char dest[1024]; /* 6 +  121 * 6 + 2 * 6 + 5 + 1 ~ 1024*/
    char checkstr[3];








|
|
|
|


|
|


|







92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
    "112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122",
    "131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221",
    "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131",
    "121221", "312111", "311121", "122211"
};

/* Global Variables for Channel Code */
static int S[11], B[11];
static long value;
static long target_value;
static char pattern[30];

/* Function Prototypes */
static void NextS(int Chan, int i, int MaxS, int MaxB);
static void NextB(int Chan, int i, int MaxB, int MaxS);

/* *********************** CODE 11 ******************** */
INTERNAL int code_11(struct zint_symbol *symbol, unsigned char source[], int length) { /* Code 11 */

    unsigned int i;
    int h, c_digit, c_weight, c_count, k_digit, k_weight, k_count;
    int weight[128], error_number;
    char dest[1024]; /* 6 +  121 * 6 + 2 * 6 + 5 + 1 ~ 1024*/
    char checkstr[3];

182
183
184
185
186
187
188
189
190
191
192
193
194
195
196

    ustrcpy(symbol->text, source);
    strcat((char*) symbol->text, checkstr);
    return error_number;
}

/* Code 39 */
int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    unsigned int i;
    unsigned int counter;
    int error_number;
    char dest[775];
    char localstr[2] = {0};

    counter = 0;







|







183
184
185
186
187
188
189
190
191
192
193
194
195
196
197

    ustrcpy(symbol->text, source);
    strcat((char*) symbol->text, checkstr);
    return error_number;
}

/* Code 39 */
INTERNAL int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    unsigned int i;
    unsigned int counter;
    int error_number;
    char dest[775];
    char localstr[2] = {0};

    counter = 0;
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
        strcpy((char*) symbol->text, (char*) source);
        strcat((char*) symbol->text, localstr);
    }
    return error_number;
}

/* Pharmazentral Nummer (PZN) */
int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number, zeroes;
    unsigned int count, check_digit;
    char localstr[11];

    count = 0;
    if (length > 7) {







|







287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
        strcpy((char*) symbol->text, (char*) source);
        strcat((char*) symbol->text, localstr);
    }
    return error_number;
}

/* Pharmazentral Nummer (PZN) */
INTERNAL int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number, zeroes;
    unsigned int count, check_digit;
    char localstr[11];

    count = 0;
    if (length > 7) {
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
    error_number = c39(symbol, (unsigned char *) localstr, strlen(localstr));
    ustrcpy(symbol->text, (unsigned char *) "PZN");
    strcat((char*) symbol->text, localstr);
    return error_number;
}

/* Extended Code 39 - ISO/IEC 16388:2007 Annex A */
int ec39(struct zint_symbol *symbol, unsigned char source[], int length) {

    unsigned char buffer[150] = {0};
    unsigned int i;
    int error_number;

    if (length > 74) {
        strcpy(symbol->errtxt, "328: Input too long");







|







331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
    error_number = c39(symbol, (unsigned char *) localstr, strlen(localstr));
    ustrcpy(symbol->text, (unsigned char *) "PZN");
    strcat((char*) symbol->text, localstr);
    return error_number;
}

/* Extended Code 39 - ISO/IEC 16388:2007 Annex A */
INTERNAL int ec39(struct zint_symbol *symbol, unsigned char source[], int length) {

    unsigned char buffer[150] = {0};
    unsigned int i;
    int error_number;

    if (length > 74) {
        strcpy(symbol->errtxt, "328: Input too long");
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
        symbol->text[i] = source[i] ? source[i] : ' ';
    symbol->text[length] = '\0';

    return error_number;
}

/* Code 93 is an advancement on Code 39 and the definition is a lot tighter */
int c93(struct zint_symbol *symbol, unsigned char source[], int length) {

    /* SILVER includes the extra characters a, b, c and d to represent Code 93 specific
       shift characters 1, 2, 3 and 4 respectively. These characters are never used by
       c39() and ec39() */

    int i;
    int h, weight, c, k, values[128], error_number;







|







363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
        symbol->text[i] = source[i] ? source[i] : ' ';
    symbol->text[length] = '\0';

    return error_number;
}

/* Code 93 is an advancement on Code 39 and the definition is a lot tighter */
INTERNAL int c93(struct zint_symbol *symbol, unsigned char source[], int length) {

    /* SILVER includes the extra characters a, b, c and d to represent Code 93 specific
       shift characters 1, 2, 3 and 4 respectively. These characters are never used by
       c39() and ec39() */

    int i;
    int h, weight, c, k, values[128], error_number;
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
   set out in that document:

   "It is the intent and understanding of AIM [t]hat the symbology presented in this
   specification is entirely in the public domain and free of all use restrictions,
   licenses and fees. AIM USA, its member companies, or individual officers
   assume no liability for the use of this document." */

void CheckCharacter() {

    if (value == target_value) {
        int i;
        /* Target reached - save the generated pattern */
        strcpy(pattern, "11110");
        for (i = 0; i < 11; i++) {
            char part[3];
            part[0] = itoc(S[i]);
            part[1] = itoc(B[i]);
            part[2] = '\0';
            strcat(pattern, part);
        }
    }
}

void NextB(int Chan, int i, int MaxB, int MaxS) {
    int b;

    b = (S[i] + B[i - 1] + S[i - 1] + B[i - 2] > 4) ? 1 : 2;
    if (i < Chan + 2) {
        for (; b <= MaxB; b++) {
            B[i] = b;
            NextS(Chan, i + 1, MaxS, MaxB + 1 - b);
        }
    } else if (b <= MaxB) {
        B[i] = MaxB;
        CheckCharacter();
        value++;
    }
}

void NextS(int Chan, int i, int MaxS, int MaxB) {
    int s;

    for (s = (i < Chan + 2) ? 1 : MaxS; s <= MaxS; s++) {
        S[i] = s;
        NextB(Chan, i, MaxB, MaxS + 1 - s);
    }
}

/* Channel Code - According to ANSI/AIM BC12-1998 */
int channel_code(struct zint_symbol *symbol, unsigned char source[], int length) {
    int channels, i;
    int error_number = 0, range = 0, zeroes;
    char hrt[9];

    target_value = 0;

    if (length > 7) {







|















|















|









|







462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
   set out in that document:

   "It is the intent and understanding of AIM [t]hat the symbology presented in this
   specification is entirely in the public domain and free of all use restrictions,
   licenses and fees. AIM USA, its member companies, or individual officers
   assume no liability for the use of this document." */

static void CheckCharacter() {

    if (value == target_value) {
        int i;
        /* Target reached - save the generated pattern */
        strcpy(pattern, "11110");
        for (i = 0; i < 11; i++) {
            char part[3];
            part[0] = itoc(S[i]);
            part[1] = itoc(B[i]);
            part[2] = '\0';
            strcat(pattern, part);
        }
    }
}

static void NextB(int Chan, int i, int MaxB, int MaxS) {
    int b;

    b = (S[i] + B[i - 1] + S[i - 1] + B[i - 2] > 4) ? 1 : 2;
    if (i < Chan + 2) {
        for (; b <= MaxB; b++) {
            B[i] = b;
            NextS(Chan, i + 1, MaxS, MaxB + 1 - b);
        }
    } else if (b <= MaxB) {
        B[i] = MaxB;
        CheckCharacter();
        value++;
    }
}

static void NextS(int Chan, int i, int MaxS, int MaxB) {
    int s;

    for (s = (i < Chan + 2) ? 1 : MaxS; s <= MaxS; s++) {
        S[i] = s;
        NextB(Chan, i, MaxB, MaxS + 1 - s);
    }
}

/* Channel Code - According to ANSI/AIM BC12-1998 */
INTERNAL int channel_code(struct zint_symbol *symbol, unsigned char source[], int length) {
    int channels, i;
    int error_number = 0, range = 0, zeroes;
    char hrt[9];

    target_value = 0;

    if (length > 7) {
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
    expand(symbol, pattern);

    return error_number;
}


/* Vehicle Identification Number (VIN) */
int vin(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) {
    
    /* This code verifies the check digit present in North American VIN codes */
    
    int zeros;
    char local_source[18];
    char dest[200];
    char input_check;







|







593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
    expand(symbol, pattern);

    return error_number;
}


/* Vehicle Identification Number (VIN) */
INTERNAL int vin(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) {
    
    /* This code verifies the check digit present in North American VIN codes */
    
    int zeros;
    char local_source[18];
    char dest[200];
    char input_check;
688
689
690
691
692
693
694
695
    strcat(dest, "121121211");
    
    ustrcpy(symbol->text, (unsigned char *) local_source);
    expand(symbol, dest);
    
    return 0;
}








<
689
690
691
692
693
694
695

    strcat(dest, "121121211");
    
    ustrcpy(symbol->text, (unsigned char *) local_source);
    expand(symbol, dest);
    
    return 0;
}

Changes to jni/zint/backend/code1.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include "common.h"
#include "code1.h"
#include "reedsol.h"
#include "large.h"
#include <stdio.h>
#include <string.h>
#include <math.h>

void horiz(struct zint_symbol *symbol, int row_no, int full) {
    int i;

    if (full) {
        for (i = 0; i < symbol->width; i++) {
            set_module(symbol, row_no, i);
        }
    } else {
        for (i = 1; i < symbol->width - 1; i++) {
            set_module(symbol, row_no, i);
        }
    }
}

void central_finder(struct zint_symbol *symbol, int start_row, int row_count, int full_rows) {
    int i;

    for (i = 0; i < row_count; i++) {
        if (i < full_rows) {
            horiz(symbol, start_row + (i * 2), 1);
        } else {
            horiz(symbol, start_row + (i * 2), 0);
            if (i != row_count - 1) {
                set_module(symbol, start_row + (i * 2) + 1, 1);
                set_module(symbol, start_row + (i * 2) + 1, symbol->width - 2);
            }
        }
    }
}

void vert(struct zint_symbol *symbol, int column, int height, int top) {
    int i;

    if (top) {
        for (i = 0; i < height; i++) {
            set_module(symbol, i, column);
        }
    } else {
        for (i = 0; i < height; i++) {
            set_module(symbol, symbol->rows - i - 1, column);
        }
    }
}

void spigot(struct zint_symbol *symbol, int row_no) {
    int i;

    for (i = symbol->width - 1; i > 0; i--) {
        if (module_is_set(symbol, row_no, i - 1)) {
            set_module(symbol, row_no, i);
        }
    }
}

int isedi(unsigned char input) {
    int result = 0;

    if (input == 13) {
        result = 1;
    }
    if (input == '*') {
        result = 1;







>









|













|















|













|









|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "common.h"
#include "code1.h"
#include "reedsol.h"
#include "large.h"
#include <stdio.h>
#include <string.h>
#include <math.h>

static void horiz(struct zint_symbol *symbol, int row_no, int full) {
    int i;

    if (full) {
        for (i = 0; i < symbol->width; i++) {
            set_module(symbol, row_no, i);
        }
    } else {
        for (i = 1; i < symbol->width - 1; i++) {
            set_module(symbol, row_no, i);
        }
    }
}

static void central_finder(struct zint_symbol *symbol, int start_row, int row_count, int full_rows) {
    int i;

    for (i = 0; i < row_count; i++) {
        if (i < full_rows) {
            horiz(symbol, start_row + (i * 2), 1);
        } else {
            horiz(symbol, start_row + (i * 2), 0);
            if (i != row_count - 1) {
                set_module(symbol, start_row + (i * 2) + 1, 1);
                set_module(symbol, start_row + (i * 2) + 1, symbol->width - 2);
            }
        }
    }
}

static void vert(struct zint_symbol *symbol, int column, int height, int top) {
    int i;

    if (top) {
        for (i = 0; i < height; i++) {
            set_module(symbol, i, column);
        }
    } else {
        for (i = 0; i < height; i++) {
            set_module(symbol, symbol->rows - i - 1, column);
        }
    }
}

static void spigot(struct zint_symbol *symbol, int row_no) {
    int i;

    for (i = symbol->width - 1; i > 0; i--) {
        if (module_is_set(symbol, row_no, i - 1)) {
            set_module(symbol, row_no, i);
        }
    }
}

static int isedi(unsigned char input) {
    int result = 0;

    if (input == 13) {
        result = 1;
    }
    if (input == '*') {
        result = 1;
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
    if ((input >= 'A') && (input <= 'Z')) {
        result = 1;
    }

    return result;
}

int dq4bi(unsigned char source[], int sourcelen, int position) {
    int i;

    for (i = position; isedi(source[position + i]) && ((position + i) < sourcelen); i++);

    if ((position + i) == sourcelen) {
        /* Reached end of input */
        return 0;







|







114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
    if ((input >= 'A') && (input <= 'Z')) {
        result = 1;
    }

    return result;
}

static int dq4bi(unsigned char source[], int sourcelen, int position) {
    int i;

    for (i = position; isedi(source[position + i]) && ((position + i) < sourcelen); i++);

    if ((position + i) == sourcelen) {
        /* Reached end of input */
        return 0;
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
            best_scheme = C1_BYTE;
        }
    }

    return best_scheme;
}

int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int target[], int length) {
    int current_mode, next_mode;
    int sp, tp, gs1, i, j, p, latch;
    int c40_buffer[6], c40_p;
    int text_buffer[6], text_p;
    int edi_buffer[6], edi_p;
    char decimal_binary[40];
    int byte_start = 0;

    sp = 0;
    tp = 0;
    latch = 0;
    memset(c40_buffer, 0, sizeof(*c40_buffer));
    c40_p = 0;
    memset(text_buffer, 0, sizeof(*text_buffer));
    text_p = 0;
    memset(edi_buffer, 0, sizeof(*edi_buffer));
    edi_p = 0;
    strcpy(decimal_binary, "");

    if (symbol->input_mode == GS1_MODE) {
        gs1 = 1;
    } else {
        gs1 = 0;
    }
    if (gs1) {
        /* FNC1 */
        target[tp] = 232;







|



















|







346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
            best_scheme = C1_BYTE;
        }
    }

    return best_scheme;
}

static int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int target[], int length) {
    int current_mode, next_mode;
    int sp, tp, gs1, i, j, p, latch;
    int c40_buffer[6], c40_p;
    int text_buffer[6], text_p;
    int edi_buffer[6], edi_p;
    char decimal_binary[40];
    int byte_start = 0;

    sp = 0;
    tp = 0;
    latch = 0;
    memset(c40_buffer, 0, sizeof(*c40_buffer));
    c40_p = 0;
    memset(text_buffer, 0, sizeof(*text_buffer));
    text_p = 0;
    memset(edi_buffer, 0, sizeof(*edi_buffer));
    edi_p = 0;
    strcpy(decimal_binary, "");

    if ((symbol->input_mode & 0x07) == GS1_MODE) {
        gs1 = 1;
    } else {
        gs1 = 0;
    }
    if (gs1) {
        /* FNC1 */
        target[tp] = 232;
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
            printf("[%d]", target[i]);
    }
    printf("\n");
     */
    return tp;
}

void block_copy(struct zint_symbol *symbol, char grid[][120], int start_row, int start_col, int height, int width, int row_offset, int col_offset) {
    int i, j;

    for (i = start_row; i < (start_row + height); i++) {
        for (j = start_col; j < (start_col + width); j++) {
            if (grid[i][j] == '1') {
                set_module(symbol, i + row_offset, j + col_offset);
            }
        }
    }
}

int code_one(struct zint_symbol *symbol, unsigned char source[], int length) {
    int size = 1, i, j;

    char datagrid[136][120];
    int row, col;
    int sub_version = 0;

    if ((symbol->option_2 < 0) || (symbol->option_2 > 10)) {







|











|







1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
            printf("[%d]", target[i]);
    }
    printf("\n");
     */
    return tp;
}

static void block_copy(struct zint_symbol *symbol, char grid[][120], int start_row, int start_col, int height, int width, int row_offset, int col_offset) {
    int i, j;

    for (i = start_row; i < (start_row + height); i++) {
        for (j = start_col; j < (start_col + width); j++) {
            if (grid[i][j] == '1') {
                set_module(symbol, i + row_offset, j + col_offset);
            }
        }
    }
}

INTERNAL int code_one(struct zint_symbol *symbol, unsigned char source[], int length) {
    int size = 1, i, j;

    char datagrid[136][120];
    int row, col;
    int sub_version = 0;

    if ((symbol->option_2 < 0) || (symbol->option_2 > 10)) {
1765
1766
1767
1768
1769
1770
1771
1772
1773

    for (i = 0; i < symbol->rows; i++) {
        symbol->row_height[i] = 1;
    }

    return 0;
}









<
<
1766
1767
1768
1769
1770
1771
1772



    for (i = 0; i < symbol->rows; i++) {
        symbol->row_height[i] = 1;
    }

    return 0;
}


Changes to jni/zint/backend/code128.c.
1
2
3
4
5
6
7
8
9
10
11
12
/* code128.c - Handles Code 128 and derivatives */

/*
    libzint - the open source barcode library
    Copyright (C) 2008-2017 Robin Stuart <rstuart114@gmail.com>
    Bugfixes thanks to Christian Sakowski and BogDan Vatra

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright




|







1
2
3
4
5
6
7
8
9
10
11
12
/* code128.c - Handles Code 128 and derivatives */

/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>
    Bugfixes thanks to Christian Sakowski and BogDan Vatra

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
26
27
28
29
30
31
32

33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif







>







26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
    "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112",
    "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311",
    "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232",
    "2331112"
};

/* Determine appropriate mode for a given character */
int parunmodd(const unsigned char llyth) {
    int modd;
    modd = 0;

    if (llyth <= 31) {
        modd = SHIFTA;
    } else if ((llyth >= 48) && (llyth <= 57)) {
        modd = ABORC;







|







72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
    "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112",
    "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311",
    "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232",
    "2331112"
};

/* Determine appropriate mode for a given character */
INTERNAL int parunmodd(const unsigned char llyth) {
    int modd;
    modd = 0;

    if (llyth <= 31) {
        modd = SHIFTA;
    } else if ((llyth >= 48) && (llyth <= 57)) {
        modd = ABORC;
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

    return modd;
}

/**
 * bring together same type blocks
 */
void grwp(int *indexliste) {

    /* bring together same type blocks */
    if (*(indexliste) > 1) {
        int i = 1;
        while (i < *(indexliste)) {
            if (list[1][i - 1] == list[1][i]) {
                int j;







|







98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

    return modd;
}

/**
 * bring together same type blocks
 */
static void grwp(int *indexliste) {

    /* bring together same type blocks */
    if (*(indexliste) > 1) {
        int i = 1;
        while (i < *(indexliste)) {
            if (list[1][i - 1] == list[1][i]) {
                int j;
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
        }
    }
}

/**
 * Implements rules from ISO 15417 Annex E
 */
void dxsmooth(int *indexliste) {
    int i, last, next;

    for (i = 0; i < *(indexliste); i++) {
        int current = list[1][i];
        int length = list[0][i];
        if (i != 0) {
            last = list[1][i - 1];







|







127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
        }
    }
}

/**
 * Implements rules from ISO 15417 Annex E
 */
static void dxsmooth(int *indexliste) {
    int i, last, next;

    for (i = 0; i < *(indexliste); i++) {
        int current = list[1][i];
        int length = list[0][i];
        if (i != 0) {
            last = list[1][i - 1];
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250

}

/**
 * Translate Code 128 Set A characters into barcodes.
 * This set handles all control characters NULL to US.
 */
void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) {

    if (source > 127) {
        if (source < 160) {
            strcat(dest, C128Table[(source - 128) + 64]);
            values[(*bar_chars)] = (source - 128) + 64;
        } else {
            strcat(dest, C128Table[(source - 128) - 32]);







|







237
238
239
240
241
242
243
244
245
246
247
248
249
250
251

}

/**
 * Translate Code 128 Set A characters into barcodes.
 * This set handles all control characters NULL to US.
 */
static void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) {

    if (source > 127) {
        if (source < 160) {
            strcat(dest, C128Table[(source - 128) + 64]);
            values[(*bar_chars)] = (source - 128) + 64;
        } else {
            strcat(dest, C128Table[(source - 128) - 32]);
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
}

/**
 * Translate Code 128 Set B characters into barcodes.
 * This set handles all characters which are not part of long numbers and not
 * control characters.
 */
void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars) {
    if (source > 127) {
        strcat(dest, C128Table[source - 32 - 128]);
        values[(*bar_chars)] = source - 32 - 128;
    } else {
        strcat(dest, C128Table[source - 32]);
        values[(*bar_chars)] = source - 32;
    }
    (*bar_chars)++;
}

/* Translate Code 128 Set C characters into barcodes
 * This set handles numbers in a compressed form
 */
void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars) {
    int weight;

    weight = (10 * ctoi(source_a)) + ctoi(source_b);
    strcat(dest, C128Table[weight]);
    values[(*bar_chars)] = weight;
    (*bar_chars)++;
}

/* Handle Code 128 and NVE-18 */
int code_128(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    int i, j, k, values[170] = {0}, bar_characters, read, total_sum;
    int error_number, indexchaine, indexliste, f_state;
    size_t sourcelen;
    char set[170] = {' '}, fset[170] = {' '}, mode, last_set, current_set = ' ';
    float glyph_count;
    char dest[1000];








|













|









|







264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
}

/**
 * Translate Code 128 Set B characters into barcodes.
 * This set handles all characters which are not part of long numbers and not
 * control characters.
 */
static void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars) {
    if (source > 127) {
        strcat(dest, C128Table[source - 32 - 128]);
        values[(*bar_chars)] = source - 32 - 128;
    } else {
        strcat(dest, C128Table[source - 32]);
        values[(*bar_chars)] = source - 32;
    }
    (*bar_chars)++;
}

/* Translate Code 128 Set C characters into barcodes
 * This set handles numbers in a compressed form
 */
static void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars) {
    int weight;

    weight = (10 * ctoi(source_a)) + ctoi(source_b);
    strcat(dest, C128Table[weight]);
    values[(*bar_chars)] = weight;
    (*bar_chars)++;
}

/* Handle Code 128 and NVE-18 */
INTERNAL int code_128(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    int i, j, k, values[170] = {0}, bar_characters, read, total_sum;
    int error_number, indexchaine, indexliste, f_state;
    size_t sourcelen;
    char set[170] = {' '}, fset[170] = {' '}, mode, last_set, current_set = ' ';
    float glyph_count;
    char dest[1000];

678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
    /* Stop character */
    strcat(dest, C128Table[106]);
    expand(symbol, dest);
    return error_number;
}

/* Handle EAN-128 (Now known as GS1-128) */
int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    int i, j, values[170], bar_characters, read, total_sum;
    int error_number, indexchaine, indexliste;
    char set[170], mode, last_set;
    float glyph_count;
    char dest[1000];
    int separator_row, linkage_flag, c_count;
#ifndef _MSC_VER







|







679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
    /* Stop character */
    strcat(dest, C128Table[106]);
    expand(symbol, dest);
    return error_number;
}

/* Handle EAN-128 (Now known as GS1-128) */
INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    int i, j, values[170], bar_characters, read, total_sum;
    int error_number, indexchaine, indexliste;
    char set[170], mode, last_set;
    float glyph_count;
    char dest[1000];
    int separator_row, linkage_flag, c_count;
#ifndef _MSC_VER
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741

    if (length > 160) {
        /* This only blocks rediculously long input - the actual length of the
        resulting barcode depends on the type of data, so this is trapped later */
        strcpy(symbol->errtxt, "342: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }
    for (i = 0; i < length; i++) {
        if (source[i] == '\0') {
            /* Null characters not allowed! */
            strcpy(symbol->errtxt, "343: NULL character in input data");
            return ZINT_ERROR_INVALID_DATA;
        }
    }

    /* if part of a composite symbol make room for the separator pattern */
    if (symbol->symbology == BARCODE_EAN128_CC) {
        separator_row = symbol->rows;
        symbol->row_height[symbol->rows] = 1;
        symbol->rows += 1;
    }

    if (symbol->input_mode != GS1_MODE) {
        /* GS1 data has not been checked yet */
        error_number = gs1_verify(symbol, source, length, reduced);
        if (error_number != 0) {
            return error_number;
        }
    }

    /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */
    indexliste = 0;
    indexchaine = 0;

    mode = parunmodd(reduced[indexchaine]);







<
<
<
<
<
<
<








<
<
|
|
|
<







708
709
710
711
712
713
714







715
716
717
718
719
720
721
722


723
724
725

726
727
728
729
730
731
732

    if (length > 160) {
        /* This only blocks rediculously long input - the actual length of the
        resulting barcode depends on the type of data, so this is trapped later */
        strcpy(symbol->errtxt, "342: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }








    /* if part of a composite symbol make room for the separator pattern */
    if (symbol->symbology == BARCODE_EAN128_CC) {
        separator_row = symbol->rows;
        symbol->row_height[symbol->rows] = 1;
        symbol->rows += 1;
    }



    error_number = gs1_verify(symbol, source, length, reduced);
    if (error_number != 0) {
        return error_number;

    }

    /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */
    indexliste = 0;
    indexchaine = 0;

    mode = parunmodd(reduced[indexchaine]);
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
        }
    }

    return error_number;
}

/* Add check digit if encoding an NVE18 symbol */
int nve_18(struct zint_symbol *symbol, unsigned char source[], int length) {
    int error_number, zeroes, i, nve_check, total_sum, sourcelen;
    unsigned char ean128_equiv[25];

    memset(ean128_equiv, 0, 25);
    sourcelen = length;

    if (sourcelen > 17) {







|







990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
        }
    }

    return error_number;
}

/* Add check digit if encoding an NVE18 symbol */
INTERNAL int nve_18(struct zint_symbol *symbol, unsigned char source[], int length) {
    int error_number, zeroes, i, nve_check, total_sum, sourcelen;
    unsigned char ean128_equiv[25];

    memset(ean128_equiv, 0, 25);
    sourcelen = length;

    if (sourcelen > 17) {
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056

    error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));

    return error_number;
}

/* EAN-14 - A version of EAN-128 */
int ean_14(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, count, check_digit;
    int error_number, zeroes;
    unsigned char ean128_equiv[20];

    if (length > 13) {
        strcpy(symbol->errtxt, "347: Input wrong length");
        return ZINT_ERROR_TOO_LONG;







|







1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047

    error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));

    return error_number;
}

/* EAN-14 - A version of EAN-128 */
INTERNAL int ean_14(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, count, check_digit;
    int error_number, zeroes;
    unsigned char ean128_equiv[20];

    if (length > 13) {
        strcpy(symbol->errtxt, "347: Input wrong length");
        return ZINT_ERROR_TOO_LONG;
1082
1083
1084
1085
1086
1087
1088
1089
1090
    ean128_equiv[17] = itoc(check_digit);
    ean128_equiv[18] = '\0';

    error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));

    return error_number;
}









<
<
1073
1074
1075
1076
1077
1078
1079


    ean128_equiv[17] = itoc(check_digit);
    ean128_equiv[18] = '\0';

    error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv));

    return error_number;
}


Changes to jni/zint/backend/code16k.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* Updated to comply with BS EN 12323:2005 */

/* Code 16k can hold up to 77 characters or 154 numbers */

#include <string.h>
#include <stdio.h>







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* Updated to comply with BS EN 12323:2005 */

/* Code 16k can hold up to 77 characters or 154 numbers */

#include <string.h>
#include <stdio.h>
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#define SHIFTC 94
#define LATCHC 95
#define AORB 96
#define ABORC 97
#define CANDB 98
#define CANDBB 99

extern int parunmodd(const unsigned char llyth);

static int list[2][170];

static const char *C16KTable[107] = {
    /* EN 12323 Table 1 - "Code 16K" character encodations */
    "212222", "222122", "222221", "121223", "121322", "131222", "122213",
    "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222",







|







49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#define SHIFTC 94
#define LATCHC 95
#define AORB 96
#define ABORC 97
#define CANDB 98
#define CANDBB 99

INTERNAL int parunmodd(const unsigned char llyth);

static int list[2][170];

static const char *C16KTable[107] = {
    /* EN 12323 Table 1 - "Code 16K" character encodations */
    "212222", "222122", "222221", "121223", "121322", "131222", "122213",
    "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222",
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
    int weight;

    weight = (10 * ctoi(source_a)) + ctoi(source_b);
    values[(*bar_chars)] = weight;
    (*bar_chars)++;
}

int code16k(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    char width_pattern[100];
    int current_row, rows_needed, looper, first_check, second_check;
    int indexchaine, f_state;
    char set[160] = {' '}, fset[160] = {' '}, mode, last_set, current_set;
    unsigned int pads_needed, indexliste, i, j, k, m, read, mx_reader;
    unsigned int values[160] = {0};
    unsigned int bar_characters;
    float glyph_count;
    int errornum, first_sum, second_sum;
    size_t input_length;
    int gs1, c_count;

    errornum = 0;
    strcpy(width_pattern, "");
    input_length = length;

    if (symbol->input_mode == GS1_MODE) {
        gs1 = 1;
    } else {
        gs1 = 0;
    }

    if (input_length > 157) {
        strcpy(symbol->errtxt, "420: Input too long");







|
















|







253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
    int weight;

    weight = (10 * ctoi(source_a)) + ctoi(source_b);
    values[(*bar_chars)] = weight;
    (*bar_chars)++;
}

INTERNAL int code16k(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    char width_pattern[100];
    int current_row, rows_needed, looper, first_check, second_check;
    int indexchaine, f_state;
    char set[160] = {' '}, fset[160] = {' '}, mode, last_set, current_set;
    unsigned int pads_needed, indexliste, i, j, k, m, read, mx_reader;
    unsigned int values[160] = {0};
    unsigned int bar_characters;
    float glyph_count;
    int errornum, first_sum, second_sum;
    size_t input_length;
    int gs1, c_count;

    errornum = 0;
    strcpy(width_pattern, "");
    input_length = length;

    if ((symbol->input_mode & 0x07) == GS1_MODE) {
        gs1 = 1;
    } else {
        gs1 = 0;
    }

    if (input_length > 157) {
        strcpy(symbol->errtxt, "420: Input too long");
727
728
729
730
731
732
733
734
735
736
        symbol->row_height[current_row] = 10;
    }

    symbol->rows = rows_needed;
    symbol->width = 70;
    return errornum;
}










<
<
<
728
729
730
731
732
733
734



        symbol->row_height[current_row] = 10;
    }

    symbol->rows = rows_needed;
    symbol->width = 70;
    return errornum;
}



Changes to jni/zint/backend/code49.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#include "code49.h"

#define INSET	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%!&*"

/* "!" represents Shift 1 and "&" represents Shift 2, "*" represents FNC1 */

int code_49(struct zint_symbol *symbol, unsigned char source[], const int length) {
    int i, j, rows, M, x_count, y_count, z_count, posn_val, local_value;
    char intermediate[170] = "";
    int codewords[170], codeword_count;
    int c_grid[8][8]; /* Refers to table 3 */
    int w_grid[8][4]; /* Refets to table 2 */
    int pad_count = 0;
    char pattern[80];
    int gs1;
    size_t h;

    if (length > 81) {
        strcpy(symbol->errtxt, "430: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }
    if (symbol->input_mode == GS1_MODE) {
        gs1 = 1;
        strcpy(intermediate, "*"); /* FNC1 */
    } else {
        gs1 = 0;
    }

    for (i = 0; i < length; i++) {







>











|














|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#include "code49.h"

#define INSET	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%!&*"

/* "!" represents Shift 1 and "&" represents Shift 2, "*" represents FNC1 */

INTERNAL int code_49(struct zint_symbol *symbol, unsigned char source[], const int length) {
    int i, j, rows, M, x_count, y_count, z_count, posn_val, local_value;
    char intermediate[170] = "";
    int codewords[170], codeword_count;
    int c_grid[8][8]; /* Refers to table 3 */
    int w_grid[8][4]; /* Refets to table 2 */
    int pad_count = 0;
    char pattern[80];
    int gs1;
    size_t h;

    if (length > 81) {
        strcpy(symbol->errtxt, "430: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }
    if ((symbol->input_mode & 0x07) == GS1_MODE) {
        gs1 = 1;
        strcpy(intermediate, "*"); /* FNC1 */
    } else {
        gs1 = 0;
    }

    for (i = 0; i < length; i++) {
339
340
341
342
343
344
345
346
    if (!(symbol->output_options & BARCODE_BIND)) {
        symbol->output_options += BARCODE_BIND;
    }
    symbol->border_width = 2;

    return 0;
}








<
340
341
342
343
344
345
346

    if (!(symbol->output_options & BARCODE_BIND)) {
        symbol->output_options += BARCODE_BIND;
    }
    symbol->border_width = 2;

    return 0;
}

Changes to jni/zint/backend/common.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52



53





54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133












134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"

/* Local replacement for strlen() with unsigned char strings */
size_t ustrlen(const unsigned char data[]) {
    return strlen((const char*) data);
}

/* Converts a character 0-9 to its equivalent integer value */
int ctoi(const char source) {
    if ((source >= '0') && (source <= '9'))
        return (source - '0');
    if ((source >= 'A') && (source <= 'F'))
        return (source - 'A' + 10);
    if ((source >= 'a') && (source <= 'f'))
        return (source - 'a' + 10);
    return -1;
}










/* Convert an integer value to a string representing its binary equivalent */
void bin_append(const int arg, const int length, char *binary) {
    int i;
    int start;
    size_t posn = strlen(binary);

    start = 0x01 << (length - 1);

    for (i = 0; i < length; i++) {
        binary[posn + i] = '0';
        if (arg & (start >> i)) {
            binary[posn + i] = '1';
        }
    }
    binary[posn + length] = '\0';

    return;
}

/* Converts an integer value to its hexadecimal character */
char itoc(const int source) {
    if ((source >= 0) && (source <= 9)) {
        return ('0' + source);
    } else {
        return ('A' + (source - 10));
    }
}

/* Converts lower case characters to upper case in a string source[] */
void to_upper(unsigned char source[]) {
    size_t i, src_len = ustrlen(source);

    for (i = 0; i < src_len; i++) {
        if ((source[i] >= 'a') && (source[i] <= 'z')) {
            source [i] = (source[i] - 'a') + 'A';
        }
    }
}

/* Verifies that a string only uses valid characters */
int is_sane(const char test_string[], const unsigned char source[], const size_t length) {
    unsigned int j;
    size_t i, lt = strlen(test_string);

    for (i = 0; i < length; i++) {
        unsigned int latch = FALSE;
        for (j = 0; j < lt; j++) {
            if (source[i] == test_string[j]) {
                latch = TRUE;
                break;
            }
        }
        if (!(latch)) {
            return ZINT_ERROR_INVALID_DATA;
        }
    }

    return 0;
}

/* Replaces huge switch statements for looking up in tables */
void lookup(const char set_string[], const char *table[], const char data, char dest[]) {
    size_t i, n = strlen(set_string);

    for (i = 0; i < n; i++) {
        if (data == set_string[i]) {
            strcat(dest, table[i]);
        }
    }
}

/* Returns the position of data in set_string */
int posn(const char set_string[], const char data) {
    int i, n = (int)strlen(set_string);

    for (i = 0; i < n; i++) {
        if (data == set_string[i]) {
         return i;
        }
    }
   return -1;












}

/* Return true (1) if a module is dark/black, otherwise false (0) */
int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord) {
    return (symbol->encoded_data[y_coord][x_coord / 7] >> (x_coord % 7)) & 1;
}

/* Set a module to dark/black */
void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord) {
    symbol->encoded_data[y_coord][x_coord / 7] |= 1 << (x_coord % 7);
}

/* Set (or unset) a module to white */
void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord) {
    symbol->encoded_data[y_coord][x_coord / 7] &= ~(1 << (x_coord % 7));
}

/* Expands from a width pattern to a bit pattern */
void expand(struct zint_symbol *symbol, const char data[]) {

    size_t reader, n = strlen(data);
    int writer, i;
    char latch;

    writer = 0;
    latch = '1';







>


<



|




|









>
>
>

>
>
>
>
>
|
|


<









<
<
<



|






>

|










|




















|










|




|


|
>
>
>
>
>
>
>
>
>
>
>
>



|




|




|




|







25
26
27
28
29
30
31
32
33
34

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

66
67
68
69
70
71
72
73
74



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */
#include <string.h>
#include <stdio.h>

#include "common.h"

/* Local replacement for strlen() with unsigned char strings */
INTERNAL size_t ustrlen(const unsigned char data[]) {
    return strlen((const char*) data);
}

/* Converts a character 0-9 to its equivalent integer value */
INTERNAL int ctoi(const char source) {
    if ((source >= '0') && (source <= '9'))
        return (source - '0');
    if ((source >= 'A') && (source <= 'F'))
        return (source - 'A' + 10);
    if ((source >= 'a') && (source <= 'f'))
        return (source - 'a' + 10);
    return -1;
}

/* Convert an integer value to a string representing its binary equivalent */
INTERNAL void bin_append(const int arg, const int length, char *binary) {
    size_t posn = strlen(binary);

    bin_append_posn(arg, length, binary, posn);

    binary[posn + length] = '\0';
}

/* Convert an integer value to a string representing its binary equivalent at a set position */
INTERNAL void bin_append_posn(const int arg, const int length, char *binary, size_t posn) {
    int i;
    int start;


    start = 0x01 << (length - 1);

    for (i = 0; i < length; i++) {
        binary[posn + i] = '0';
        if (arg & (start >> i)) {
            binary[posn + i] = '1';
        }
    }



}

/* Converts an integer value to its hexadecimal character */
INTERNAL char itoc(const int source) {
    if ((source >= 0) && (source <= 9)) {
        return ('0' + source);
    } else {
        return ('A' + (source - 10));
    }
}

/* Converts lower case characters to upper case in a string source[] */
INTERNAL void to_upper(unsigned char source[]) {
    size_t i, src_len = ustrlen(source);

    for (i = 0; i < src_len; i++) {
        if ((source[i] >= 'a') && (source[i] <= 'z')) {
            source [i] = (source[i] - 'a') + 'A';
        }
    }
}

/* Verifies that a string only uses valid characters */
INTERNAL int is_sane(const char test_string[], const unsigned char source[], const size_t length) {
    unsigned int j;
    size_t i, lt = strlen(test_string);

    for (i = 0; i < length; i++) {
        unsigned int latch = FALSE;
        for (j = 0; j < lt; j++) {
            if (source[i] == test_string[j]) {
                latch = TRUE;
                break;
            }
        }
        if (!(latch)) {
            return ZINT_ERROR_INVALID_DATA;
        }
    }

    return 0;
}

/* Replaces huge switch statements for looking up in tables */
INTERNAL void lookup(const char set_string[], const char *table[], const char data, char dest[]) {
    size_t i, n = strlen(set_string);

    for (i = 0; i < n; i++) {
        if (data == set_string[i]) {
            strcat(dest, table[i]);
        }
    }
}

/* Returns the position of data in set_string */
INTERNAL int posn(const char set_string[], const char data) {
    int i, n = (int)strlen(set_string);

    for (i = 0; i < n; i++) {
        if (data == set_string[i]) {
            return i;
        }
    }
    return -1;
}

/* Returns the number of times a character occurs in a string */
INTERNAL int ustrchr_cnt(const unsigned char string[], const size_t length, const unsigned char c) {
    int count = 0;
    int i;
    for (i = 0; i < length; i++) {
        if (string[i] == c) {
            count++;
        }
    }
    return count;
}

/* Return true (1) if a module is dark/black, otherwise false (0) */
INTERNAL int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord) {
    return (symbol->encoded_data[y_coord][x_coord / 7] >> (x_coord % 7)) & 1;
}

/* Set a module to dark/black */
INTERNAL void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord) {
    symbol->encoded_data[y_coord][x_coord / 7] |= 1 << (x_coord % 7);
}

/* Set (or unset) a module to white */
INTERNAL void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord) {
    symbol->encoded_data[y_coord][x_coord / 7] &= ~(1 << (x_coord % 7));
}

/* Expands from a width pattern to a bit pattern */
INTERNAL void expand(struct zint_symbol *symbol, const char data[]) {

    size_t reader, n = strlen(data);
    int writer, i;
    char latch;

    writer = 0;
    latch = '1';
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
            symbol->width = writer - 2;
        }
    }
    symbol->rows = symbol->rows + 1;
}

/* Indicates which symbologies can have row binding */
int is_stackable(const int symbology) {
    if (symbology < BARCODE_PDF417) {
        return 1;
    }

    switch (symbology) {
        case BARCODE_CODE128B:
        case BARCODE_ISBNX:







|







196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
            symbol->width = writer - 2;
        }
    }
    symbol->rows = symbol->rows + 1;
}

/* Indicates which symbologies can have row binding */
INTERNAL int is_stackable(const int symbology) {
    if (symbology < BARCODE_PDF417) {
        return 1;
    }

    switch (symbology) {
        case BARCODE_CODE128B:
        case BARCODE_ISBNX:
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234





235
236
237
238
239
240
241
242
243
244















































245
246
247
248
249
250
251
252
253
254

255
256
257
258
259
260
261
262
263
264
265
266

267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
            return 1;
    }

    return 0;
}

/* Indicates which symbols can have addon (EAN-2 and EAN-5) */
int is_extendable(const int symbology) {
    if (symbology == BARCODE_EANX) {
        return 1;
    }
    if (symbology == BARCODE_UPCA) {
        return 1;
    }
    if (symbology == BARCODE_UPCE) {
        return 1;
    }
    if (symbology == BARCODE_ISBNX) {
        return 1;
    }
    if (symbology == BARCODE_UPCA_CC) {
        return 1;
    }
    if (symbology == BARCODE_UPCE_CC) {
        return 1;
    }
    if (symbology == BARCODE_EANX_CC) {
        return 1;
    }

    return 0;
}






int istwodigits(const unsigned char source[], const size_t position) {
    if ((source[position] >= '0') && (source[position] <= '9')) {
        if ((source[position + 1] >= '0') && (source[position + 1] <= '9')) {
            return 1;
        }
    }

    return 0;
}
















































int utf8toutf16(struct zint_symbol *symbol, const unsigned char source[], int vals[], size_t *length) {
    size_t bpos;
    int    jpos, error_number;
    int next;

    bpos = 0;
    jpos = 0;
    error_number = 0;
    next = 0;


    do {
        if (source[bpos] <= 0x7f) {
            /* 1 byte mode (7-bit ASCII) */
            vals[jpos] = source[bpos];
            next = bpos + 1;
            jpos++;
        } else {
            if ((source[bpos] >= 0x80) && (source[bpos] <= 0xbf)) {
                strcpy(symbol->errtxt, "240: Corrupt Unicode data");
                return ZINT_ERROR_INVALID_DATA;
            }
            if ((source[bpos] >= 0xc0) && (source[bpos] <= 0xc1)) {

                strcpy(symbol->errtxt, "241: Overlong encoding not supported");
                return ZINT_ERROR_INVALID_DATA;
            }

            if ((source[bpos] >= 0xc2) && (source[bpos] <= 0xdf)) {
                /* 2 byte mode */
                vals[jpos] = ((source[bpos] & 0x1f) << 6) + (source[bpos + 1] & 0x3f);
                next = bpos + 2;
                jpos++;
            } else
                if ((source[bpos] >= 0xe0) && (source[bpos] <= 0xef)) {
                /* 3 byte mode */
                vals[jpos] = ((source[bpos] & 0x0f) << 12) + ((source[bpos + 1] & 0x3f) << 6) + (source[bpos + 2] & 0x3f);
                next = bpos + 3;
                jpos++;
            } else
                if (source[bpos] >= 0xf0) {
                strcpy(symbol->errtxt, "242: Unicode sequences of more than 3 bytes not supported");
                return ZINT_ERROR_INVALID_DATA;
            }
        }

        bpos = next;

    } while (bpos < *length);
    *length = jpos;

    return error_number;
}


void set_minimum_height(struct zint_symbol *symbol, const int min_height) {
    /* Enforce minimum permissable height of rows */
    int fixed_height = 0;
    int zero_count = 0;
    int i;

    for (i = 0; i < symbol->rows; i++) {
        fixed_height += symbol->row_height[i];








|
|


|


|


















>
>
>
>
>
|









>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

|
|



<
<

>
|
|
<
<
|
|
|
<
|
|
|
<
>
|
|
|

<
<
|
<
|
<
<
<
<
<
<
<
<
<
<
|
|
<
<
<
<


|


|
|
<







219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320


321
322
323
324


325
326
327

328
329
330

331
332
333
334
335


336

337










338
339




340
341
342
343
344
345
346

347
348
349
350
351
352
353
            return 1;
    }

    return 0;
}

/* Indicates which symbols can have addon (EAN-2 and EAN-5) */
INTERNAL int is_extendable(const int symbology) {
    if (symbology == BARCODE_EANX || symbology == BARCODE_EANX_CHK) {
        return 1;
    }
    if (symbology == BARCODE_UPCA || symbology == BARCODE_UPCA_CHK) {
        return 1;
    }
    if (symbology == BARCODE_UPCE || symbology == BARCODE_UPCE_CHK) {
        return 1;
    }
    if (symbology == BARCODE_ISBNX) {
        return 1;
    }
    if (symbology == BARCODE_UPCA_CC) {
        return 1;
    }
    if (symbology == BARCODE_UPCE_CC) {
        return 1;
    }
    if (symbology == BARCODE_EANX_CC) {
        return 1;
    }

    return 0;
}

/* Indicates which symbols can have composite 2D component data */
INTERNAL int is_composite(int symbology) {
    return symbology >= BARCODE_EANX_CC && symbology <= BARCODE_RSS_EXPSTACK_CC;
}

INTERNAL int istwodigits(const unsigned char source[], const size_t position) {
    if ((source[position] >= '0') && (source[position] <= '9')) {
        if ((source[position + 1] >= '0') && (source[position + 1] <= '9')) {
            return 1;
        }
    }

    return 0;
}

/* State machine to decode UTF-8 to Unicode codepoints (state 0 means done, state 12 means error) */
INTERNAL unsigned int decode_utf8(unsigned int* state, unsigned int* codep, const unsigned char byte) {
    /*
        Copyright (c) 2008-2009 Bjoern Hoehrmann <bjoern@hoehrmann.de>

        Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
        files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
        modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
        Software is furnished to do so, subject to the following conditions:

        The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

        See https://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details.
     */

    static const unsigned char utf8d[] = {
        /* The first part of the table maps bytes to character classes that
         * reduce the size of the transition table and create bitmasks. */
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
         1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,  9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
         8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
        10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8,

        /* The second part is a transition table that maps a combination
         * of a state of the automaton and a character class to a state. */
         0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12,
        12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12,
        12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12,
        12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12,
        12,36,12,12,12,12,12,12,12,12,12,12,
    };

    unsigned int type = utf8d[byte];

    *codep = *state != 0 ? (byte & 0x3fu) | (*codep << 6) : (0xff >> type) & byte;

    *state = utf8d[256 + *state + type];

    return *state;
}

/* Convert UTF-8 to Unicode. If `disallow_4byte` unset, allow all values (UTF-32).
 * If `disallow_4byte` set, only allow codepoints <= U+FFFF (ie four-byte sequences not allowed) (UTF-16, no surrogates) */
INTERNAL int utf8_to_unicode(struct zint_symbol *symbol, const unsigned char source[], unsigned int vals[], size_t *length, int disallow_4byte) {
    size_t bpos;
    int    jpos;
    unsigned int codepoint, state = 0;

    bpos = 0;
    jpos = 0;



    while (bpos < *length) {
        do {
            decode_utf8(&state, &codepoint, source[bpos++]);


        } while (bpos < *length && state != 0 && state != 12);

        if (state != 0) {

            strcpy(symbol->errtxt, "240: Corrupt Unicode data");
            return ZINT_ERROR_INVALID_DATA;
        }

        if (disallow_4byte && codepoint > 0xffff) {
            strcpy(symbol->errtxt, "242: Unicode sequences of more than 3 bytes not supported");
            return ZINT_ERROR_INVALID_DATA;
        }



        vals[jpos] = codepoint;

        jpos++;










    }





    *length = jpos;

    return 0;
}

/* Enforce minimum permissable height of rows */
INTERNAL void set_minimum_height(struct zint_symbol *symbol, const int min_height) {

    int fixed_height = 0;
    int zero_count = 0;
    int i;

    for (i = 0; i < symbol->rows; i++) {
        fixed_height += symbol->row_height[i];

316
317
318
319
320
321
322











































































































                    symbol->row_height[i] = min_height;
                }
            }
        }
    }
}



















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
                    symbol->row_height[i] = min_height;
                }
            }
        }
    }
}

/* Calculate optimized encoding modes. Adapted from Project Nayuki */
INTERNAL void pn_define_mode(char* mode, const unsigned int data[], const size_t length, const int debug,
        unsigned int state[], const char mode_types[], const int num_modes, pn_head_costs head_costs, pn_switch_cost switch_cost, pn_eod_cost eod_cost, pn_cur_cost cur_cost) {
    /*
     * Copyright (c) Project Nayuki. (MIT License)
     * https://www.nayuki.io/page/qr-code-generator-library
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy of
     * this software and associated documentation files (the "Software"), to deal in
     * the Software without restriction, including without limitation the rights to
     * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
     * the Software, and to permit persons to whom the Software is furnished to do so,
     * subject to the following conditions:
     * - The above copyright notice and this permission notice shall be included in
     *   all copies or substantial portions of the Software.
     */
    int i, j, k, cm_i;
    unsigned int min_cost;
    char cur_mode;
#ifndef _MSC_VER
    unsigned int prev_costs[num_modes];
    char char_modes[length * num_modes];
    unsigned int cur_costs[num_modes];
#else
    unsigned int* prev_costs;
    char* char_modes;
    unsigned int* cur_costs;
    prev_costs = (unsigned int*) _alloca(num_modes * sizeof(unsigned int));
    char_modes = (char*) _alloca(length * num_modes);
    cur_costs = (unsigned int*) _alloca(num_modes * sizeof(unsigned int));
#endif

    /* char_modes[i * num_modes + j] represents the mode to encode the code point at index i such that the final
     * segment ends in mode_types[j] and the total number of bits is minimized over all possible choices */
    memset(char_modes, 0, length * num_modes);

    /* At the beginning of each iteration of the loop below, prev_costs[j] is the minimum number of 1/6 (1/XX_MULT)
     * bits needed to encode the entire string prefix of length i, and end in mode_types[j] */
    memcpy(prev_costs, (*head_costs)(state), num_modes * sizeof(unsigned int));

    /* Calculate costs using dynamic programming */
    for (i = 0, cm_i = 0; i < length; i++, cm_i += num_modes) {
        memset(cur_costs, 0, num_modes * sizeof(unsigned int));

        (*cur_cost)(state, data, length, i, char_modes, prev_costs, cur_costs);

        if (eod_cost && i == length - 1) { /* Add end of data costs if last character */
            for (j = 0; j < num_modes; j++) {
                if (char_modes[cm_i + j]) {
                    cur_costs[j] += (*eod_cost)(state, j);
                }
            }
        }

        /* Start new segment at the end to switch modes */
        for (j = 0; j < num_modes; j++) { /* To mode */
            for (k = 0; k < num_modes; k++) { /* From mode */
                if (j != k && char_modes[cm_i + k]) {
                    unsigned int new_cost = cur_costs[k] + (*switch_cost)(state, k, j);
                    if (!char_modes[cm_i + j] || new_cost < cur_costs[j]) {
                        cur_costs[j] = new_cost;
                        char_modes[cm_i + j] = mode_types[k];
                    }
                }
            }
        }

        memcpy(prev_costs, cur_costs, num_modes * sizeof(unsigned int));
    }

    /* Find optimal ending mode */
    min_cost = prev_costs[0];
    cur_mode = mode_types[0];
    for (i = 1; i < num_modes; i++) {
        if (prev_costs[i] < min_cost) {
            min_cost = prev_costs[i];
            cur_mode = mode_types[i];
        }
    }

    /* Get optimal mode for each code point by tracing backwards */
    for (i = length - 1, cm_i = i * num_modes; i >= 0; i--, cm_i -= num_modes) {
        j = strchr(mode_types, cur_mode) - mode_types;
        cur_mode = char_modes[cm_i + j];
        mode[i] = cur_mode;
    }

    if (debug & ZINT_DEBUG_PRINT) {
        printf("  Mode: %.*s\n", (int)length, mode);
    }
}

#ifdef ZINT_TEST
/* Dumps hex-formatted codewords in symbol->errtxt (for use in testing) */
void debug_test_codeword_dump(struct zint_symbol *symbol, unsigned char* codewords, int length) {
    int i, max = length, cnt_len = 0;
    if (length > 30) { /* 30*3 < errtxt 92 (100 - "Warning ") chars */
        sprintf(symbol->errtxt, "(%d) ", length); /* Place the number of codewords at the front */
        cnt_len = strlen(symbol->errtxt);
        max = 30 - (cnt_len + 2) / 3;
    }
    for (i = 0; i < max; i++) {
        sprintf(symbol->errtxt + cnt_len + i * 3, "%02X ", codewords[i]);
    }
    symbol->errtxt[strlen(symbol->errtxt) - 1] = '\0'; /* Zap last space */
}
#endif
Changes to jni/zint/backend/common.h.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* Used in some logic */
#ifndef __COMMON_H
#define __COMMON_H

#ifndef FALSE
#define FALSE		0







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* Used in some logic */
#ifndef __COMMON_H
#define __COMMON_H

#ifndef FALSE
#define FALSE		0
46
47
48
49
50
51
52






53
54
55
56
57
58
59
60
61
62
63

64

65
66
67
68
69
70
71
72


73
74












75
76
77
78
79
#define NEON	"0123456789"

#include "zint.h"
#include <stdlib.h>

#define ustrcpy(target,source) strcpy((char*)target,(const char*)source)







#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

    extern size_t ustrlen(const unsigned char data[]);
    extern int ctoi(const char source);
    extern char itoc(const int source);
    extern void to_upper(unsigned char source[]);
    extern int is_sane(const char test_string[], const unsigned char source[], const size_t length);
    extern void lookup(const char set_string[], const char *table[], const char data, char dest[]);
    extern void bin_append(const int arg, const int length, char *binary);

    extern int posn(const char set_string[], const char data);

    extern int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord);
    extern void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
    extern int istwodigits(const unsigned char source[], const size_t position);
    extern int parunmodd(const unsigned char llyth);
    extern void expand(struct zint_symbol *symbol, const char data[]);
    extern void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
    extern int is_stackable(const int symbology);
    extern int is_extendable(const int symbology);


    extern int utf8toutf16(struct zint_symbol *symbol, const unsigned char source[], int vals[], size_t *length);
    extern void set_minimum_height(struct zint_symbol *symbol, const int min_height);












#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __COMMON_H */







>
>
>
>
>
>




|
|
|
|
|
|
|
>
|
>
|
|
|
<
|
|
|
|
>
>
|
|
>
>
>
>
>
>
>
>
>
>
>
>





47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#define NEON	"0123456789"

#include "zint.h"
#include <stdlib.h>

#define ustrcpy(target,source) strcpy((char*)target,(const char*)source)

#if defined(__GNUC__) && !defined(ZINT_TEST)
#define INTERNAL __attribute__ ((visibility ("hidden")))
#else
#define INTERNAL
#endif /* defined(__GNUC__) && !defined(ZINT_TEST) */

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

    INTERNAL size_t ustrlen(const unsigned char data[]);
    INTERNAL int ctoi(const char source);
    INTERNAL char itoc(const int source);
    INTERNAL void to_upper(unsigned char source[]);
    INTERNAL int is_sane(const char test_string[], const unsigned char source[], const size_t length);
    INTERNAL void lookup(const char set_string[], const char *table[], const char data, char dest[]);
    INTERNAL void bin_append(const int arg, const int length, char *binary);
    INTERNAL void bin_append_posn(const int arg, const int length, char *binary, size_t posn);
    INTERNAL int posn(const char set_string[], const char data);
    INTERNAL int ustrchr_cnt(const unsigned char string[], const size_t length, const unsigned char c);
    INTERNAL int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord);
    INTERNAL void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
    INTERNAL int istwodigits(const unsigned char source[], const size_t position);

    INTERNAL void expand(struct zint_symbol *symbol, const char data[]);
    INTERNAL void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord);
    INTERNAL int is_stackable(const int symbology);
    INTERNAL int is_extendable(const int symbology);
    INTERNAL int is_composite(const int symbology);
    INTERNAL unsigned int decode_utf8(unsigned int* state, unsigned int* codep, const unsigned char byte);
    INTERNAL int utf8_to_unicode(struct zint_symbol *symbol, const unsigned char source[], unsigned int vals[], size_t *length, int disallow_4byte);
    INTERNAL void set_minimum_height(struct zint_symbol *symbol, const int min_height);

    typedef unsigned int* (*pn_head_costs)(unsigned int state[]);
    typedef unsigned int (*pn_switch_cost)(unsigned int state[], const int k, const int j);
    typedef unsigned int (*pn_eod_cost)(unsigned int state[], const int k);
    typedef void (*pn_cur_cost)(unsigned int state[], const unsigned int data[], const size_t length, const int i, char* char_modes, unsigned int prev_costs[], unsigned int cur_costs[]);
    INTERNAL void pn_define_mode(char* mode, const unsigned int data[], const size_t length, const int debug,
                    unsigned int state[], const char mode_types[], const int num_modes, pn_head_costs head_costs, pn_switch_cost switch_cost, pn_eod_cost eod_cost, pn_cur_cost cur_cost);

    #ifdef ZINT_TEST
    void debug_test_codeword_dump(struct zint_symbol *symbol, unsigned char* codewords, int length);
    #endif

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __COMMON_H */
Changes to jni/zint/backend/composite.c.
1
2
3
4
5
6
7
8
9
10
11
12
/* composite.c - Handles GS1 Composite Symbols */

/*
    libzint - the open source barcode library
    Copyright (C) 2008-2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.




|







1
2
3
4
5
6
7
8
9
10
11
12
/* composite.c - Handles GS1 Composite Symbols */

/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* The functions "getBit", "init928" and "encode928" are copyright BSI and are
   released with permission under the following terms:

   "Copyright subsists in all BSI publications. BSI also holds the copyright, in the
   UK, of the international standardisation bodies. Except as
   permitted under the Copyright, Designs and Patents Act 1988 no extract may be







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* The functions "getBit", "init928" and "encode928" are copyright BSI and are
   released with permission under the following terms:

   "Copyright subsists in all BSI publications. BSI also holds the copyright, in the
   UK, of the international standardisation bodies. Except as
   permitted under the Copyright, Designs and Patents Act 1988 no extract may be
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

64
65
66
67
68
69

70
71
72
73
74
75
76
77
78
79
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
#include <assert.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "composite.h"
#include "pdf417.h"
#include "gs1.h"


#define UINT unsigned short

extern int general_rules(char type[]);
extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length);
extern int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length);

extern int rss14(struct zint_symbol *symbol, unsigned char source[], int length);
extern int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length);
extern int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length);

static UINT pwr928[69][7];

static int _min(int first, int second) {

    if (first <= second)
        return first;







<







>



<
|
|
>
|
|
|







50
51
52
53
54
55
56

57
58
59
60
61
62
63
64
65
66
67

68
69
70
71
72
73
74
75
76
77
78
79
80
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>

#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "composite.h"
#include "pdf417.h"
#include "gs1.h"
#include "general_field.h"

#define UINT unsigned short


INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int length);
INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length);
INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[]);
INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int length);
INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length);
INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length);

static UINT pwr928[69][7];

static int _min(int first, int second) {

    if (first <= second)
        return first;
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
    for (i = 0; i < 13; i++) {
        bitStr[i] = 0;
    }
    for (i = 0; i < 28; i++) {
        codeWords[i] = 0;
    }

	bitlen = (int)strlen(source);

    for (i = 0; i < 208; i++) {
        local_source[i] = '0';
    }
    for (i = 0; i < bitlen; i++) {
        local_source[i] = source[i];
    }







|







148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
    for (i = 0; i < 13; i++) {
        bitStr[i] = 0;
    }
    for (i = 0; i < 28; i++) {
        codeWords[i] = 0;
    }

    bitlen = (int)strlen(source);

    for (i = 0; i < 208; i++) {
        local_source[i] = '0';
    }
    for (i = 0; i < bitlen; i++) {
        local_source[i] = source[i];
    }
272
273
274
275
276
277
278

279

280
281
282
283
284
285
286
        for (j = 0; j < 5; j++) {
            dummy[j] = 0;
        }
        for (j = 0; j < cc_width; j++) {
            dummy[j + 1] = codeWords[i * cc_width + j];
        }
        /* Copy the data into codebarre */

        bin_append(rap_side[LeftRAP - 1], 10, pattern);

        bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern);
        strcat(pattern, "0");
        if (cc_width == 3) {
            bin_append(rap_centre[CentreRAP - 1], 10, pattern);
        }
        if (cc_width >= 2) {
            bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern);







>
|
>







273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
        for (j = 0; j < 5; j++) {
            dummy[j] = 0;
        }
        for (j = 0; j < cc_width; j++) {
            dummy[j + 1] = codeWords[i * cc_width + j];
        }
        /* Copy the data into codebarre */
        if (cc_width != 3) {
            bin_append(rap_side[LeftRAP - 1], 10, pattern);
        }
        bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern);
        strcat(pattern, "0");
        if (cc_width == 3) {
            bin_append(rap_centre[CentreRAP - 1], 10, pattern);
        }
        if (cc_width >= 2) {
            bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern);
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
            }
            break;
        }

        return target_bitsize;
}

int calc_padding_ccb(int binary_length, int cc_width) {
    int target_bitsize = 0;

    switch (cc_width) {
        case 2:
            if (binary_length <= 336) {
                target_bitsize = 336;
            }







|







792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
            }
            break;
        }

        return target_bitsize;
}

static int calc_padding_ccb(int binary_length, int cc_width) {
    int target_bitsize = 0;

    switch (cc_width) {
        case 2:
            if (binary_length <= 336) {
                target_bitsize = 336;
            }
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909

910
911
912
913
914
915
916
917
918
919
920
921
922
923


924
925
926
927
928
929
930
931
932
933


934


935
936

937
938
939
940
941
942
943


944

945
946
947
948
949

950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965


966
967
968
969
970
971
972
973
974
975
976

977
978
979
980
981

982
983
984
985
986
987
988
989
990
            }
            break;
    }

    return target_bitsize;
}

int calc_padding_ccc(int binary_length, int *cc_width, int lin_width, int *ecc) {
    int target_bitsize = 0;
    int byte_length, codewords_used, ecc_level, ecc_codewords, rows;
    int codewords_total, target_codewords, target_bytesize;
    int i;

    byte_length = binary_length / 8;
    if (binary_length % 8 != 0) {
        byte_length++;
    }

    codewords_used = (byte_length / 6) * 5;
    codewords_used += byte_length % 6;

    ecc_level = 7;

    if (codewords_used <= 1280) {
        ecc_level = 6;
    }
    if (codewords_used <= 640) {
        ecc_level = 5;
    }
    if (codewords_used <= 320) {
        ecc_level = 4;
    }
    if (codewords_used <= 160) {
        ecc_level = 3;
    }
    if (codewords_used <= 40) {
        ecc_level = 2;


    }
    *(ecc) = ecc_level;
    ecc_codewords = 1;
    for (i = 1; i <= (ecc_level + 1); i++) {
        ecc_codewords *= 2;
    }

    codewords_used += ecc_codewords;
    codewords_used += 3;



    *(cc_width) = (lin_width - 62) / 17;


    /* stop the symbol from becoming too high */
    do {

        *(cc_width) = *(cc_width) + 1;
        rows = codewords_used / *(cc_width);
    } while (rows > 90);

    if (codewords_used % *(cc_width) != 0) {
        rows++;
    }




    codewords_total = *(cc_width) * rows;

    if (codewords_total > 928) { // PDF_MAX
        return 0;
    }


    target_codewords = codewords_total - ecc_codewords;
    target_codewords -= 3;

    target_bytesize = 6 * (target_codewords / 5);
    target_bytesize += target_codewords % 5;

    target_bitsize = 8 * target_bytesize;

    return target_bitsize;
}

static int cc_binary_string(struct zint_symbol *symbol, const char source[], char binary_string[], int cc_mode, int *cc_width, int *ecc, int lin_width) { /* Handles all data encodation from section 5 of ISO/IEC 24723 */
    int encoding_method, read_posn, d1, d2, alpha_pad;
    int i, j, ai_crop, fnc1_latch;
    int ai90_mode, latch, remainder, binary_length;


#ifndef _MSC_VER
    char general_field[strlen(source) + 1], general_field_type[strlen(source) + 1];
#else
    char* general_field = (char*) _alloca(strlen(source) + 1);
    char* general_field_type = (char*) _alloca(strlen(source) + 1);
#endif
    int target_bitsize;

    encoding_method = 1;
    read_posn = 0;
    ai_crop = 0;

    fnc1_latch = 0;
    alpha_pad = 0;
    ai90_mode = 0;
    *ecc = 0;
    target_bitsize = 0;


    if ((source[0] == '1') && ((source[1] == '0') || (source[1] == '1') || (source[1] == '7')) && (strlen(source) > 8)) {
        /* Source starts (10), (11) or (17) */
        encoding_method = 2;
    }

    if ((source[0] == '9') && (source[1] == '0')) {
        /* Source starts (90) */
        encoding_method = 3;







|



<









|
>
|
|
<
|
|
<
|

<
|
|
<
|
|
>
>


|
<
<
<




>
>
|
>
>

<
>

|
<
|
<
<
|
>
>
|
>
|
|
<
<
|
>













|
|
|
>
>

|

|
<






>





>

|







891
892
893
894
895
896
897
898
899
900
901

902
903
904
905
906
907
908
909
910
911
912
913
914

915
916

917
918

919
920

921
922
923
924
925
926
927



928
929
930
931
932
933
934
935
936
937

938
939
940

941


942
943
944
945
946
947
948


949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972

973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
            }
            break;
    }

    return target_bitsize;
}

static int calc_padding_ccc(int binary_length, int *cc_width, int lin_width, int *ecc) {
    int target_bitsize = 0;
    int byte_length, codewords_used, ecc_level, ecc_codewords, rows;
    int codewords_total, target_codewords, target_bytesize;


    byte_length = binary_length / 8;
    if (binary_length % 8 != 0) {
        byte_length++;
    }

    codewords_used = (byte_length / 6) * 5;
    codewords_used += byte_length % 6;

    /* Recommended minimum ecc levels ISO/IEC 1543:2015 (PDF417) Annex E Table E.1,
       restricted by CC-C codeword max 900 (30 cols * 30 rows), GS1 General Specifications 19.1 5.9.2.3 */
    if (codewords_used <= 40) {
        ecc_level = 2;

    } else if (codewords_used <= 160) {
        ecc_level = 3;

    } else if (codewords_used <= 320) {
        ecc_level = 4;

    } else if (codewords_used <= 833) { /* 900 - 3 - 64 */
        ecc_level = 5;

    } else if (codewords_used <= 865) { /* 900 - 3 - 32 */
        ecc_level = 4; /* Not recommended but allow to meet advertised "up to 2361 digits" (allows max 2372) */
    } else {
        return 0;
    }
    *(ecc) = ecc_level;
    ecc_codewords = 1 << (ecc_level + 1);




    codewords_used += ecc_codewords;
    codewords_used += 3;

    *(cc_width) = (lin_width - 53) / 17; // -53 = (6 left quiet zone + 10 right quiet zone - (17 * 3 + 18))
    if (*(cc_width) > 30) {
        *(cc_width) = 30;
    }
    rows = ceil((double) codewords_used / *(cc_width));
    /* stop the symbol from becoming too high */

    while (rows > 30 && *(cc_width) < 30) {
        *(cc_width) = *(cc_width) + 1;
        rows = ceil((double) codewords_used / *(cc_width));

    }



    if (rows > 30) {
        return 0;
    }
    if (rows < 3) {
        rows = 3;
    }



    codewords_total = *(cc_width) * rows;

    target_codewords = codewords_total - ecc_codewords;
    target_codewords -= 3;

    target_bytesize = 6 * (target_codewords / 5);
    target_bytesize += target_codewords % 5;

    target_bitsize = 8 * target_bytesize;

    return target_bitsize;
}

static int cc_binary_string(struct zint_symbol *symbol, const char source[], char binary_string[], int cc_mode, int *cc_width, int *ecc, int lin_width) { /* Handles all data encodation from section 5 of ISO/IEC 24723 */
    int encoding_method, read_posn, alpha_pad;
    int i, j, ai_crop, ai_crop_posn, fnc1_latch;
    int ai90_mode, last_digit, remainder, binary_length;
    int mode;
    int source_len = strlen(source);
#ifndef _MSC_VER
    char general_field[source_len + 1];
#else
    char* general_field = (char*) _alloca(source_len + 1);

#endif
    int target_bitsize;

    encoding_method = 1;
    read_posn = 0;
    ai_crop = 0;
    ai_crop_posn = -1;
    fnc1_latch = 0;
    alpha_pad = 0;
    ai90_mode = 0;
    *ecc = 0;
    target_bitsize = 0;
    mode = NUMERIC;

    if ((source[0] == '1') && ((source[1] == '0') || (source[1] == '1') || (source[1] == '7'))) {
        /* Source starts (10), (11) or (17) */
        encoding_method = 2;
    }

    if ((source[0] == '9') && (source[1] == '0')) {
        /* Source starts (90) */
        encoding_method = 3;
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039

1040







1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063

1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
                /* Production Date AI 11 */
                strcat(binary_string, "0");
            } else {
                /* Expiration Date AI 17 */
                strcat(binary_string, "1");
            }
            read_posn = 8;
        }

        if ((source[read_posn] == '1') && (source[read_posn + 1] == '0')) {
            /* Followed by AI 10 - strip this from general field */
            read_posn += 2;
        } else {
            /* An FNC1 character needs to be inserted in the general field */

            fnc1_latch = 1;







        }
    }

    if (encoding_method == 3) {
        /* Encodation Method field of "11" - AI 90 */
#ifndef _MSC_VER
        char ninety[strlen(source) + 1];
#else
        char* ninety = (char*) _alloca(strlen(source) + 1);
#endif
        int alpha, alphanum, numeric, test1, test2, test3;

        /* "This encodation method may be used if an element string with an AI
        90 occurs at the start of the data message, and if the data field
        following the two-digit AI 90 starts with an alphanumeric string which
        complies with a specific format." (para 5.2.2) */

        i = 0;
        do {
            ninety[i] = source[i + 2];
            i++;
        } while ((strlen(source) > i + 2) && ('[' != source[i + 2]));
        ninety[i] = '\0';


        /* Find out if the AI 90 data is alphabetic or numeric or both */

        alpha = 0;
        alphanum = 0;
        numeric = 0;

        for (i = 0; i < (int) strlen(ninety); i++) {

            if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) {
                /* Character is alphabetic */
                alpha += 1;
            }

            if ((ninety[i] >= '0') && (ninety[i] <= '9')) {
                /* Character is numeric */
                numeric += 1;
            }

            switch (ninety[i]) {
                case '*':
                case ',':
                case '-':
                case '.':
                case '/': alphanum += 1;
                    break;
            }

            if (!(((ninety[i] >= '0') && (ninety[i] <= '9')) || ((ninety[i] >= 'A') && (ninety[i] <= 'Z')))) {
                if ((ninety[i] != '*') && (ninety[i] != ',') && (ninety[i] != '-') && (ninety[i] != '.') && (ninety[i] != '/')) {
                    /* An Invalid AI 90 character */
                    strcpy(symbol->errtxt, "440: Invalid AI 90 data");
                    return ZINT_ERROR_INVALID_DATA;
                }
            }
        }

        /* must start with 0, 1, 2 or 3 digits followed by an uppercase character */
        test1 = -1;
        for (i = 3; i >= 0; i--) {
            if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) {







|
<
|
|
|
|
<
>
|
>
>
>
>
>
>
>






|

|

|




|





|

>







|




<
<
|


<
<
<
|
<
<
<
|
<
<
<
<
<
<
<
<
<







1030
1031
1032
1033
1034
1035
1036
1037

1038
1039
1040
1041

1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086


1087
1088
1089



1090



1091









1092
1093
1094
1095
1096
1097
1098
                /* Production Date AI 11 */
                strcat(binary_string, "0");
            } else {
                /* Expiration Date AI 17 */
                strcat(binary_string, "1");
            }
            read_posn = 8;


            if ((source[read_posn] == '1') && (source[read_posn + 1] == '0')) {
                /* Followed by AI 10 - strip this from general field */
                read_posn += 2;
            } else if (source[read_posn]) {

                /* ISO/IEC 24723:2010 5.3.1 "If a lot number does not directly follow the date element string, a FNC1 is encoded following the date element string ..." */
                fnc1_latch = 1;
            } else {
                /* "... even if no more data follows the date element string" */
                /* So still need FNC1 character but can't do single FNC1 in numeric mode, so insert alphanumeric latch "0000" and alphanumeric FNC1 "01111"
                   (this implementation detail taken from BWIPP https://github.com/bwipp/postscriptbarcode Copyright (c) 2004-2019 Terry Burton) */
                strcat(binary_string, "000001111");
                /* Note an alphanumeric FNC1 is also a numeric latch, so now in numeric mode */
            }
        }
    }

    if (encoding_method == 3) {
        /* Encodation Method field of "11" - AI 90 */
#ifndef _MSC_VER
        char ninety[source_len + 1];
#else
        char* ninety = (char*) _alloca(source_len + 1);
#endif
        int ninety_len, alpha, alphanum, numeric, test1, test2, test3;

        /* "This encodation method may be used if an element string with an AI
        90 occurs at the start of the data message, and if the data field
        following the two-digit AI 90 starts with an alphanumeric string which
        complies with a specific format." (para 5.3.2) */

        i = 0;
        do {
            ninety[i] = source[i + 2];
            i++;
        } while ((source_len > i + 2) && ('[' != source[i + 2]));
        ninety[i] = '\0';
        ninety_len = strlen(ninety);

        /* Find out if the AI 90 data is alphabetic or numeric or both */

        alpha = 0;
        alphanum = 0;
        numeric = 0;

        for (i = 0; i < ninety_len; i++) {

            if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) {
                /* Character is alphabetic */
                alpha += 1;


            } else if ((ninety[i] >= '0') && (ninety[i] <= '9')) {
                /* Character is numeric */
                numeric += 1;



            } else {



                alphanum += 1;









            }
        }

        /* must start with 0, 1, 2 or 3 digits followed by an uppercase character */
        test1 = -1;
        for (i = 3; i >= 0; i--) {
            if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) {
1129
1130
1131
1132
1133
1134
1135
1136








1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170

1171
1172

1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209




















1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287




1288
1289

1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532

1533




1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551

            numeric -= test1;
            alpha--;

            /* Decide on numeric, alpha or alphanumeric mode */
            /* Alpha mode is a special mode for AI 90 */

            if (alphanum > 0) {








                /* Alphanumeric mode */
                strcat(binary_string, "0");
                ai90_mode = 1;
            } else {
                if (alpha > numeric) {
                    /* Alphabetic mode */
                    strcat(binary_string, "11");
                    ai90_mode = 2;
                } else {
                    /* Numeric mode */
                    strcat(binary_string, "10");
                    ai90_mode = 3;
                }
            }

            next_ai_posn = 2 + (int)strlen(ninety);

            if (source[next_ai_posn] == '[') {
                /* There are more AIs afterwords */
                if ((source[next_ai_posn + 1] == '2') && (source[next_ai_posn + 2] == '1')) {
                    /* AI 21 follows */
                    ai_crop = 1;
                }

                if ((source[next_ai_posn + 1] == '8') && (source[next_ai_posn + 2] == '0') && (source[next_ai_posn + 3] == '0') && (source[next_ai_posn + 4] == '4')) {
                    /* AI 8004 follows */
                    ai_crop = 2;
                }
            }

            switch (ai_crop) {
                case 0: strcat(binary_string, "0");
                    break;
                case 1: strcat(binary_string, "10");

                    break;
                case 2: strcat(binary_string, "11");

                    break;
            }

            if (test1 == 0) {
                strcpy(numeric_part, "0");
            } else {
                for (i = 0; i < test1; i++) {
                    numeric_part[i] = ninety[i];
                }
                numeric_part[i] = '\0';
            }

            numeric_value = atoi(numeric_part);

            table3_letter = -1;
            if (numeric_value < 31) {
                table3_letter = posn("BDHIJKLNPQRSTVWZ", ninety[test1]);
            }

            if (table3_letter != -1) {
                /* Encoding can be done according to 5.2.2 c) 2) */
                /* five bit binary string representing value before letter */
                bin_append(numeric_value, 5, binary_string);

                /* followed by four bit representation of letter from Table 3 */
                bin_append(table3_letter, 4, binary_string);
            } else {
                /* Encoding is done according to 5.2.2 c) 3) */
                bin_append(31, 5, binary_string);
                /* ten bit representation of number */
                bin_append(numeric_value, 10, binary_string);

                /* five bit representation of ASCII character */
                bin_append(ninety[test1] - 65, 5, binary_string);
            }

            read_posn = test1 + 3;




















        } else {
            /* Use general field encodation instead */
            strcat(binary_string, "0");
            read_posn = 0;
        }
    }

    /* Now encode the rest of the AI 90 data field */
    if (ai90_mode == 2) {
        /* Alpha encodation (section 5.2.3) */
        do {
            if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) {
                bin_append(source[read_posn] + 4, 5, binary_string);
            }

            if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) {
                bin_append(source[read_posn] - 65, 6, binary_string);
            }

            if (source[read_posn] == '[') {
                bin_append(31, 5, binary_string);
            }

            read_posn++;
        } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0'));
        alpha_pad = 1; /* This is overwritten if a general field is encoded */
    }

    if (ai90_mode == 1) {
        /* Alphanumeric mode */
        do {
            if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) {
                bin_append(source[read_posn] - 43, 5, binary_string);
            }

            if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) {
                bin_append(source[read_posn] - 33, 6, binary_string);
            }

            switch (source[read_posn]) {
                case '[':
                    bin_append(15, 5, binary_string);
                    break;
                case '*':
                    bin_append(58, 6, binary_string);
                    break;
                case ',':
                    bin_append(59, 6, binary_string);
                    break;
                case '-':
                    bin_append(60, 6, binary_string);
                    break;
                case '.':
                    bin_append(61, 6, binary_string);
                    break;
                case '/':
                    bin_append(62, 6, binary_string);
                    break;
            }

            read_posn++;
        } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0'));
    }

    read_posn += (2 * ai_crop);

    /* The compressed data field has been processed if appropriate - the
    rest of the data (if any) goes into a general-purpose data compaction field */

    j = 0;
    if (fnc1_latch == 1) {
        /* Encodation method "10" has been used but it is not followed by
           AI 10, so a FNC1 character needs to be added */
        general_field[j] = '[';
        j++;
    }

    for (i = read_posn; i < (int) strlen(source); i++) {




        general_field[j] = source[i];
        j++;

    }
    general_field[j] = '\0';

    if (strlen(general_field) != 0) {
        alpha_pad = 0;
    }

    latch = 0;
    for (i = 0; i < (int) strlen(general_field); i++) {
        /* Table 13 - ISO/IEC 646 encodation */
        if ((general_field[i] < ' ') || (general_field[i] > 'z')) {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        } else {
            general_field_type[i] = ISOIEC;
        }

        if (general_field[i] == '#') {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == '$') {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == '@') {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == 92) {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == '^') {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == 96) {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }

        /* Table 12 - Alphanumeric encodation */
        if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == '*') {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == ',') {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == '-') {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == '.') {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == '/') {
            general_field_type[i] = ALPHA_OR_ISO;
        }

        /* Numeric encodation */
        if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
            general_field_type[i] = ANY_ENC;
        }
        if (general_field[i] == '[') {
            /* FNC1 can be encoded in any system */
            general_field_type[i] = ANY_ENC;
        }

    }

    general_field_type[strlen(general_field)] = '\0';

    if (latch == 1) {
        /* Invalid characters in input data */
        strcpy(symbol->errtxt, "441: Invalid characters in input data");
        return ZINT_ERROR_INVALID_DATA;
    }

    for (i = 0; i < (int) strlen(general_field); i++) {
        if ((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) {
            general_field_type[i + 1] = ISOIEC;
        }
    }

    for (i = 0; i < (int) strlen(general_field); i++) {
        if ((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) {
            general_field_type[i + 1] = ALPHA_OR_ISO;
        }
    }

    latch = general_rules(general_field_type);

    i = 0;
    do {
        switch (general_field_type[i]) {
            case NUMERIC:

                if (i != 0) {
                    if ((general_field_type[i - 1] != NUMERIC) && (general_field[i - 1] != '[')) {
                        bin_append(0, 3, binary_string); /* Numeric latch */
                    }
                }

                if (general_field[i] != '[') {
                    d1 = ctoi(general_field[i]);
                } else {
                    d1 = 10;
                }

                if (general_field[i + 1] != '[') {
                    d2 = ctoi(general_field[i + 1]);
                } else {
                    d2 = 10;
                }

                bin_append((11 * d1) + d2 + 8, 7, binary_string);

                i += 2;
                break;

            case ALPHA:

                if (i != 0) {
                    if ((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) {
                        bin_append(0, 4, binary_string); /* Alphanumeric latch */
                    }
                    if (general_field_type[i - 1] == ISOIEC) {
                        bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */
                    }
                }

                if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
                    bin_append(general_field[i] - 43, 5, binary_string);
                }

                if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
                    bin_append(general_field[i] - 33, 6, binary_string);
                }

                switch (general_field[i]) {
                    case '[':
                        bin_append(15, 5, binary_string);
                        break;
                    case '*':
                        bin_append(58, 6, binary_string);
                        break;
                    case ',':
                        bin_append(59, 6, binary_string);
                        break;
                    case '-':
                        bin_append(60, 6, binary_string);
                        break;
                    case '.':
                        bin_append(61, 6, binary_string);
                        break;
                    case '/':
                        bin_append(62, 6, binary_string);
                        break;
                }

                i++;
                break;

            case ISOIEC:

                if (i != 0) {
                    if ((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) {
                        bin_append(0, 4, binary_string); /* Alphanumeric latch */
                        bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */
                    }
                    if (general_field_type[i - 1] == ALPHA) {
                        bin_append(4, 5, binary_string);; /* ISO/IEC 646 latch */
                    }
                }

                if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
                    bin_append(general_field[i] - 43, 5, binary_string);
                }

                if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
                    bin_append(general_field[i] - 1, 7, binary_string);
                }

                if ((general_field[i] >= 'a') && (general_field[i] <= 'z')) {
                    bin_append(general_field[i] - 7, 7, binary_string);
                }

                if (general_field[i] == '[') strcat(binary_string, "01111"); /* FNC1/Numeric latch */
                if (general_field[i] == '!') strcat(binary_string, "11101000"); /* exclamation mark */
                if (general_field[i] == 34) strcat(binary_string, "11101001"); /* quotation mark */
                if (general_field[i] == 37) strcat(binary_string, "11101010"); /* percent sign */
                if (general_field[i] == '&') strcat(binary_string, "11101011"); /* ampersand */
                if (general_field[i] == 39) strcat(binary_string, "11101100"); /* apostrophe */
                if (general_field[i] == '(') strcat(binary_string, "11101101"); /* left parenthesis */
                if (general_field[i] == ')') strcat(binary_string, "11101110"); /* right parenthesis */
                if (general_field[i] == '*') strcat(binary_string, "11101111"); /* asterisk */
                if (general_field[i] == '+') strcat(binary_string, "11110000"); /* plus sign */
                if (general_field[i] == ',') strcat(binary_string, "11110001"); /* comma */
                if (general_field[i] == '-') strcat(binary_string, "11110010"); /* minus or hyphen */
                if (general_field[i] == '.') strcat(binary_string, "11110011"); /* period or full stop */
                if (general_field[i] == '/') strcat(binary_string, "11110100"); /* slash or solidus */
                if (general_field[i] == ':') strcat(binary_string, "11110101"); /* colon */
                if (general_field[i] == ';') strcat(binary_string, "11110110"); /* semicolon */
                if (general_field[i] == '<') strcat(binary_string, "11110111"); /* less-than sign */
                if (general_field[i] == '=') strcat(binary_string, "11111000"); /* equals sign */
                if (general_field[i] == '>') strcat(binary_string, "11111001"); /* greater-than sign */
                if (general_field[i] == '?') strcat(binary_string, "11111010"); /* question mark */
                if (general_field[i] == '_') strcat(binary_string, "11111011"); /* underline or low line */
                if (general_field[i] == ' ') strcat(binary_string, "11111100"); /* space */

                i++;
                break;
        }
    } while (i + latch < (int) strlen(general_field));

    binary_length = (int)strlen(binary_string);
    switch (cc_mode) {
        case 1:
            target_bitsize = calc_padding_cca(binary_length, *(cc_width));
            break;
        case 2:
            target_bitsize = calc_padding_ccb(binary_length, *(cc_width));
            break;
        case 3:
            target_bitsize = calc_padding_ccc(binary_length, cc_width, lin_width, ecc);
            break;
    }

    if (target_bitsize == 0) {
        strcpy(symbol->errtxt, "442: Input too long for selected 2d component");
        return ZINT_ERROR_TOO_LONG;
    }

    remainder = target_bitsize - binary_length;

    if (latch == 1) {
        i = 0;
        /* There is still one more numeric digit to encode */

        if ((remainder >= 4) && (remainder <= 6)) {

            bin_append(ctoi(general_field[i]) + 1, 4, binary_string);




        } else {
            bin_append((11 * ctoi(general_field[i])) + 18, 7, binary_string);
            /* This may push the symbol up to the next size */
        }
    }

    if (strlen(binary_string) > 11805) { /* (2361 * 5) */
        strcpy(symbol->errtxt, "443: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }


    binary_length = (int)strlen(binary_string);
    switch (cc_mode) {
        case 1:
            target_bitsize = calc_padding_cca(binary_length, *(cc_width));
            break;
        case 2:







|
>
>
>
>
>
>
>
>



<
<
<
<
|
<
<
<
<
|
|
<
|


|







|







>

|
>




















|






|









>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<











|
>
>
>
>
|
|
>







<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<





<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















|
<



>
|
>
>
>
>

|








<







1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141




1142




1143
1144

1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231



























































1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257









1258



























































1259
1260
1261
1262
1263









































































































































1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284

1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303

1304
1305
1306
1307
1308
1309
1310

            numeric -= test1;
            alpha--;

            /* Decide on numeric, alpha or alphanumeric mode */
            /* Alpha mode is a special mode for AI 90 */

            if (alphanum == 0 && alpha > numeric) {
                /* Alphabetic mode */
                strcat(binary_string, "11");
                ai90_mode = 2;
            } else if (alphanum == 0 && alpha == 0) {
                /* Numeric mode */
                strcat(binary_string, "10");
                ai90_mode = 3;
            } else {
                /* Alphanumeric mode */
                strcat(binary_string, "0");
                ai90_mode = 1;




                mode = ALPHA;




            }


            next_ai_posn = 2 + ninety_len;

            if (source[next_ai_posn] == '[') {
                /* There are more AIs afterwards */
                if ((source[next_ai_posn + 1] == '2') && (source[next_ai_posn + 2] == '1')) {
                    /* AI 21 follows */
                    ai_crop = 1;
                }

                if ((source[next_ai_posn + 1] == '8') && (source[next_ai_posn + 2] == '0') && (source[next_ai_posn + 3] == '0') && (source[next_ai_posn + 4] == '4')) {
                    /* AI 8004 follows */
                    ai_crop = 3;
                }
            }

            switch (ai_crop) {
                case 0: strcat(binary_string, "0");
                    break;
                case 1: strcat(binary_string, "10");
                    ai_crop_posn = next_ai_posn + 1;
                    break;
                case 3: strcat(binary_string, "11");
                    ai_crop_posn = next_ai_posn + 1;
                    break;
            }

            if (test1 == 0) {
                strcpy(numeric_part, "0");
            } else {
                for (i = 0; i < test1; i++) {
                    numeric_part[i] = ninety[i];
                }
                numeric_part[i] = '\0';
            }

            numeric_value = atoi(numeric_part);

            table3_letter = -1;
            if (numeric_value < 31) {
                table3_letter = posn("BDHIJKLNPQRSTVWZ", ninety[test1]);
            }

            if (table3_letter != -1) {
                /* Encoding can be done according to 5.3.2 c) 2) */
                /* five bit binary string representing value before letter */
                bin_append(numeric_value, 5, binary_string);

                /* followed by four bit representation of letter from Table 3 */
                bin_append(table3_letter, 4, binary_string);
            } else {
                /* Encoding is done according to 5.3.2 c) 3) */
                bin_append(31, 5, binary_string);
                /* ten bit representation of number */
                bin_append(numeric_value, 10, binary_string);

                /* five bit representation of ASCII character */
                bin_append(ninety[test1] - 65, 5, binary_string);
            }

            read_posn = test1 + 3;

            /* Do Alpha mode encoding of the rest of the AI 90 data field here */
            if (ai90_mode == 2) {
                /* Alpha encodation (section 5.3.3) */
                do {
                    if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) {
                        bin_append(source[read_posn] - 65, 5, binary_string);

                    } else if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) {
                        bin_append(source[read_posn] + 4, 6, binary_string);

                    } else if (source[read_posn] == '[') {
                        bin_append(31, 5, binary_string);
                    }

                    read_posn++;
                } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0'));
                alpha_pad = 1; /* This is overwritten if a general field is encoded */
            }

        } else {
            /* Use general field encodation instead */
            strcat(binary_string, "0");
            read_posn = 0;
        }
    }




























































    /* The compressed data field has been processed if appropriate - the
    rest of the data (if any) goes into a general-purpose data compaction field */

    j = 0;
    if (fnc1_latch == 1) {
        /* Encodation method "10" has been used but it is not followed by
           AI 10, so a FNC1 character needs to be added */
        general_field[j] = '[';
        j++;
    }

    for (i = read_posn; i < source_len; i++) {
        /* Skip "[21" or "[8004" AIs if encodation method "11" used */
        if (i == ai_crop_posn) {
            i += ai_crop;
        } else {
            general_field[j] = source[i];
            j++;
        }
    }
    general_field[j] = '\0';

    if (strlen(general_field) != 0) {
        alpha_pad = 0;
    }










    if (!general_field_encode(general_field, &mode, &last_digit, binary_string)) {



























































        /* Invalid characters in input data */
        strcpy(symbol->errtxt, "441: Invalid characters in input data");
        return ZINT_ERROR_INVALID_DATA;
    }










































































































































    binary_length = (int)strlen(binary_string);
    switch (cc_mode) {
        case 1:
            target_bitsize = calc_padding_cca(binary_length, *(cc_width));
            break;
        case 2:
            target_bitsize = calc_padding_ccb(binary_length, *(cc_width));
            break;
        case 3:
            target_bitsize = calc_padding_ccc(binary_length, cc_width, lin_width, ecc);
            break;
    }

    if (target_bitsize == 0) {
        strcpy(symbol->errtxt, "442: Input too long for selected 2d component");
        return ZINT_ERROR_TOO_LONG;
    }

    remainder = target_bitsize - binary_length;

    if (last_digit) {

        /* There is still one more numeric digit to encode */

        if ((remainder >= 4) && (remainder <= 6)) {
            /* ISO/IEC 24723:2010 5.4.1 c) 2) "If four to six bits remain, add 1 to the digit value and encode the result in the next four bits. ..." */
            bin_append(ctoi(last_digit) + 1, 4, binary_string);
            if (remainder > 4) {
                /* "... The fifth and sixth bits, if present, shall be “0â€s." (Covered by adding truncated alphanumeric latch below but do explicitly anyway) */
                bin_append(0, remainder - 4, binary_string);
            }
        } else {
            bin_append((11 * ctoi(last_digit)) + 18, 7, binary_string);
            /* This may push the symbol up to the next size */
        }
    }

    if (strlen(binary_string) > 11805) { /* (2361 * 5) */
        strcpy(symbol->errtxt, "443: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }


    binary_length = (int)strlen(binary_string);
    switch (cc_mode) {
        case 1:
            target_bitsize = calc_padding_cca(binary_length, *(cc_width));
            break;
        case 2:
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619

1620
1621
1622
1623
1624
1625
1626
    }

    if (binary_length < target_bitsize) {
        /* Now add padding to binary string */
        if (alpha_pad == 1) {
            strcat(binary_string, "11111");
            alpha_pad = 0;
            /* Extra FNC1 character required after Alpha encodation (section 5.2.3) */
        }

        if ((strlen(general_field) != 0) && (general_field_type[strlen(general_field) - 1] == NUMERIC)) {
            strcat(binary_string, "0000");
        }

        while (strlen(binary_string) < (unsigned int) target_bitsize) {
            strcat(binary_string, "00100");
        }

        if (strlen(binary_string) > (unsigned int) target_bitsize) {
            binary_string[target_bitsize] = '\0';
        }
    }

    return 0;
}

int linear_dummy_run(unsigned char *source, int length) {
    struct zint_symbol *dummy;
    int error_number;
    int linear_width;

    dummy = ZBarcode_Create();
    dummy->symbology = BARCODE_EAN128_CC;
    dummy->option_1 = 3;
    error_number = ean_128(dummy, source, length);
    linear_width = dummy->width;
    ZBarcode_Delete(dummy);

    if (error_number == 0) {
        return linear_width;
    } else {
        return 0;
    }
}

int composite(struct zint_symbol *symbol, unsigned char source[], int length) {
    int error_number, cc_mode, cc_width, ecc_level;
    int j, i, k;
    unsigned int rs = length + 1;
    unsigned int bs = 20 * rs;
    unsigned int pri_len;
#ifndef _MSC_VER
    char reduced[rs];
    char binary_string[bs];
#else
    char* reduced = (char*) _alloca(rs);
    char* binary_string = (char*) _alloca(bs);
#endif

    struct zint_symbol *linear;
    int top_shift, bottom_shift;
    int linear_width = 0;

    /* Perform sanity checks on input options first */
    error_number = 0;
    pri_len = (int)strlen(symbol->primary);







|


|















|


















|


<
|
<

<


<


>







1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368

1369

1370

1371
1372

1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
    }

    if (binary_length < target_bitsize) {
        /* Now add padding to binary string */
        if (alpha_pad == 1) {
            strcat(binary_string, "11111");
            alpha_pad = 0;
            /* Extra FNC1 character required after Alpha encodation (section 5.3.3) */
        }

        if (mode == NUMERIC) {
            strcat(binary_string, "0000");
        }

        while (strlen(binary_string) < (unsigned int) target_bitsize) {
            strcat(binary_string, "00100");
        }

        if (strlen(binary_string) > (unsigned int) target_bitsize) {
            binary_string[target_bitsize] = '\0';
        }
    }

    return 0;
}

static int linear_dummy_run(unsigned char *source, int length) {
    struct zint_symbol *dummy;
    int error_number;
    int linear_width;

    dummy = ZBarcode_Create();
    dummy->symbology = BARCODE_EAN128_CC;
    dummy->option_1 = 3;
    error_number = ean_128(dummy, source, length);
    linear_width = dummy->width;
    ZBarcode_Delete(dummy);

    if (error_number == 0) {
        return linear_width;
    } else {
        return 0;
    }
}

INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int length) {
    int error_number, cc_mode, cc_width, ecc_level;
    int j, i, k;

    unsigned int bs = 13 * length + 500 + 1; /* Allow for 8 bits + 5-bit latch per char + 500 bits overhead/padding */

#ifndef _MSC_VER

    char binary_string[bs];
#else

    char* binary_string = (char*) _alloca(bs);
#endif
    unsigned int pri_len;
    struct zint_symbol *linear;
    int top_shift, bottom_shift;
    int linear_width = 0;

    /* Perform sanity checks on input options first */
    error_number = 0;
    pri_len = (int)strlen(symbol->primary);
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660

1661





1662



1663
1664
1665
1666
1667
1668
1669
1670
1671






1672
1673
1674
1675
1676
1677
1678
    cc_mode = symbol->option_1;
    if ((cc_mode == 3) && (symbol->symbology != BARCODE_EAN128_CC)) {
        /* CC-C can only be used with a GS1-128 linear part */
        strcpy(symbol->errtxt, "447: Invalid mode (CC-C only valid with GS1-128 linear component)");
        return ZINT_ERROR_INVALID_OPTION;
    }

    error_number = gs1_verify(symbol, source, length, reduced);
    if (error_number != 0) {
        return error_number;
    }

    if (symbol->symbology == BARCODE_EAN128_CC) {
        /* Do a test run of encoding the linear component to establish its width */
        linear_width = linear_dummy_run((unsigned char *) symbol->primary, pri_len);
        if (linear_width == 0) {
            strcpy(symbol->errtxt, "448: Invalid data");
            return ZINT_ERROR_INVALID_DATA;
        }
    }

    switch (symbol->symbology) {
            /* Determine width of 2D component according to ISO/IEC 24723 Table 1 */
        case BARCODE_EANX_CC:

            switch (pri_len) {





                case 7: /* EAN-8 */



                case 10: /* EAN-8 + 2 */
                case 13: /* EAN-8 + 5 */
                    cc_width = 3;
                    break;
                case 12: /* EAN-13 */
                case 15: /* EAN-13 + 2 */
                case 18: /* EAN-13 + 5 */
                    cc_width = 4;
                    break;






            }
            break;
        case BARCODE_EAN128_CC: cc_width = 4;
            break;
        case BARCODE_RSS14_CC: cc_width = 4;
            break;
        case BARCODE_RSS_LTD_CC: cc_width = 3;







<
<
<
<
<












>
|
>
>
>
>
>
|
>
>
>
|
|
|
|
|
|
|
|
|
>
>
>
>
>
>







1393
1394
1395
1396
1397
1398
1399





1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
    cc_mode = symbol->option_1;
    if ((cc_mode == 3) && (symbol->symbology != BARCODE_EAN128_CC)) {
        /* CC-C can only be used with a GS1-128 linear part */
        strcpy(symbol->errtxt, "447: Invalid mode (CC-C only valid with GS1-128 linear component)");
        return ZINT_ERROR_INVALID_OPTION;
    }






    if (symbol->symbology == BARCODE_EAN128_CC) {
        /* Do a test run of encoding the linear component to establish its width */
        linear_width = linear_dummy_run((unsigned char *) symbol->primary, pri_len);
        if (linear_width == 0) {
            strcpy(symbol->errtxt, "448: Invalid data");
            return ZINT_ERROR_INVALID_DATA;
        }
    }

    switch (symbol->symbology) {
            /* Determine width of 2D component according to ISO/IEC 24723 Table 1 */
        case BARCODE_EANX_CC:
            cc_width = 0;
            if (pri_len < 20) {
                int padded_pri_len;
                char padded_pri[20];
                padded_pri[0] = '\0';
                ean_leading_zeroes(symbol, (unsigned char*) symbol->primary, (unsigned char*) padded_pri);
                padded_pri_len = strlen(padded_pri);
                if (padded_pri_len <= 7) { /* EAN-8 */
                    cc_width = 3;
                } else {
                    switch (padded_pri_len) {
                        case 10: /* EAN-8 + 2 */
                        case 13: /* EAN-8 + 5 */
                            cc_width = 3;
                            break;
                        case 12: /* EAN-13 */
                        case 15: /* EAN-13 + 2 */
                        case 18: /* EAN-13 + 5 */
                            cc_width = 4;
                            break;
                    }
                }
            }
            if (cc_width == 0) {
                strcpy(symbol->errtxt, "449: Invalid length EAN input in linear component");
                return ZINT_ERROR_TOO_LONG;
            }
            break;
        case BARCODE_EAN128_CC: cc_width = 4;
            break;
        case BARCODE_RSS14_CC: cc_width = 4;
            break;
        case BARCODE_RSS_LTD_CC: cc_width = 3;
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703



1704
1705
1706
1707
1708
1709
1710
1711
1712
1713

1714

1715

1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
    memset(binary_string, 0, bs);

    if (cc_mode < 1 || cc_mode > 3) {
        cc_mode = 1;
    }

    if (cc_mode == 1) {
        i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear_width);
        if (i == ZINT_ERROR_TOO_LONG) {
            cc_mode = 2;



        }
    }

    if (cc_mode == 2) {
        /* If the data didn't fit into CC-A it is recalculated for CC-B */
        i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear_width);
        if (i == ZINT_ERROR_TOO_LONG) {
            if (symbol->symbology != BARCODE_EAN128_CC) {
                return ZINT_ERROR_TOO_LONG;
            } else {

                cc_mode = 3;

            }

        }
    }

    if (cc_mode == 3) {
        /* If the data didn't fit in CC-B (and linear part is GS1-128) it is recalculated for CC-C */
        i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear_width);
        if (i == ZINT_ERROR_TOO_LONG) {
            return ZINT_ERROR_TOO_LONG;
        }
    }

    switch (cc_mode) {
            /* Note that ecc_level is only relevant to CC-C */
        case 1: error_number = cc_a(symbol, binary_string, cc_width);
            break;







|


>
>
>





|



<
>
|
>
|
>





|
|
|







1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481

1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
    memset(binary_string, 0, bs);

    if (cc_mode < 1 || cc_mode > 3) {
        cc_mode = 1;
    }

    if (cc_mode == 1) {
        i = cc_binary_string(symbol, (char *) source, binary_string, cc_mode, &cc_width, &ecc_level, linear_width);
        if (i == ZINT_ERROR_TOO_LONG) {
            cc_mode = 2;
            memset(binary_string, 0, bs);
        } else if (i != 0) {
            return i;
        }
    }

    if (cc_mode == 2) {
        /* If the data didn't fit into CC-A it is recalculated for CC-B */
        i = cc_binary_string(symbol, (char *) source, binary_string, cc_mode, &cc_width, &ecc_level, linear_width);
        if (i == ZINT_ERROR_TOO_LONG) {
            if (symbol->symbology != BARCODE_EAN128_CC) {
                return ZINT_ERROR_TOO_LONG;

            }
            cc_mode = 3;
            memset(binary_string, 0, bs);
        } else if (i != 0) {
            return i;
        }
    }

    if (cc_mode == 3) {
        /* If the data didn't fit in CC-B (and linear part is GS1-128) it is recalculated for CC-C */
        i = cc_binary_string(symbol, (char *) source, binary_string, cc_mode, &cc_width, &ecc_level, linear_width);
        if (i != 0) {
            return i;
        }
    }

    switch (cc_mode) {
            /* Note that ecc_level is only relevant to CC-C */
        case 1: error_number = cc_a(symbol, binary_string, cc_width);
            break;
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795



1796

1797
1798
1799
1800
1801
1802
1803
1804
1805
1806

















1807
1808
1809
1810
1811





1812
1813
1814
1815
1816
1817
1818

    top_shift = 0;
    bottom_shift = 0;

    switch (symbol->symbology) {
            /* Determine horizontal alignment (according to section 12.3) */
        case BARCODE_EANX_CC:
            switch (pri_len) {
                case 7: /* EAN-8 */
                case 10: /* EAN-8 + 2 */
                case 13: /* EAN-8 + 5 */



                    bottom_shift = 13;

                    break;
                case 12: /* EAN-13 */
                case 15: /* EAN-13 + 2 */
                case 18: /* EAN-13 + 5 */
                    bottom_shift = 2;
                    break;
            }
            break;
        case BARCODE_EAN128_CC: if (cc_mode == 3) {
                bottom_shift = 7;

















            }
            break;
        case BARCODE_RSS14_CC: bottom_shift = 4;
            break;
        case BARCODE_RSS_LTD_CC: bottom_shift = 9;





            break;
        case BARCODE_RSS_EXP_CC: k = 1;
            while ((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) {
                k++;
            }
            top_shift = k;
            break;







|
|
|
|
>
>
>
|
>

|
|
|






>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>




|
>
>
>
>
>







1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615

    top_shift = 0;
    bottom_shift = 0;

    switch (symbol->symbology) {
            /* Determine horizontal alignment (according to section 12.3) */
        case BARCODE_EANX_CC:
            switch (ustrlen(linear->text)) { /* Use zero-padded length */
                case 8: /* EAN-8 */
                case 11: /* EAN-8 + 2 */
                case 14: /* EAN-8 + 5 */
                    if (cc_mode == 1) {
                        bottom_shift = 3;
                    } else {
                        bottom_shift = 13;
                    }
                    break;
                case 13: /* EAN-13 */
                case 16: /* EAN-13 + 2 */
                case 19: /* EAN-13 + 5 */
                    bottom_shift = 2;
                    break;
            }
            break;
        case BARCODE_EAN128_CC: if (cc_mode == 3) {
                bottom_shift = 7;
            } else {
                /* ISO/IEC 24723:2010 12.3 g) "GS1-128 components linked to the right quiet zone of the CC-A or CC-B: the CC-A or CC-B component is
                   aligned with the last space module of one of the rightmost symbol characters of the linear component. To
                   calculate the target Code 128 symbol character position for alignment, number the positions from right to
                   left (0 is the Stop character, 1 is the Check character, etc.), and then Position = (total number of Code 128 symbol characters – 9) div 2"
                 */
                int num_symbols = (linear_width - 2) / 11;
                int position = (num_symbols - 9) / 2;
                int calc_shift = linear->width - position * 11 - 1 - symbol->width; /* Less 1 to align with last space module */
                if (position) {
                    calc_shift -= 2; /* Less additional stop modules */
                }
                if (calc_shift > 0) {
                    top_shift = calc_shift;
                } else if (calc_shift < 0) {
                    bottom_shift = -calc_shift;
                }
            }
            break;
        case BARCODE_RSS14_CC: bottom_shift = 4;
            break;
        case BARCODE_RSS_LTD_CC: 
            if (cc_mode == 1) {
                top_shift = 1;
            } else {
                bottom_shift = 9;
            }
            break;
        case BARCODE_RSS_EXP_CC: k = 1;
            while ((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) {
                k++;
            }
            top_shift = k;
            break;
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
            if (module_is_set(linear, i, j)) {
                set_module(symbol, i + symbol->rows, j + bottom_shift);
            } else {
                unset_module(symbol, i + symbol->rows, j + bottom_shift);
            }
        }
    }
    if ((linear->width + bottom_shift) > symbol->width) {
        symbol->width = linear->width + bottom_shift;
    }
    if ((symbol->width + top_shift) > symbol->width) {
        symbol->width += top_shift;
    }
    symbol->rows += linear->rows;
    ustrcpy(symbol->text, (unsigned char *) linear->text);

    ZBarcode_Delete(linear);

    return error_number;
}









|

<
|









<
<
1652
1653
1654
1655
1656
1657
1658
1659
1660

1661
1662
1663
1664
1665
1666
1667
1668
1669
1670


            if (module_is_set(linear, i, j)) {
                set_module(symbol, i + symbol->rows, j + bottom_shift);
            } else {
                unset_module(symbol, i + symbol->rows, j + bottom_shift);
            }
        }
    }
    if ((linear->width + bottom_shift) > symbol->width + top_shift) {
        symbol->width = linear->width + bottom_shift;

    } else if ((symbol->width + top_shift) > linear->width + bottom_shift) {
        symbol->width += top_shift;
    }
    symbol->rows += linear->rows;
    ustrcpy(symbol->text, (unsigned char *) linear->text);

    ZBarcode_Delete(linear);

    return error_number;
}


Changes to jni/zint/backend/composite.h.
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#define NUMERIC		110
#define ALPHA		97
#define ISOIEC		105
#define	INVALID_CHAR	100
#define	ANY_ENC		120
#define ALPHA_OR_ISO	121

/* CC-A component coefficients from ISO/IEC 24728:2006 Annex F */
static const unsigned short int ccaCoeffs[30] = {
    /* k = 4 */
    522, 568, 723, 809,

    /* k = 5 */







|
<
<
<
<
<
<







25
26
27
28
29
30
31
32






33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */







/* CC-A component coefficients from ISO/IEC 24728:2006 Annex F */
static const unsigned short int ccaCoeffs[30] = {
    /* k = 4 */
    522, 568, 723, 809,

    /* k = 5 */
Changes to jni/zint/backend/dmatrix.c.
33
34
35
36
37
38
39

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#ifdef _MSC_VER
#include <malloc.h>
/* ceilf (C99) not before MSVC++2013 (C++ 12.0) */
#if _MSC_VER < 1800
#define ceilf ceil
#endif
#endif
#include "reedsol.h"
#include "common.h"
#include "dmatrix.h"

/* Annex M placement alorithm low level */
static void ecc200placementbit(int *array, const int NR, const int NC, int r, int c, const int p, const char b) {
    if (r < 0) {
        r += NR;
        c += 4 - ((NR + 4) % 8);







>


<











|
|







33
34
35
36
37
38
39
40
41
42

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>

#include <ctype.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#ifdef _MSC_VER
#include <malloc.h>
/* ceilf (C99) not before MSVC++2013 (C++ 12.0) */
#if _MSC_VER < 1800
#define ceilf ceil
#endif
#endif
#include "common.h"
#include "reedsol.h"
#include "dmatrix.h"

/* Annex M placement alorithm low level */
static void ecc200placementbit(int *array, const int NR, const int NC, int r, int c, const int p, const char b) {
    if (r < 0) {
        r += NR;
        c += 4 - ((NR + 4) % 8);
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
    } while (best_scheme == DM_NULL); // step (s)

    return best_scheme;
}

/* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate
   Supports encoding FNC1 in supporting systems */
static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], unsigned char target[], int *last_mode, size_t *length_p, int process_buffer[], int *process_p) {

    size_t sp;
    int tp, i, gs1;
    int current_mode, next_mode;
    size_t inputlen = *length_p;
    int debug = symbol->debug;
#ifndef _MSC_VER
    char binary[2 * inputlen];
#else
    char* binary = (char*) _alloca(2 * inputlen);
#endif

    sp = 0;
    tp = 0;
    memset(process_buffer, 0, 8);
    *process_p = 0;
    strcpy(binary, "");

    /* step (a) */
    current_mode = DM_ASCII;
    next_mode = DM_ASCII;

    /* gs1 flag values: 0: no gs1, 1: gs1 with FNC1 serparator, 2: GS separator */
    if (symbol->input_mode == GS1_MODE) {
        if (symbol->output_options & GS1_GS_SEPARATOR) {
            gs1 = 2;
        } else {
            gs1 = 1;
        }
    } else {
        gs1 = 0;







|







|

|













|







524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
    } while (best_scheme == DM_NULL); // step (s)

    return best_scheme;
}

/* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate
   Supports encoding FNC1 in supporting systems */
static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], unsigned char target[], int *last_mode, size_t *length_p, int process_buffer[], int *process_p, int *binlen_p) {

    size_t sp;
    int tp, i, gs1;
    int current_mode, next_mode;
    size_t inputlen = *length_p;
    int debug = symbol->debug;
#ifndef _MSC_VER
    char binary[2 * inputlen + 1 + 4 + 1]; /* Allow for GS1/READER_INIT, ECI and nul chars overhead */
#else
    char* binary = (char*) _alloca(2 * inputlen + 1 + 4 + 1);
#endif

    sp = 0;
    tp = 0;
    memset(process_buffer, 0, 8);
    *process_p = 0;
    strcpy(binary, "");

    /* step (a) */
    current_mode = DM_ASCII;
    next_mode = DM_ASCII;

    /* gs1 flag values: 0: no gs1, 1: gs1 with FNC1 serparator, 2: GS separator */
    if ((symbol->input_mode & 0x07) == GS1_MODE) {
        if (symbol->output_options & GS1_GS_SEPARATOR) {
            gs1 = 2;
        } else {
            gs1 = 1;
        }
    } else {
        gs1 = 0;
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
            target[tp] = 234;
            tp++; /* Reader Programming */
            strcat(binary, " ");
            if (debug) printf("RP ");
        }
    }

    if (symbol->eci > 3) {
        /* Encode ECI numbers according to Table 6 */
        target[tp] = 241; /* ECI Character */
        tp++;
        if (symbol->eci <= 126) {
            target[tp] = (unsigned char) symbol->eci + 1;
            tp++;
            strcat(binary, " ");
        }
        if ((symbol->eci >= 127) && (symbol->eci <= 16382)) {
            target[tp] = (unsigned char) ((symbol->eci - 127) / 254) + 128;
            tp++;
            target[tp] = (unsigned char) ((symbol->eci - 127) % 254) + 1;
            tp++;
            strcat(binary, "  ");
        }
        if (symbol->eci >= 16383) {
            target[tp] = (unsigned char) ((symbol->eci - 16383) / 64516) + 192;
            tp++;
            target[tp] = (unsigned char) (((symbol->eci - 16383) / 254) % 254) + 1;
            tp++;
            target[tp] = (unsigned char) ((symbol->eci - 16383) % 254) + 1;
            tp++;
            strcat(binary, "   ");
        }
        if (debug) printf("ECI %d ", symbol->eci + 1);
    }

    /* Check for Macro05/Macro06 */
    /* "[)>[RS]05[GS]...[RS][EOT]" -> CW 236 */
    /* "[)>[RS]06[GS]...[RS][EOT]" -> CW 237 */







|






|






|








|







577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
            target[tp] = 234;
            tp++; /* Reader Programming */
            strcat(binary, " ");
            if (debug) printf("RP ");
        }
    }

    if (symbol->eci > 0) {
        /* Encode ECI numbers according to Table 6 */
        target[tp] = 241; /* ECI Character */
        tp++;
        if (symbol->eci <= 126) {
            target[tp] = (unsigned char) symbol->eci + 1;
            tp++;
            strcat(binary, "  ");
        }
        if ((symbol->eci >= 127) && (symbol->eci <= 16382)) {
            target[tp] = (unsigned char) ((symbol->eci - 127) / 254) + 128;
            tp++;
            target[tp] = (unsigned char) ((symbol->eci - 127) % 254) + 1;
            tp++;
            strcat(binary, "   ");
        }
        if (symbol->eci >= 16383) {
            target[tp] = (unsigned char) ((symbol->eci - 16383) / 64516) + 192;
            tp++;
            target[tp] = (unsigned char) (((symbol->eci - 16383) / 254) % 254) + 1;
            tp++;
            target[tp] = (unsigned char) ((symbol->eci - 16383) % 254) + 1;
            tp++;
            strcat(binary, "    ");
        }
        if (debug) printf("ECI %d ", symbol->eci + 1);
    }

    /* Check for Macro05/Macro06 */
    /* "[)>[RS]05[GS]...[RS][EOT]" -> CW 236 */
    /* "[)>[RS]06[GS]...[RS][EOT]" -> CW 237 */
967
968
969
970
971
972
973

974
975
976
977
978
979
980
981
            } else {
                next_mode = DM_ASCII;
                if (debug) printf("ASC ");
            }
        }

        if (tp > 1558) {

            return 0;
        }

    } /* while */

    /* Add length and randomising algorithm to b256 */
    i = 0;
    while (i < tp) {







>
|







967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
            } else {
                next_mode = DM_ASCII;
                if (debug) printf("ASC ");
            }
        }

        if (tp > 1558) {
            strcpy(symbol->errtxt, "520: Data too long to fit in symbol");
            return ZINT_ERROR_TOO_LONG;
        }

    } /* while */

    /* Add length and randomising algorithm to b256 */
    i = 0;
    while (i < tp) {
1014
1015
1016
1017
1018
1019
1020

1021
1022
1023
1024
1025
1026
1027
1028
            } else {
                target[i] = (unsigned char) (temp - 256);
            }
        }
    }

    *(last_mode) = current_mode;

    return tp;
}

static int dm200encode_remainder(unsigned char target[], int target_length, const unsigned char source[], const size_t inputlen, const int last_mode, const int process_buffer[], const int process_p, const int symbols_left) {
    int debug = 0;

    switch (last_mode) {
        case DM_C40:







>
|







1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
            } else {
                target[i] = (unsigned char) (temp - 256);
            }
        }
    }

    *(last_mode) = current_mode;
    *binlen_p = tp;
    return 0;
}

static int dm200encode_remainder(unsigned char target[], int target_length, const unsigned char source[], const size_t inputlen, const int last_mode, const int process_buffer[], const int process_p, const int symbols_left) {
    int debug = 0;

    switch (last_mode) {
        case DM_C40:
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
                target[tp] = (unsigned char) (temp - 254);
                tp++;
            }
        }
    }
}

int data_matrix_200(struct zint_symbol *symbol,const unsigned char source[], const size_t in_length) {
	int i, skew = 0;
   size_t inputlen=in_length;
    unsigned char binary[2200];
    int binlen;
    int process_buffer[8]; /* holds remaining data to finalised */
    int process_p; /* number of characters left to finalise */
    int symbolsize, optionsize, calcsize;
    int taillength, error_number = 0;
    int H, W, FH, FW, datablock, bytes, rsblock;
    int last_mode = DM_ASCII;
    int symbols_left;

    /* inputlen may be decremented by 2 if macro character is used */
    binlen = dm200encode(symbol, source, binary, &last_mode, &inputlen, process_buffer, &process_p);

    if (binlen == 0) {
        strcpy(symbol->errtxt, "520: Data too long to fit in symbol");
        return ZINT_ERROR_TOO_LONG;
    }

    if ((symbol->option_2 >= 1) && (symbol->option_2 <= DMSIZESCOUNT)) {
        optionsize = intsymbol[symbol->option_2 - 1];
    } else {
        optionsize = -1;
    }







|
|
|











|
|
<
<
|







1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181


1182
1183
1184
1185
1186
1187
1188
1189
                target[tp] = (unsigned char) (temp - 254);
                tp++;
            }
        }
    }
}

static int data_matrix_200(struct zint_symbol *symbol,const unsigned char source[], const size_t in_length) {
    int i, skew = 0;
    size_t inputlen = in_length;
    unsigned char binary[2200];
    int binlen;
    int process_buffer[8]; /* holds remaining data to finalised */
    int process_p; /* number of characters left to finalise */
    int symbolsize, optionsize, calcsize;
    int taillength, error_number = 0;
    int H, W, FH, FW, datablock, bytes, rsblock;
    int last_mode = DM_ASCII;
    int symbols_left;

    /* inputlen may be decremented by 2 if macro character is used */
    error_number = dm200encode(symbol, source, binary, &last_mode, &inputlen, process_buffer, &process_p, &binlen);
    if (error_number != 0) {


        return error_number;
    }

    if ((symbol->option_2 >= 1) && (symbol->option_2 <= DMSIZESCOUNT)) {
        optionsize = intsymbol[symbol->option_2 - 1];
    } else {
        optionsize = -1;
    }
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344

    symbol->rows = H;
    symbol->width = W;

    return error_number;
}

int dmatrix(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) {
    int error_number;

    if (symbol->option_1 <= 1) {
        /* ECC 200 */
        error_number = data_matrix_200(symbol, source, in_length);
    } else {
        /* ECC 000 - 140 */
        strcpy(symbol->errtxt, "524: Older Data Matrix standards are no longer supported");
        error_number = ZINT_ERROR_INVALID_OPTION;
    }

    return error_number;
}









|













<
<
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342



    symbol->rows = H;
    symbol->width = W;

    return error_number;
}

INTERNAL int dmatrix(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) {
    int error_number;

    if (symbol->option_1 <= 1) {
        /* ECC 200 */
        error_number = data_matrix_200(symbol, source, in_length);
    } else {
        /* ECC 000 - 140 */
        strcpy(symbol->errtxt, "524: Older Data Matrix standards are no longer supported");
        error_number = ZINT_ERROR_INVALID_OPTION;
    }

    return error_number;
}


Changes to jni/zint/backend/dmatrix.h.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/*
    Containes Extended Rectangular Data Matrix (DMRE)
    See http://www.dmre.info for information
    Contact: harald.oehlmann@eurodatacouncil.org
 */

#include "common.h"

#ifndef __IEC16022ECC200_H
#define __IEC16022ECC200_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

extern int data_matrix_200(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#define MAXBARCODE 3116

#define DM_NULL         0
#define DM_ASCII	1
#define DM_C40		2
#define DM_TEXT		3







>







<
<
|
|
<
<
<
<
<
<
<
<
<







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39


40
41









42
43
44
45
46
47
48
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/*
    Containes Extended Rectangular Data Matrix (DMRE)
    See http://www.dmre.info for information
    Contact: harald.oehlmann@eurodatacouncil.org
 */



#ifndef __DMATRIX_H
#define __DMATRIX_H










#define MAXBARCODE 3116

#define DM_NULL         0
#define DM_ASCII	1
#define DM_C40		2
#define DM_TEXT		3
251
252
253
254
255
256
257
258
259
260
    /*28*/ 38, /* 22x48 */ 41, /* 24x48 */ 42, /* 20x64 */ 42, /* 36x36 */
    /*32*/ 42, /* 26x48 */ 46, /* 24x64 */ 48, /* 40x40 */ 50, /* 26x64 */
    /*36*/ 56, /* 44x44 */ 68, /* 48x48 */ 42, /* 52x52 */ 56, /* 64x64 */
	/*40*/ 36, /* 72x72 */ 48, /* 80x80 */ 56, /* 88x88 */ 68, /* 96x96 */
    /*44*/ 56, /*104x104*/ 68, /*120x120*/ 62, /*132x132*/ 62  /*144x144*/
};


#endif








<
|
<
241
242
243
244
245
246
247

248

    /*28*/ 38, /* 22x48 */ 41, /* 24x48 */ 42, /* 20x64 */ 42, /* 36x36 */
    /*32*/ 42, /* 26x48 */ 46, /* 24x64 */ 48, /* 40x40 */ 50, /* 26x64 */
    /*36*/ 56, /* 44x44 */ 68, /* 48x48 */ 42, /* 52x52 */ 56, /* 64x64 */
	/*40*/ 36, /* 72x72 */ 48, /* 80x80 */ 56, /* 88x88 */ 68, /* 96x96 */
    /*44*/ 56, /*104x104*/ 68, /*120x120*/ 62, /*132x132*/ 62  /*144x144*/
};


#endif /* __DMATRIX_H */

Changes to jni/zint/backend/dotcode.c.
1
2
3
4
5
6
7
8
9
10
11
12
/* dotcode.c - Handles DotCode */

/*
    libzint - the open source barcode library
    Copyright (C) 2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.




|







1
2
3
4
5
6
7
8
9
10
11
12
/* dotcode.c - Handles DotCode */

/*
    libzint - the open source barcode library
    Copyright (C) 2017-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
25
26
27
28
29
30
31

32
33
34

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

52
53
54
55
56
57
58
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/*
 * Attempts to encode DotCode according to AIMD013 Rev 1.34a, dated Feb 19, 2009

 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#ifndef _MSC_VER
#include <stdint.h>
#else
#include "ms_stdint.h"
#include <malloc.h>
#endif
#include "common.h"
#include "gs1.h"

#define GF 113
#define PM 3


/* DotCode symbol character dot patterns, from Annex C */
static const unsigned short int dot_patterns[113] = {
    0x155, 0x0ab, 0x0ad, 0x0b5, 0x0d5, 0x156, 0x15a, 0x16a, 0x1aa, 0x0ae,
    0x0b6, 0x0ba, 0x0d6, 0x0da, 0x0ea, 0x12b, 0x12d, 0x135, 0x14b, 0x14d,
    0x153, 0x159, 0x165, 0x169, 0x195, 0x1a5, 0x1a9, 0x057, 0x05b, 0x05d,
    0x06b, 0x06d, 0x075, 0x097, 0x09b, 0x09d, 0x0a7, 0x0b3, 0x0b9, 0x0cb,







>



>

















>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/*
 * Attempts to encode DotCode according to AIMD013 Rev 1.34a, dated Feb 19, 2009
 * Incorporating suggestions from Terry Burton at BWIPP
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#ifndef _MSC_VER
#include <stdint.h>
#else
#include "ms_stdint.h"
#include <malloc.h>
#endif
#include "common.h"
#include "gs1.h"

#define GF 113
#define PM 3
#define SCORE_UNLIT_EDGE    -99999

/* DotCode symbol character dot patterns, from Annex C */
static const unsigned short int dot_patterns[113] = {
    0x155, 0x0ab, 0x0ad, 0x0b5, 0x0d5, 0x156, 0x15a, 0x16a, 0x1aa, 0x0ae,
    0x0b6, 0x0ba, 0x0d6, 0x0da, 0x0ea, 0x12b, 0x12d, 0x135, 0x14b, 0x14d,
    0x153, 0x159, 0x165, 0x169, 0x195, 0x1a5, 0x1a9, 0x057, 0x05b, 0x05d,
    0x06b, 0x06d, 0x075, 0x097, 0x09b, 0x09d, 0x0a7, 0x0b3, 0x0b9, 0x0cb,
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
        }
    }

    return 1;
}

/* Dot pattern scoring routine from Annex A */
const int score_array(char Dots[], int Hgt, int Wid) {
    int x, y, worstedge, first, last, sum;
    int penalty_local = 0;
    int penalty = 0;
    int t = 0, b = 0, l = 0, r = 0;

    // first, guard against "pathelogical" gaps in the array
    if (Hgt & 1) {
        if (Hgt < 12) {
            sum = 0;
            for (x = 1; x < Wid - 1; x++) {
                if (!(clr_col(Dots, Hgt, Wid, x))) {







|



<







100
101
102
103
104
105
106
107
108
109
110

111
112
113
114
115
116
117
        }
    }

    return 1;
}

/* Dot pattern scoring routine from Annex A */
static const int score_array(char Dots[], int Hgt, int Wid) {
    int x, y, worstedge, first, last, sum;
    int penalty_local = 0;
    int penalty = 0;


    // first, guard against "pathelogical" gaps in the array
    if (Hgt & 1) {
        if (Hgt < 12) {
            sum = 0;
            for (x = 1; x < Wid - 1; x++) {
                if (!(clr_col(Dots, Hgt, Wid, x))) {
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
                first = x;
            }
            last = x;
            sum++;
        }
    worstedge = sum + last - first;
    worstedge *= Hgt;
    
    if (sum == 0) {
        t = 1;
    }

    sum = 0;
    first = -1;
    last = -1;

    //across the bottom edge, ditto
    for (x = Wid & 1; x < Wid; x += 2)
        if (get_dot(Dots, Hgt, Wid, x, Hgt - 1)) {
            if (first < 0) {
                first = x;
            }
            last = x;
            sum++;
        }
    sum += last - first;
    sum *= Hgt;
    if (sum < worstedge) {
        worstedge = sum;
    }
    
    if (sum == 0) {
        b = 2;
    }

    sum = 0;
    first = -1;
    last = -1;

    //down the left edge, ditto
    for (y = 0; y < Hgt; y += 2)
        if (get_dot(Dots, Hgt, Wid, 0, y)) {
            if (first < 0) {
                first = y;
            }
            last = y;
            sum++;
        }
    sum += last - first;
    sum *= Wid;
    if (sum < worstedge) {
        worstedge = sum;
    }
    
    if (sum == 0) {
        l = 4;
    }

    sum = 0;
    first = -1;
    last = -1;

    //down the right edge, ditto
    for (y = Hgt & 1; y < Hgt; y += 2)
        if (get_dot(Dots, Hgt, Wid, Wid - 1, y)) {
            if (first < 0) {
                first = y;
            }
            last = y;
            sum++;
        }
    sum += last - first;
    sum *= Wid;
    if (sum < worstedge) {
        worstedge = sum;
    }
    
    if (sum == 0) {
        r = 8;
    }

    penalty += (t + b + l + r) * 100000;

    // throughout the array, count the # of unprinted 5-somes (cross patterns)
    // plus the # of printed dots surrounded by 8 unprinted neighbors
    sum = 0;
    for (y = 0; y < Hgt; y++) {
        for (x = y & 1; x < Wid; x += 2) {
            if ((!get_dot(Dots, Hgt, Wid, x - 1, y - 1))
                    && (!get_dot(Dots, Hgt, Wid, x + 1, y - 1))







|

|




















|

|




















|

|




















|

|


<
<







163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243


244
245
246
247
248
249
250
                first = x;
            }
            last = x;
            sum++;
        }
    worstedge = sum + last - first;
    worstedge *= Hgt;

    if (sum == 0) {
        return SCORE_UNLIT_EDGE;      // guard against empty top edge
    }

    sum = 0;
    first = -1;
    last = -1;

    //across the bottom edge, ditto
    for (x = Wid & 1; x < Wid; x += 2)
        if (get_dot(Dots, Hgt, Wid, x, Hgt - 1)) {
            if (first < 0) {
                first = x;
            }
            last = x;
            sum++;
        }
    sum += last - first;
    sum *= Hgt;
    if (sum < worstedge) {
        worstedge = sum;
    }

    if (sum == 0) {
        return SCORE_UNLIT_EDGE;      // guard against empty bottom edge
    }

    sum = 0;
    first = -1;
    last = -1;

    //down the left edge, ditto
    for (y = 0; y < Hgt; y += 2)
        if (get_dot(Dots, Hgt, Wid, 0, y)) {
            if (first < 0) {
                first = y;
            }
            last = y;
            sum++;
        }
    sum += last - first;
    sum *= Wid;
    if (sum < worstedge) {
        worstedge = sum;
    }

    if (sum == 0) {
        return SCORE_UNLIT_EDGE;      // guard against empty left edge
    }

    sum = 0;
    first = -1;
    last = -1;

    //down the right edge, ditto
    for (y = Hgt & 1; y < Hgt; y += 2)
        if (get_dot(Dots, Hgt, Wid, Wid - 1, y)) {
            if (first < 0) {
                first = y;
            }
            last = y;
            sum++;
        }
    sum += last - first;
    sum *= Wid;
    if (sum < worstedge) {
        worstedge = sum;
    }

    if (sum == 0) {
        return SCORE_UNLIT_EDGE;      // guard against empty right edge
    }



    // throughout the array, count the # of unprinted 5-somes (cross patterns)
    // plus the # of printed dots surrounded by 8 unprinted neighbors
    sum = 0;
    for (y = 0; y < Hgt; y++) {
        for (x = y & 1; x < Wid; x += 2) {
            if ((!get_dot(Dots, Hgt, Wid, x - 1, y - 1))
                    && (!get_dot(Dots, Hgt, Wid, x + 1, y - 1))
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
}

//-------------------------------------------------------------------------
// "rsencode(nd,nc)" adds "nc" R-S check words to "nd" data words in wd[]
// employing Galois Field GF, where GF is prime, with a prime modulus of PM
//-------------------------------------------------------------------------

void rsencode(int nd, int nc, unsigned char *wd) {
    int i, j, k, nw, start, step, root[GF], c[GF];

    // Start by generating "nc" roots (antilogs):
    root[0] = 1;
    for (i = 1; (i <= nc) && (i < GF); i++)
        root[i] = (PM * root[i - 1]) % GF;








|







264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
}

//-------------------------------------------------------------------------
// "rsencode(nd,nc)" adds "nc" R-S check words to "nd" data words in wd[]
// employing Galois Field GF, where GF is prime, with a prime modulus of PM
//-------------------------------------------------------------------------

static void rsencode(int nd, int nc, unsigned char *wd) {
    int i, j, k, nw, start, step, root[GF], c[GF];

    // Start by generating "nc" roots (antilogs):
    root[0] = 1;
    for (i = 1; (i <= nc) && (i < GF); i++)
        root[i] = (PM * root[i - 1]) % GF;

308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
        }
        for (i = ND; i < NW; i++)
            wd[start + i * step] = (GF - wd[start + i * step]) % GF;
    }
}

/* Check if the next character is directly encodable in code set A (Annex F.II.D) */
int datum_a(const unsigned char source[], int position, int length) {
    int retval = 0;

    if (position < length) {
        if (source[position] <= 95) {
            retval = 1;
        }
    }

    return retval;
}

/* Check if the next character is directly encodable in code set B (Annex F.II.D) */
int datum_b(const unsigned char source[], int position, int length) {
    int retval = 0;

    if (position < length) {
        if ((source[position] >= 32) && (source[position] <= 127)) {
            retval = 1;
        }








|












|







308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
        }
        for (i = ND; i < NW; i++)
            wd[start + i * step] = (GF - wd[start + i * step]) % GF;
    }
}

/* Check if the next character is directly encodable in code set A (Annex F.II.D) */
static int datum_a(const unsigned char source[], int position, int length) {
    int retval = 0;

    if (position < length) {
        if (source[position] <= 95) {
            retval = 1;
        }
    }

    return retval;
}

/* Check if the next character is directly encodable in code set B (Annex F.II.D) */
static int datum_b(const unsigned char source[], int position, int length) {
    int retval = 0;

    if (position < length) {
        if ((source[position] >= 32) && (source[position] <= 127)) {
            retval = 1;
        }

348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
        }
    }

    return retval;
}

/* Check if the next characters are directly encodable in code set C (Annex F.II.D) */
int datum_c(const unsigned char source[], int position, int length) {
    int retval = 0;

    if (position <= length - 2) {
        if (((source[position] >= '0') && (source[position] <= '9'))
                && ((source[position + 1] >= '0') && (source[position + 1] <= '9')))
            retval = 1;
    }

    return retval;
}

/* Returns how many consecutive digits lie immediately ahead (Annex F.II.A) */
int n_digits(const unsigned char source[], int position, int length) {
    int i;

    for (i = position; ((source[i] >= '0') && (source[i] <= '9')) && (i < length); i++);

    return i - position;
}

/* checks ahead for 10 or more digits starting "17xxxxxx10..." (Annex F.II.B) */
int seventeen_ten(const unsigned char source[], int position, int length) {
    int found = 0;

    if (n_digits(source, position, length) >= 10) {
        if (((source[position] == '1') && (source[position + 1] == '7'))
                && ((source[position + 8] == '1') && (source[position + 9] == '0'))) {
            found = 1;
        }
    }

    return found;
}

/*  checks how many characters ahead can be reached while datum_c is true,
 *  returning the resulting number of codewords (Annex F.II.E)
 */
int ahead_c(const unsigned char source[], int position, int length) {
    int count = 0;
    int i;

    for (i = position; (i < length) && datum_c(source, i, length); i += 2) {
        count++;
    }

    return count;
}

/* Annex F.II.F */
int try_c(const unsigned char source[], int position, int length) {
    int retval = 0;

    if (n_digits(source, position, length) > 0) {
        if (ahead_c(source, position, length) > ahead_c(source, position + 1, length)) {
            retval = ahead_c(source, position, length);
        }
    }

    return retval;
}

/* Annex F.II.G */
int ahead_a(const unsigned char source[], int position, int length) {
    int count = 0;
    int i;

    for (i = position; ((i < length) && datum_a(source, i, length))
            && (try_c(source, i, length) < 2); i++) {
        count++;
    }

    return count;
}

/* Annex F.II.H */
int ahead_b(const unsigned char source[], int position, int length) {
    int count = 0;
    int i;

    for (i = position; ((i < length) && datum_b(source, i, length))
            && (try_c(source, i, length) < 2); i++) {
        count++;
    }

    return count;
}

/* checks if the next character is in the range 128 to 255  (Annex F.II.I) */
int binary(const unsigned char source[], int position) {
    int retval = 0;

    if (source[position] >= 128) {
        retval = 1;
    }

    return retval;
}

/* Analyse input data stream and encode using algorithm from Annex F */
int dotcode_encode_message(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char *codeword_array, int *binary_finish) {
    int input_position, array_length, i;
    char encoding_mode;
    int inside_macro;
    int debug = symbol->debug;
    int binary_buffer_size = 0;
    int lawrencium[6]; // Reversed radix 103 values








|












|








|















|











|












|












|












|










|







348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
        }
    }

    return retval;
}

/* Check if the next characters are directly encodable in code set C (Annex F.II.D) */
static int datum_c(const unsigned char source[], int position, int length) {
    int retval = 0;

    if (position <= length - 2) {
        if (((source[position] >= '0') && (source[position] <= '9'))
                && ((source[position + 1] >= '0') && (source[position + 1] <= '9')))
            retval = 1;
    }

    return retval;
}

/* Returns how many consecutive digits lie immediately ahead (Annex F.II.A) */
static int n_digits(const unsigned char source[], int position, int length) {
    int i;

    for (i = position; ((source[i] >= '0') && (source[i] <= '9')) && (i < length); i++);

    return i - position;
}

/* checks ahead for 10 or more digits starting "17xxxxxx10..." (Annex F.II.B) */
static int seventeen_ten(const unsigned char source[], int position, int length) {
    int found = 0;

    if (n_digits(source, position, length) >= 10) {
        if (((source[position] == '1') && (source[position + 1] == '7'))
                && ((source[position + 8] == '1') && (source[position + 9] == '0'))) {
            found = 1;
        }
    }

    return found;
}

/*  checks how many characters ahead can be reached while datum_c is true,
 *  returning the resulting number of codewords (Annex F.II.E)
 */
static int ahead_c(const unsigned char source[], int position, int length) {
    int count = 0;
    int i;

    for (i = position; (i < length) && datum_c(source, i, length); i += 2) {
        count++;
    }

    return count;
}

/* Annex F.II.F */
static int try_c(const unsigned char source[], int position, int length) {
    int retval = 0;

    if (n_digits(source, position, length) > 0) {
        if (ahead_c(source, position, length) > ahead_c(source, position + 1, length)) {
            retval = ahead_c(source, position, length);
        }
    }

    return retval;
}

/* Annex F.II.G */
static int ahead_a(const unsigned char source[], int position, int length) {
    int count = 0;
    int i;

    for (i = position; ((i < length) && datum_a(source, i, length))
            && (try_c(source, i, length) < 2); i++) {
        count++;
    }

    return count;
}

/* Annex F.II.H */
static int ahead_b(const unsigned char source[], int position, int length) {
    int count = 0;
    int i;

    for (i = position; ((i < length) && datum_b(source, i, length))
            && (try_c(source, i, length) < 2); i++) {
        count++;
    }

    return count;
}

/* checks if the next character is in the range 128 to 255  (Annex F.II.I) */
static int binary(const unsigned char source[], int position) {
    int retval = 0;

    if (source[position] >= 128) {
        retval = 1;
    }

    return retval;
}

/* Analyse input data stream and encode using algorithm from Annex F */
static int dotcode_encode_message(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char *codeword_array, int *binary_finish) {
    int input_position, array_length, i;
    char encoding_mode;
    int inside_macro;
    int debug = symbol->debug;
    int binary_buffer_size = 0;
    int lawrencium[6]; // Reversed radix 103 values

472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
    inside_macro = 0;

    if (symbol->output_options & READER_INIT) {
        codeword_array[array_length] = 109; // FNC3
        array_length++;
    }

    if (symbol->input_mode != GS1_MODE) {
        if (length > 2) {
            if (((source[input_position] >= '0') && (source[input_position] <= '9')) &&
                    ((source[input_position + 1] >= '0') && (source[input_position + 1] <= '9'))) {
                codeword_array[array_length] = 107; // FNC1
                array_length++;
            }
        }
    }

    if (symbol->eci > 3) {
        codeword_array[array_length] = 108; // FNC2
        array_length++;
        if (symbol->eci <= 39) {
            codeword_array[array_length] = symbol->eci;
            array_length++;
        } else {
            // the next three codewords valued A, B & C encode the ECI value of
            // (A - 40) * 12769 + B * 113 + C + 40 (Section 5.2.1)
            int a, b, c;
            a = (symbol->eci - 40) % 12769;
            b = ((symbol->eci - 40) - (12769 * a)) % 113;
            c = (symbol->eci - 40) - (12769 * a) - (113 * b);

            codeword_array[array_length] = a + 40;
            array_length++;
            codeword_array[array_length] = b;
            array_length++;
            codeword_array[array_length] = c;







|









|









|
|







472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
    inside_macro = 0;

    if (symbol->output_options & READER_INIT) {
        codeword_array[array_length] = 109; // FNC3
        array_length++;
    }

    if ((symbol->input_mode & 0x07) != GS1_MODE) {
        if (length > 2) {
            if (((source[input_position] >= '0') && (source[input_position] <= '9')) &&
                    ((source[input_position + 1] >= '0') && (source[input_position + 1] <= '9'))) {
                codeword_array[array_length] = 107; // FNC1
                array_length++;
            }
        }
    }

    if (symbol->eci > 0) {
        codeword_array[array_length] = 108; // FNC2
        array_length++;
        if (symbol->eci <= 39) {
            codeword_array[array_length] = symbol->eci;
            array_length++;
        } else {
            // the next three codewords valued A, B & C encode the ECI value of
            // (A - 40) * 12769 + B * 113 + C + 40 (Section 5.2.1)
            int a, b, c;
            a = (symbol->eci - 40) / 12769;
            b = ((symbol->eci - 40) - (12769 * a)) / 113;
            c = (symbol->eci - 40) - (12769 * a) - (113 * b);

            codeword_array[array_length] = a + 40;
            array_length++;
            codeword_array[array_length] = b;
            array_length++;
            codeword_array[array_length] = c;
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
                if (debug) {
                    printf("B2/1 ");
                }
            }
        }

        if ((!done) && (encoding_mode == 'C')) {
            if (datum_c(source, input_position, length) || ((source[input_position] == '[') && (symbol->input_mode == GS1_MODE))) {
                if (source[input_position] == '[') {
                    codeword_array[array_length] = 107; // FNC1
                    input_position++;
                } else {
                    codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0');
                    input_position += 2;
                }
                array_length++;
                done = 1;
                if (debug) {
                    printf("B2/2 ");
                }
            }
        }

        /* Setp B3 */
        if ((!done) && (encoding_mode == 'C')) {
            if (binary(source, input_position)) {
                if (n_digits(source, input_position + 1, length) > 0) {
                    if ((source[input_position] - 128) < 32) {
                        codeword_array[array_length] = 110; // Bin Shift A
                        array_length++;
                        codeword_array[array_length] = source[input_position] - 128 + 64;







|















|







647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
                if (debug) {
                    printf("B2/1 ");
                }
            }
        }

        if ((!done) && (encoding_mode == 'C')) {
            if (datum_c(source, input_position, length) || ((source[input_position] == '[') && ((symbol->input_mode & 0x07) == GS1_MODE))) {
                if (source[input_position] == '[') {
                    codeword_array[array_length] = 107; // FNC1
                    input_position++;
                } else {
                    codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0');
                    input_position += 2;
                }
                array_length++;
                done = 1;
                if (debug) {
                    printf("B2/2 ");
                }
            }
        }

        /* Step B3 */
        if ((!done) && (encoding_mode == 'C')) {
            if (binary(source, input_position)) {
                if (n_digits(source, input_position + 1, length) > 0) {
                    if ((source[input_position] - 128) < 32) {
                        codeword_array[array_length] = 110; // Bin Shift A
                        array_length++;
                        codeword_array[array_length] = source[input_position] - 128 + 64;
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
                    printf("C1 ");
                }
            }
        }

        /* Step C2 */
        if ((!done) && (encoding_mode == 'B')) {
            if ((source[input_position] == '[') && (symbol->input_mode == GS1_MODE)) {
                codeword_array[array_length] = 107; // FNC1
                array_length++;
                input_position++;
                done = 1;
                if (debug) {
                    printf("C2/1 ");
                }







|







748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
                    printf("C1 ");
                }
            }
        }

        /* Step C2 */
        if ((!done) && (encoding_mode == 'B')) {
            if ((source[input_position] == '[') && ((symbol->input_mode & 0x07) == GS1_MODE)) {
                codeword_array[array_length] = 107; // FNC1
                array_length++;
                input_position++;
                done = 1;
                if (debug) {
                    printf("C2/1 ");
                }
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
                    printf("D1 ");
                }
            }
        }

        /* Step D2 */
        if ((!done) && (encoding_mode == 'A')) {
            if ((source[input_position] == '[') && (symbol->input_mode == GS1_MODE)) {
                codeword_array[array_length] = 107; // FNC1
                array_length++;
                input_position++;
                done = 1;
                if (debug) {
                    printf("D2/1 ");
                }







|







876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
                    printf("D1 ");
                }
            }
        }

        /* Step D2 */
        if ((!done) && (encoding_mode == 'A')) {
            if ((source[input_position] == '[') && ((symbol->input_mode & 0x07) == GS1_MODE)) {
                codeword_array[array_length] = 107; // FNC1
                array_length++;
                input_position++;
                done = 1;
                if (debug) {
                    printf("D2/1 ");
                }
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112

    return strlen(dot_stream);
}

/* Determines if a given dot is a reserved corner dot
 * to be used by one of the last six bits
 */
int is_corner(int column, int row, int width, int height) {
    int corner = 0;

    /* Top Left */
    if ((column == 0) && (row == 0)) {
        corner = 1;
    }








|







1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112

    return strlen(dot_stream);
}

/* Determines if a given dot is a reserved corner dot
 * to be used by one of the last six bits
 */
static int is_corner(int column, int row, int width, int height) {
    int corner = 0;

    /* Top Left */
    if ((column == 0) && (row == 0)) {
        corner = 1;
    }

1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
        corner = 1;
    }

    return corner;
}

/* Place the dots in the symbol*/
void fold_dotstream(char dot_stream[], int width, int height, char dot_array[]) {
    int column, row;
    int input_position = 0;

    if (height % 2) {
        /* Horizontal folding */
        for (row = 0; row < height; row++) {
            for (column = 0; column < width; column++) {







|







1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
        corner = 1;
    }

    return corner;
}

/* Place the dots in the symbol*/
static void fold_dotstream(char dot_stream[], int width, int height, char dot_array[]) {
    int column, row;
    int input_position = 0;

    if (height % 2) {
        /* Horizontal folding */
        for (row = 0; row < height; row++) {
            for (column = 0; column < width; column++) {
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
        input_position++;
        dot_array[width - 1] = dot_stream[input_position];
        input_position++;
        dot_array[0] = dot_stream[input_position];
    }
}

void apply_mask(int mask, int data_length, unsigned char *masked_codeword_array, unsigned char *codeword_array, int ecc_length, char *dot_stream) {
    int weight = 0;
    int j;
    
    switch (mask) {
        case 0:
            masked_codeword_array[0] = 0;
            for (j = 0; j < data_length; j++) {
                masked_codeword_array[j + 1] = codeword_array[j];
            }
            break;







|


|







1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
        input_position++;
        dot_array[width - 1] = dot_stream[input_position];
        input_position++;
        dot_array[0] = dot_stream[input_position];
    }
}

static void apply_mask(int mask, int data_length, unsigned char *masked_codeword_array, unsigned char *codeword_array, int ecc_length, char *dot_stream) {
    int weight = 0;
    int j;

    switch (mask) {
        case 0:
            masked_codeword_array[0] = 0;
            for (j = 0; j < data_length; j++) {
                masked_codeword_array[j + 1] = codeword_array[j];
            }
            break;
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
            }
            break;
    }

    rsencode(data_length + 1, ecc_length, masked_codeword_array);
}

void force_corners(int width, int height, char *dot_array) {
    if (width % 2) {
        // "Vertical" symbol
        dot_array[0] = '1';
        dot_array[width - 1] = '1';
        dot_array[(height - 2) * width] = '1';
        dot_array[((height - 1) * width) - 1] = '1';
        dot_array[((height - 1) * width) + 1] = '1';
        dot_array[(height * width) - 2] = '1';
    } else {
        // "Horizontal" symbol
        dot_array[0] = '1';
        dot_array[width - 2] = '1';
        dot_array[(2 * width) - 1] = '1';
        dot_array[((height - 1) * width) - 1] = '1';
        dot_array[(height - 1) * width] = '1';
        dot_array[(height * width) - 2] = '1';
    }
}

int dotcode(struct zint_symbol *symbol, const unsigned char source[], int length) {
    int i, j, k;
    size_t jc, n_dots;
    int data_length, ecc_length;
    int min_dots, min_area;
    int height, width;
    int mask_score[8];
    size_t dot_stream_length;







|



















|







1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
            }
            break;
    }

    rsencode(data_length + 1, ecc_length, masked_codeword_array);
}

static void force_corners(int width, int height, char *dot_array) {
    if (width % 2) {
        // "Vertical" symbol
        dot_array[0] = '1';
        dot_array[width - 1] = '1';
        dot_array[(height - 2) * width] = '1';
        dot_array[((height - 1) * width) - 1] = '1';
        dot_array[((height - 1) * width) + 1] = '1';
        dot_array[(height * width) - 2] = '1';
    } else {
        // "Horizontal" symbol
        dot_array[0] = '1';
        dot_array[width - 2] = '1';
        dot_array[(2 * width) - 1] = '1';
        dot_array[((height - 1) * width) - 1] = '1';
        dot_array[(height - 1) * width] = '1';
        dot_array[(height * width) - 2] = '1';
    }
}

INTERNAL int dotcode(struct zint_symbol *symbol, const unsigned char source[], int length) {
    int i, j, k;
    size_t jc, n_dots;
    int data_length, ecc_length;
    int min_dots, min_area;
    int height, width;
    int mask_score[8];
    size_t dot_stream_length;
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
    masked_codeword_array = (unsigned char *) _alloca((data_length + 1 + ecc_length) * sizeof (unsigned char));
#endif /* _MSC_VER */

    /* Evaluate data mask options */
    for (i = 0; i < 4; i++) {

        apply_mask(i, data_length, masked_codeword_array, codeword_array, ecc_length, dot_stream);
        
        dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream);

        /* Add pad bits */
        for (jc = dot_stream_length; jc < n_dots; jc++) {
            strcat(dot_stream, "1");
        }

        fold_dotstream(dot_stream, width, height, dot_array);

        mask_score[i] = score_array(dot_array, height, width);

        if (debug) {
            printf("Mask %d score is %d\n", i, mask_score[i]);
        }
    }

    high_score = mask_score[0];
    best_mask = 0;

    for (i = 1; i < 4; i++) {
        if (mask_score[i] > high_score) {
            high_score = mask_score[i];
            best_mask = i;
        }
    }
    
    /* Re-evaluate using forced corners if needed */
    if (best_mask <= (height * width) / 2) {
        for (i = 0; i < 4; i++) {

            apply_mask(i, data_length, masked_codeword_array, codeword_array, ecc_length, dot_stream);
            
            dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream);

            /* Add pad bits */
            for (jc = dot_stream_length; jc < n_dots; jc++) {
                strcat(dot_stream, "1");
            }

            fold_dotstream(dot_stream, width, height, dot_array);
            
            force_corners(width, height, dot_array);

            mask_score[i + 4] = score_array(dot_array, height, width);

            if (debug) {
                printf("Mask %d score is %d\n", i + 4, mask_score[i + 4]);
            }
        }
        
        for (i = 4; i < 8; i++) {
            if (mask_score[i] > high_score) {
                high_score = mask_score[i];
                best_mask = i;
            }
        }
    }
    
    if (debug) {
        printf("Applying mask %d\n", best_mask);
    }

    /* Apply best mask */
    apply_mask(best_mask % 4, data_length, masked_codeword_array, codeword_array, ecc_length, dot_stream);
    
    dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream);

    /* Add pad bits */
    for (jc = dot_stream_length; jc < n_dots; jc++) {
        strcat(dot_stream, "1");
    }

    fold_dotstream(dot_stream, width, height, dot_array);
    
    if (best_mask >= 4) {
        force_corners(width, height, dot_array);
    }

    /* Copy values to symbol */
    symbol->width = width;
    symbol->rows = height;







|




















|




|





|








|








|

|





|






|








|







1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
    masked_codeword_array = (unsigned char *) _alloca((data_length + 1 + ecc_length) * sizeof (unsigned char));
#endif /* _MSC_VER */

    /* Evaluate data mask options */
    for (i = 0; i < 4; i++) {

        apply_mask(i, data_length, masked_codeword_array, codeword_array, ecc_length, dot_stream);

        dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream);

        /* Add pad bits */
        for (jc = dot_stream_length; jc < n_dots; jc++) {
            strcat(dot_stream, "1");
        }

        fold_dotstream(dot_stream, width, height, dot_array);

        mask_score[i] = score_array(dot_array, height, width);

        if (debug) {
            printf("Mask %d score is %d\n", i, mask_score[i]);
        }
    }

    high_score = mask_score[0];
    best_mask = 0;

    for (i = 1; i < 4; i++) {
        if (mask_score[i] >= high_score) {
            high_score = mask_score[i];
            best_mask = i;
        }
    }

    /* Re-evaluate using forced corners if needed */
    if (best_mask <= (height * width) / 2) {
        for (i = 0; i < 4; i++) {

            apply_mask(i, data_length, masked_codeword_array, codeword_array, ecc_length, dot_stream);

            dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream);

            /* Add pad bits */
            for (jc = dot_stream_length; jc < n_dots; jc++) {
                strcat(dot_stream, "1");
            }

            fold_dotstream(dot_stream, width, height, dot_array);

            force_corners(width, height, dot_array);

            mask_score[i + 4] = score_array(dot_array, height, width);

            if (debug) {
                printf("Mask %d score is %d\n", i + 4, mask_score[i + 4]);
            }
        }

        for (i = 4; i < 8; i++) {
            if (mask_score[i] >= high_score) {
                high_score = mask_score[i];
                best_mask = i;
            }
        }
    }

    if (debug) {
        printf("Applying mask %d\n", best_mask);
    }

    /* Apply best mask */
    apply_mask(best_mask % 4, data_length, masked_codeword_array, codeword_array, ecc_length, dot_stream);

    dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream);

    /* Add pad bits */
    for (jc = dot_stream_length; jc < n_dots; jc++) {
        strcat(dot_stream, "1");
    }

    fold_dotstream(dot_stream, width, height, dot_array);

    if (best_mask >= 4) {
        force_corners(width, height, dot_array);
    }

    /* Copy values to symbol */
    symbol->width = width;
    symbol->rows = height;
1515
1516
1517
1518
1519
1520
1521
1522

    if (!(symbol->output_options & BARCODE_DOTTY_MODE)) {
        symbol->output_options += BARCODE_DOTTY_MODE;
    }

    return 0;
}








<
1515
1516
1517
1518
1519
1520
1521


    if (!(symbol->output_options & BARCODE_DOTTY_MODE)) {
        symbol->output_options += BARCODE_DOTTY_MODE;
    }

    return 0;
}

Changes to jni/zint/backend/eci.c.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "eci.h"
#include "zint.h"
#ifdef _MSC_VER
#include <malloc.h>
#endif

/* Convert Unicode to other character encodings */
int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length) {
    int in_posn;
    int out_posn;
    int ext;
    int done;
    
    if (eci == 26) {
        /* Unicode mode, do not process - just copy data across */







>





|





|







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "eci.h"
#include "common.h"
#ifdef _MSC_VER
#include <malloc.h>
#endif

/* Convert Unicode to other character encodings */
INTERNAL int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length) {
    int in_posn;
    int out_posn;
    int ext;
    int done;
    
    if (eci == 26) {
        /* Unicode mode, do not process - just copy data across */
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
    dest[out_posn] = '\0';
    *length = out_posn;

    return 0;
}

/* Find the lowest ECI mode which will encode a given set of Unicode text */
int get_best_eci(unsigned char source[], size_t length) {
    int eci = 3;

#ifndef _MSC_VER
    unsigned char local_source[length + 1];
#else
    unsigned char *local_source = (unsigned char*) _alloca(length + 1);
#endif

    do {
        if (utf_to_eci(eci, source, local_source, &length) == 0) {
            return eci;
        }
        eci++;
    } while (eci < 25);

    return 26; // If all of these fail, use Unicode!
}









|

















<
<
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274


    dest[out_posn] = '\0';
    *length = out_posn;

    return 0;
}

/* Find the lowest ECI mode which will encode a given set of Unicode text */
INTERNAL int get_best_eci(unsigned char source[], size_t length) {
    int eci = 3;

#ifndef _MSC_VER
    unsigned char local_source[length + 1];
#else
    unsigned char *local_source = (unsigned char*) _alloca(length + 1);
#endif

    do {
        if (utf_to_eci(eci, source, local_source, &length) == 0) {
            return eci;
        }
        eci++;
    } while (eci < 25);

    return 26; // If all of these fail, use Unicode!
}


Changes to jni/zint/backend/emf.c.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* Developed according to [MS-EMF] - v20160714, Released July 14, 2016
 * and [MS-WMF] - v20160714, Released July 14, 2016 */

#include <stdio.h>
#include <string.h>
#include <math.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "emf.h"

int count_rectangles(struct zint_symbol *symbol) {
    int rectangles = 0;
    struct zint_vector_rect *rect;

    rect = symbol->vector->rectangles;
    while (rect) {
        rectangles++;
        rect = rect->next;
    }

    return rectangles;
}

int count_circles(struct zint_symbol *symbol) {
    int circles = 0;
    struct zint_vector_circle *circ;

    circ = symbol->vector->circles;
    while (circ) {
        circles++;
        circ = circ->next;
    }

    return circles;
}

int count_hexagons(struct zint_symbol *symbol) {
    int hexagons = 0;
    struct zint_vector_hexagon *hex;

    hex = symbol->vector->hexagons;
    while (hex) {
        hexagons++;
        hex = hex->next;
    }

    return hexagons;
}

int count_strings(struct zint_symbol *symbol) {
    int strings = 0;
    struct zint_vector_string *str;

    str = symbol->vector->strings;
    while (str) {
        strings++;
        str = str->next;
    }

    return strings;
}

void utfle_copy(unsigned char *output, unsigned char *input, int length) {
    int i;
    int o;

    /* Convert UTF-8 to UTF-16LE - only needs to handle characters <= U+00FF */
    i = 0;
    o = 0;
    do {







>













|












|












|












|












|







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* Developed according to [MS-EMF] - v20160714, Released July 14, 2016
 * and [MS-WMF] - v20160714, Released July 14, 2016 */

#include <stdio.h>
#include <string.h>
#include <math.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "emf.h"

static int count_rectangles(struct zint_symbol *symbol) {
    int rectangles = 0;
    struct zint_vector_rect *rect;

    rect = symbol->vector->rectangles;
    while (rect) {
        rectangles++;
        rect = rect->next;
    }

    return rectangles;
}

static int count_circles(struct zint_symbol *symbol) {
    int circles = 0;
    struct zint_vector_circle *circ;

    circ = symbol->vector->circles;
    while (circ) {
        circles++;
        circ = circ->next;
    }

    return circles;
}

static int count_hexagons(struct zint_symbol *symbol) {
    int hexagons = 0;
    struct zint_vector_hexagon *hex;

    hex = symbol->vector->hexagons;
    while (hex) {
        hexagons++;
        hex = hex->next;
    }

    return hexagons;
}

static int count_strings(struct zint_symbol *symbol) {
    int strings = 0;
    struct zint_vector_string *str;

    str = symbol->vector->strings;
    while (str) {
        strings++;
        str = str->next;
    }

    return strings;
}

static void utfle_copy(unsigned char *output, unsigned char *input, int length) {
    int i;
    int o;

    /* Convert UTF-8 to UTF-16LE - only needs to handle characters <= U+00FF */
    i = 0;
    o = 0;
    do {
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
            output[o + 1] = 0x00;
            o += 2;
            i += 2;
        }
    } while (i < length);
}

int bump_up(int input) {
    /* Strings length must be a multiple of 4 bytes */
    if ((input % 2) == 1) {
        input++;
    }
    return input;
}

int emf_plot(struct zint_symbol *symbol) {
    int i,j;
    FILE *emf_file;
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int error_number = 0;
    int rectangle_count, this_rectangle;
    int circle_count, this_circle;
    int hexagon_count, this_hexagon;







|







|







114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
            output[o + 1] = 0x00;
            o += 2;
            i += 2;
        }
    } while (i < length);
}

static int bump_up(int input) {
    /* Strings length must be a multiple of 4 bytes */
    if ((input % 2) == 1) {
        input++;
    }
    return input;
}

INTERNAL int emf_plot(struct zint_symbol *symbol) {
    int i,j;
    FILE *emf_file;
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int error_number = 0;
    int rectangle_count, this_rectangle;
    int circle_count, this_circle;
    int hexagon_count, this_hexagon;
Added jni/zint/backend/gb18030.c.
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */
/*
 * Adapted from GNU LIBICONV library and patched to allow 2 duplicate mappings
 * for compatibility with GB 2312 (GB2312.TXT):
 * 1) U+30FB to 0xA1A4 (duplicate of U+00B7)
 * 2) U+2015 to 0xA1AA (duplicate of U+2014)
 */
/*
 * Copyright (C) 1999-2001, 2005, 2012, 2016 Free Software Foundation, Inc.
 * This file is part of the GNU LIBICONV Library.
 *
 * The GNU LIBICONV Library is free software; you can redistribute it
 * and/or modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * The GNU LIBICONV Library is distributed in the hope that it will be
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with the GNU LIBICONV Library; see the file COPYING.LIB.
 * If not, see <https://www.gnu.org/licenses/>.
 */
#include <string.h>
#include "common.h"
#include "gb2312.h"
#include "gb18030.h"

INTERNAL int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */

/*
 * CP936 extensions (libiconv-1.16/lib/cp936ext.h)
 */

static const unsigned short cp936ext_page01[16] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0xa8bd, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/
  0xa8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/
};
static const unsigned short cp936ext_page02[24] = {
  0x0000, 0xa8bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/
  0x0000, 0xa8c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/
};
static const unsigned short cp936ext_pagefe[24] = {
  0x0000, 0xa6f2, 0x0000, 0xa6f4, 0xa6f5, 0xa6e0, 0xa6e1, 0xa6f0, /*0x30-0x37*/
  0xa6f1, 0xa6e2, 0xa6e3, 0xa6ee, 0xa6ef, 0xa6e6, 0xa6e7, 0xa6e4, /*0x38-0x3f*/
  0xa6e5, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/
};

static int cp936ext_wctomb(unsigned int* r, unsigned int wc) {
    unsigned short c = 0;
    if (wc >= 0x0140 && wc < 0x0150) {
        c = cp936ext_page01[wc-0x0140];
    } else if (wc >= 0x0250 && wc < 0x0268) {
        c = cp936ext_page02[wc-0x0250];
    } else if (wc >= 0xfe30 && wc < 0xfe48) {
        c = cp936ext_pagefe[wc-0xfe30];
    }
    if (c != 0) {
        *r = c;
        return 2;
    }
    return 0;
}

/*
 * GBK extensions (libiconv-1.16/lib/gbkext_inv.h)
 */

static const unsigned short gbkext_inv_2charset[14313] = {
  0xa840, 0xa841, 0xa842, 0xa95c, 0xa843, 0xa844, 0xa845, 0xa846,
  0xa847, 0xa848, 0xa959, 0xa849, 0xa84a, 0xa84b, 0xa84c, 0xa84d,
  0xa84e, 0xa84f, 0xa850, 0xa851, 0xa852, 0xa892, 0xa853, 0xa854,
  0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b, 0xa85c,
  0xa85d, 0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863, 0xa864,
  0xa865, 0xa866, 0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c,
  0xa86d, 0xa86e, 0xa86f, 0xa870, 0xa871, 0xa872, 0xa873, 0xa874,
  0xa875, 0xa876, 0xa877, 0xa878, 0xa879, 0xa87a, 0xa87b, 0xa87c,
  0xa87d, 0xa87e, 0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885,
  0xa886, 0xa887, 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c, 0xa88d,
  0xa88e, 0xa88f, 0xa890, 0xa891, 0xa965, 0xa996, 0xa893, 0xa894,
  0xa895, 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946,
  0xa947, 0xa948, 0xa961, 0xa962, 0xa966, 0xa967, 0xa960, 0xa963,
  0xa964, 0xa95a, 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e,
  0xa94f, 0xa950, 0xa951, 0xa952, 0xa953, 0xa954, 0x8140, 0x8141,
  0x8142, 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149,
  0x814a, 0x814b, 0x814c, 0x814d, 0x814e, 0x814f, 0x8150, 0x8151,
  0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159,
  0x815a, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8160, 0x8161,
  0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169,
  0x816a, 0x816b, 0x816c, 0x816d, 0x816e, 0x816f, 0x8170, 0x8171,
  0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, 0x8179,
  0x817a, 0x817b, 0x817c, 0x817d, 0x817e, 0x8180, 0x8181, 0x8182,
  0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8188, 0x8189, 0x818a,
  0x818b, 0x818c, 0x818d, 0x818e, 0x818f, 0x8190, 0x8191, 0x8192,
  0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8198, 0x8199, 0x819a,
  0x819b, 0x819c, 0x819d, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2,
  0x81a3, 0x81a4, 0x81a5, 0x81a6, 0x81a7, 0x81a8, 0x81a9, 0x81aa,
  0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2,
  0x81b3, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81ba,
  0x81bb, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2,
  0x81c3, 0x81c4, 0x81c5, 0x81c6, 0x81c7, 0x81c8, 0x81c9, 0x81ca,
  0x81cb, 0x81cc, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2,
  0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da,
  0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2,
  0x81e3, 0x81e4, 0x81e5, 0x81e6, 0x81e7, 0x81e8, 0x81e9, 0x81ea,
  0x81eb, 0x81ec, 0x81ed, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2,
  0x81f3, 0x81f4, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa,
  0x81fb, 0x81fc, 0x81fd, 0x81fe, 0x8240, 0x8241, 0x8242, 0x8243,
  0x8244, 0x8245, 0x8246, 0x8247, 0x8248, 0x8249, 0x824a, 0x824b,
  0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0x8251, 0x8252, 0x8253,
  0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825a, 0x825b,
  0x825c, 0x825d, 0x825e, 0x825f, 0x8260, 0x8261, 0x8262, 0x8263,
  0x8264, 0x8265, 0x8266, 0x8267, 0x8268, 0x8269, 0x826a, 0x826b,
  0x826c, 0x826d, 0x826e, 0x826f, 0x8270, 0x8271, 0x8272, 0x8273,
  0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827a, 0x827b,
  0x827c, 0x827d, 0x827e, 0x8280, 0x8281, 0x8282, 0x8283, 0x8284,
  0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828a, 0x828b, 0x828c,
  0x828d, 0x828e, 0x828f, 0x8290, 0x8291, 0x8292, 0x8293, 0x8294,
  0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829a, 0x829b, 0x829c,
  0x829d, 0x829e, 0x829f, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4,
  0x82a5, 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac,
  0x82ad, 0x82ae, 0x82af, 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4,
  0x82b5, 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc,
  0x82bd, 0x82be, 0x82bf, 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4,
  0x82c5, 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc,
  0x82cd, 0x82ce, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4,
  0x82d5, 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc,
  0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4,
  0x82e5, 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec,
  0x82ed, 0x82ee, 0x82ef, 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4,
  0x82f5, 0x82f6, 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb, 0x82fc,
  0x82fd, 0x82fe, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345,
  0x8346, 0x8347, 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d,
  0x834e, 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355,
  0x8356, 0x8357, 0x8358, 0x8359, 0x835a, 0x835b, 0x835c, 0x835d,
  0x835e, 0x835f, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365,
  0x8366, 0x8367, 0x8368, 0x8369, 0x836a, 0x836b, 0x836c, 0x836d,
  0x836e, 0x836f, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375,
  0x8376, 0x8377, 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d,
  0x837e, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386,
  0x8387, 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, 0x838d, 0x838e,
  0x838f, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396,
  0x8397, 0x8398, 0x8399, 0x839a, 0x839b, 0x839c, 0x839d, 0x839e,
  0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6,
  0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0x83ad, 0x83ae,
  0x83af, 0x83b0, 0x83b1, 0x83b2, 0x83b3, 0x83b4, 0x83b5, 0x83b6,
  0x83b7, 0x83b8, 0x83b9, 0x83ba, 0x83bb, 0x83bc, 0x83bd, 0x83be,
  0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5, 0x83c6,
  0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd, 0x83ce,
  0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4, 0x83d5, 0x83d6,
  0x83d7, 0x83d8, 0x83d9, 0x83da, 0x83db, 0x83dc, 0x83dd, 0x83de,
  0x83df, 0x83e0, 0x83e1, 0x83e2, 0x83e3, 0x83e4, 0x83e5, 0x83e6,
  0x83e7, 0x83e8, 0x83e9, 0x83ea, 0x83eb, 0x83ec, 0x83ed, 0x83ee,
  0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3, 0x83f4, 0x83f5, 0x83f6,
  0x83f7, 0x83f8, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe,
  0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446, 0x8447,
  0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f,
  0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457,
  0x8458, 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f,
  0x8460, 0x8461, 0x8462, 0x8463, 0x8464, 0x8465, 0x8466, 0x8467,
  0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x846f,
  0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, 0x8477,
  0x8478, 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x8480,
  0x8481, 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488,
  0x8489, 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, 0x8490,
  0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498,
  0x8499, 0x849a, 0x849b, 0x849c, 0x849d, 0x849e, 0x849f, 0x84a0,
  0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8,
  0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84af, 0x84b0,
  0x84b1, 0x84b2, 0x84b3, 0x84b4, 0x84b5, 0x84b6, 0x84b7, 0x84b8,
  0x84b9, 0x84ba, 0x84bb, 0x84bc, 0x84bd, 0x84be, 0x84bf, 0x84c0,
  0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5, 0x84c6, 0x84c7, 0x84c8,
  0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd, 0x84ce, 0x84cf, 0x84d0,
  0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6, 0x84d7, 0x84d8,
  0x84d9, 0x84da, 0x84db, 0x84dc, 0x84dd, 0x84de, 0x84df, 0x84e0,
  0x84e1, 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8,
  0x84e9, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0,
  0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8,
  0x84f9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0x84fe, 0x8540, 0x8541,
  0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548, 0x8549,
  0x854a, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551,
  0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559,
  0x855a, 0x855b, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561,
  0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x8569,
  0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571,
  0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579,
  0x857a, 0x857b, 0x857c, 0x857d, 0x857e, 0x8580, 0x8581, 0x8582,
  0x8583, 0x8584, 0x8585, 0x8586, 0x8587, 0x8588, 0x8589, 0x858a,
  0x858b, 0x858c, 0x858d, 0x858e, 0x858f, 0x8590, 0x8591, 0x8592,
  0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a,
  0x859b, 0x859c, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2,
  0x85a3, 0x85a4, 0x85a5, 0x85a6, 0x85a7, 0x85a8, 0x85a9, 0x85aa,
  0x85ab, 0x85ac, 0x85ad, 0x85ae, 0x85af, 0x85b0, 0x85b1, 0x85b2,
  0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b7, 0x85b8, 0x85b9, 0x85ba,
  0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c1, 0x85c2,
  0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85c9, 0x85ca,
  0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85cf, 0x85d0, 0x85d1, 0x85d2,
  0x85d3, 0x85d4, 0x85d5, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da,
  0x85db, 0x85dc, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2,
  0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85e9, 0x85ea,
  0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2,
  0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, 0x85f9, 0x85fa,
  0x85fb, 0x85fc, 0x85fd, 0x85fe, 0x8640, 0x8641, 0x8642, 0x8643,
  0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a, 0x864b,
  0x864c, 0x864d, 0x864e, 0x864f, 0x8650, 0x8651, 0x8652, 0x8653,
  0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865a, 0x865b,
  0x865c, 0x865d, 0x865e, 0x865f, 0x8660, 0x8661, 0x8662, 0x8663,
  0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, 0x866b,
  0x866c, 0x866d, 0x866e, 0x866f, 0x8670, 0x8671, 0x8672, 0x8673,
  0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679, 0x867a, 0x867b,
  0x867c, 0x867d, 0x867e, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684,
  0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868a, 0x868b, 0x868c,
  0x868d, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8693, 0x8694,
  0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869c,
  0x869d, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a3, 0x86a4,
  0x86a5, 0x86a6, 0x86a7, 0x86a8, 0x86a9, 0x86aa, 0x86ab, 0x86ac,
  0x86ad, 0x86ae, 0x86af, 0x86b0, 0x86b1, 0x86b2, 0x86b3, 0x86b4,
  0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9, 0x86ba, 0x86bb, 0x86bc,
  0x86bd, 0x86be, 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4,
  0x86c5, 0x86c6, 0x86c7, 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc,
  0x86cd, 0x86ce, 0x86cf, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4,
  0x86d5, 0x86d6, 0x86d7, 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc,
  0x86dd, 0x86de, 0x86df, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4,
  0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86e9, 0x86ea, 0x86eb, 0x86ec,
  0x86ed, 0x86ee, 0x86ef, 0x86f0, 0x86f1, 0x86f2, 0x86f3, 0x86f4,
  0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0x86fa, 0x86fb, 0x86fc,
  0x86fd, 0x86fe, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745,
  0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d,
  0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8754, 0x8755,
  0x8756, 0x8757, 0x8758, 0x8759, 0x875a, 0x875b, 0x875c, 0x875d,
  0x875e, 0x875f, 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765,
  0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d,
  0x876e, 0x876f, 0x8770, 0x8771, 0x8772, 0x8773, 0x8774, 0x8775,
  0x8776, 0x8777, 0x8778, 0x8779, 0x877a, 0x877b, 0x877c, 0x877d,
  0x877e, 0x8780, 0x8781, 0x8782, 0x8783, 0x8784, 0x8785, 0x8786,
  0x8787, 0x8788, 0x8789, 0x878a, 0x878b, 0x878c, 0x878d, 0x878e,
  0x878f, 0x8790, 0x8791, 0x8792, 0x8793, 0x8794, 0x8795, 0x8796,
  0x8797, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e,
  0x879f, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x87a6,
  0x87a7, 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, 0x87ae,
  0x87af, 0x87b0, 0x87b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6,
  0x87b7, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be,
  0x87bf, 0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6,
  0x87c7, 0x87c8, 0x87c9, 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce,
  0x87cf, 0x87d0, 0x87d1, 0x87d2, 0x87d3, 0x87d4, 0x87d5, 0x87d6,
  0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc, 0x87dd, 0x87de,
  0x87df, 0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e5, 0x87e6,
  0x87e7, 0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec, 0x87ed, 0x87ee,
  0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6,
  0x87f7, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe,
  0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, 0x8846, 0x8847,
  0x8848, 0x8849, 0x884a, 0x884b, 0x884c, 0x884d, 0x884e, 0x884f,
  0x8850, 0x8851, 0x8852, 0x8853, 0x8854, 0x8855, 0x8856, 0x8857,
  0x8858, 0x8859, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f,
  0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867,
  0x8868, 0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f,
  0x8870, 0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877,
  0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x887d, 0x887e, 0x8880,
  0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, 0x8888,
  0x8889, 0x888a, 0x888b, 0x888c, 0x888d, 0x888e, 0x888f, 0x8890,
  0x8891, 0x8892, 0x8893, 0x8894, 0x8895, 0x8896, 0x8897, 0x8898,
  0x8899, 0x889a, 0x889b, 0x889c, 0x889d, 0x889e, 0x889f, 0x88a0,
  0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, 0x88a8,
  0x88a9, 0x88aa, 0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, 0x88b0,
  0x88b1, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8,
  0x88b9, 0x88ba, 0x88bb, 0x88bc, 0x88bd, 0x88be, 0x88bf, 0x88c0,
  0x88c1, 0x88c2, 0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, 0x88c8,
  0x88c9, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, 0x88d0,
  0x88d1, 0x88d2, 0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8,
  0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0,
  0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8,
  0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0,
  0x88f1, 0x88f2, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, 0x88f8,
  0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x8940, 0x8941,
  0x8942, 0x8943, 0x8944, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949,
  0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951,
  0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959,
  0x895a, 0x895b, 0x895c, 0x895d, 0x895e, 0x895f, 0x8960, 0x8961,
  0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, 0x8968, 0x8969,
  0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971,
  0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979,
  0x897a, 0x897b, 0x897c, 0x897d, 0x897e, 0x8980, 0x8981, 0x8982,
  0x8983, 0x8984, 0x8985, 0x8986, 0x8987, 0x8988, 0x8989, 0x898a,
  0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992,
  0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a,
  0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, 0x89a2,
  0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa,
  0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2,
  0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba,
  0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c1, 0x89c2,
  0x89c3, 0x89c4, 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca,
  0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x89d2,
  0x89d3, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, 0x89d9, 0x89da,
  0x89db, 0x89dc, 0x89dd, 0x89de, 0x89df, 0x89e0, 0x89e1, 0x89e2,
  0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0x89e8, 0x89e9, 0x89ea,
  0x89eb, 0x89ec, 0x89ed, 0x89ee, 0x89ef, 0x89f0, 0x89f1, 0x89f2,
  0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa,
  0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x8a40, 0x8a41, 0x8a42, 0x8a43,
  0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a48, 0x8a49, 0x8a4a, 0x8a4b,
  0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53,
  0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b,
  0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63,
  0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b,
  0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73,
  0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a79, 0x8a7a, 0x8a7b,
  0x8a7c, 0x8a7d, 0x8a7e, 0x8a80, 0x8a81, 0x8a82, 0x8a83, 0x8a84,
  0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c,
  0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94,
  0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c,
  0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4,
  0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac,
  0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4,
  0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc,
  0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4,
  0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc,
  0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4,
  0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc,
  0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4,
  0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec,
  0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4,
  0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc,
  0x8afd, 0x8afe, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45,
  0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d,
  0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55,
  0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d,
  0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65,
  0x8b66, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d,
  0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75,
  0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d,
  0x8b7e, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86,
  0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e,
  0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96,
  0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e,
  0x8b9f, 0x8ba0, 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5, 0x8ba6,
  0x8ba7, 0x8ba8, 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad, 0x8bae,
  0x8baf, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5, 0x8bb6,
  0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, 0x8bbe,
  0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6,
  0x8bc7, 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc, 0x8bcd, 0x8bce,
  0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6,
  0x8bd7, 0x8bd8, 0x8bd9, 0x8bda, 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde,
  0x8bdf, 0x8be0, 0x8be1, 0x8be2, 0x8be3, 0x8be4, 0x8be5, 0x8be6,
  0x8be7, 0x8be8, 0x8be9, 0x8bea, 0x8beb, 0x8bec, 0x8bed, 0x8bee,
  0x8bef, 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6,
  0x8bf7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe,
  0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47,
  0x8c48, 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c, 0x8c4d, 0x8c4e, 0x8c4f,
  0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c55, 0x8c56, 0x8c57,
  0x8c58, 0x8c59, 0x8c5a, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f,
  0x8c60, 0x8c61, 0x8c62, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67,
  0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f,
  0x8c70, 0x8c71, 0x8c72, 0x8c73, 0x8c74, 0x8c75, 0x8c76, 0x8c77,
  0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c80,
  0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85, 0x8c86, 0x8c87, 0x8c88,
  0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90,
  0x8c91, 0x8c92, 0x8c93, 0x8c94, 0x8c95, 0x8c96, 0x8c97, 0x8c98,
  0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0,
  0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8,
  0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, 0x8cae, 0x8caf, 0x8cb0,
  0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8,
  0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0,
  0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8,
  0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0,
  0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8,
  0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0,
  0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8,
  0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, 0x8cf0,
  0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8,
  0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8d40, 0x8d41,
  0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47, 0x8d48, 0x8d49,
  0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f, 0x8d50, 0x8d51,
  0x8d52, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57, 0x8d58, 0x8d59,
  0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f, 0x8d60, 0x8d61,
  0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67, 0x8d68, 0x8d69,
  0x8d6a, 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f, 0x8d70, 0x8d71,
  0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, 0x8d77, 0x8d78, 0x8d79,
  0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d80, 0x8d81, 0x8d82,
  0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8a,
  0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d91, 0x8d92,
  0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a,
  0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8d9f, 0x8da0, 0x8da1, 0x8da2,
  0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa,
  0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db2,
  0x8db3, 0x8db4, 0x8db5, 0x8db6, 0x8db7, 0x8db8, 0x8db9, 0x8dba,
  0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0, 0x8dc1, 0x8dc2,
  0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca,
  0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, 0x8dd0, 0x8dd1, 0x8dd2,
  0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, 0x8dd8, 0x8dd9, 0x8dda,
  0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, 0x8de1, 0x8de2,
  0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, 0x8de8, 0x8de9, 0x8dea,
  0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, 0x8df0, 0x8df1, 0x8df2,
  0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, 0x8df8, 0x8df9, 0x8dfa,
  0x8dfb, 0x8dfc, 0x8dfd, 0x8dfe, 0x8e40, 0x8e41, 0x8e42, 0x8e43,
  0x8e44, 0x8e45, 0x8e46, 0x8e47, 0x8e48, 0x8e49, 0x8e4a, 0x8e4b,
  0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53,
  0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a, 0x8e5b,
  0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63,
  0x8e64, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b,
  0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73,
  0x8e74, 0x8e75, 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b,
  0x8e7c, 0x8e7d, 0x8e7e, 0x8e80, 0x8e81, 0x8e82, 0x8e83, 0x8e84,
  0x8e85, 0x8e86, 0x8e87, 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c,
  0x8e8d, 0x8e8e, 0x8e8f, 0x8e90, 0x8e91, 0x8e92, 0x8e93, 0x8e94,
  0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9c,
  0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4,
  0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac,
  0x8ead, 0x8eae, 0x8eaf, 0x8eb0, 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4,
  0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc,
  0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4,
  0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc,
  0x8ecd, 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4,
  0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc,
  0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4,
  0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec,
  0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4,
  0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc,
  0x8efd, 0x8efe, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, 0x8f45,
  0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d,
  0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55,
  0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d,
  0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65,
  0x8f66, 0x8f67, 0x8f68, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d,
  0x8f6e, 0x8f6f, 0x8f70, 0x8f71, 0x8f72, 0x8f73, 0x8f74, 0x8f75,
  0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d,
  0x8f7e, 0x8f80, 0x8f81, 0x8f82, 0x8f83, 0x8f84, 0x8f85, 0x8f86,
  0x8f87, 0x8f88, 0x8f89, 0x8f8a, 0x8f8b, 0x8f8c, 0x8f8d, 0x8f8e,
  0x8f8f, 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96,
  0x8f97, 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e,
  0x8f9f, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0x8fa5, 0x8fa6,
  0x8fa7, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x8fae,
  0x8faf, 0x8fb0, 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb6,
  0x8fb7, 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe,
  0x8fbf, 0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6,
  0x8fc7, 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fce,
  0x8fcf, 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0x8fd6,
  0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd, 0x8fde,
  0x8fdf, 0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5, 0x8fe6,
  0x8fe7, 0x8fe8, 0x8fe9, 0x8fea, 0x8feb, 0x8fec, 0x8fed, 0x8fee,
  0x8fef, 0x8ff0, 0x8ff1, 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0x8ff6,
  0x8ff7, 0x8ff8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0x8ffe,
  0x9040, 0x9041, 0x9042, 0x9043, 0x9044, 0x9045, 0x9046, 0x9047,
  0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904d, 0x904e, 0x904f,
  0x9050, 0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057,
  0x9058, 0x9059, 0x905a, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f,
  0x9060, 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067,
  0x9068, 0x9069, 0x906a, 0x906b, 0x906c, 0x906d, 0x906e, 0x906f,
  0x9070, 0x9071, 0x9072, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077,
  0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907d, 0x907e, 0x9080,
  0x9081, 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, 0x9088,
  0x9089, 0x908a, 0x908b, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090,
  0x9091, 0x9092, 0x9093, 0x9094, 0x9095, 0x9096, 0x9097, 0x9098,
  0x9099, 0x909a, 0x909b, 0x909c, 0x909d, 0x909e, 0x909f, 0x90a0,
  0x90a1, 0x90a2, 0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, 0x90a8,
  0x90a9, 0x90aa, 0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, 0x90b0,
  0x90b1, 0x90b2, 0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, 0x90b8,
  0x90b9, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0x90bf, 0x90c0,
  0x90c1, 0x90c2, 0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x90c7, 0x90c8,
  0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0x90ce, 0x90cf, 0x90d0,
  0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0x90d7, 0x90d8,
  0x90d9, 0x90da, 0x90db, 0x90dc, 0x90dd, 0x90de, 0x90df, 0x90e0,
  0x90e1, 0x90e2, 0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, 0x90e8,
  0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0,
  0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0x90f8,
  0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9140, 0x9141,
  0x9142, 0x9143, 0x9144, 0x9145, 0x9146, 0x9147, 0x9148, 0x9149,
  0x914a, 0x914b, 0x914c, 0x914d, 0x914e, 0x914f, 0x9150, 0x9151,
  0x9152, 0x9153, 0x9154, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159,
  0x915a, 0x915b, 0x915c, 0x915d, 0x915e, 0x915f, 0x9160, 0x9161,
  0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169,
  0x916a, 0x916b, 0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171,
  0x9172, 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179,
  0x917a, 0x917b, 0x917c, 0x917d, 0x917e, 0x9180, 0x9181, 0x9182,
  0x9183, 0x9184, 0x9185, 0x9186, 0x9187, 0x9188, 0x9189, 0x918a,
  0x918b, 0x918c, 0x918d, 0x918e, 0x918f, 0x9190, 0x9191, 0x9192,
  0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919a,
  0x919b, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a2,
  0x91a3, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91aa,
  0x91ab, 0x91ac, 0x91ad, 0x91ae, 0x91af, 0x91b0, 0x91b1, 0x91b2,
  0x91b3, 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba,
  0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2,
  0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca,
  0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf, 0x91d0, 0x91d1, 0x91d2,
  0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da,
  0x91db, 0x91dc, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2,
  0x91e3, 0x91e4, 0x91e5, 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea,
  0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2,
  0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa,
  0x91fb, 0x91fc, 0x91fd, 0x91fe, 0x9240, 0x9241, 0x9242, 0x9243,
  0x9244, 0x9245, 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b,
  0x924c, 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253,
  0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b,
  0x925c, 0x925d, 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263,
  0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b,
  0x926c, 0x926d, 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273,
  0x9274, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b,
  0x927c, 0x927d, 0x927e, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284,
  0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c,
  0x928d, 0x928e, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294,
  0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c,
  0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4,
  0x92a5, 0x92a6, 0x92a7, 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac,
  0x92ad, 0x92ae, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92b3, 0x92b4,
  0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9, 0x92ba, 0x92bb, 0x92bc,
  0x92bd, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4,
  0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92c9, 0x92ca, 0x92cb, 0x92cc,
  0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3, 0x92d4,
  0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc,
  0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4,
  0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec,
  0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4,
  0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc,
  0x92fd, 0x92fe, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345,
  0x9346, 0x9347, 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d,
  0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355,
  0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d,
  0x935e, 0x935f, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365,
  0x9366, 0x9367, 0x9368, 0x9369, 0x936a, 0x936b, 0x936c, 0x936d,
  0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375,
  0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d,
  0x937e, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386,
  0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e,
  0x938f, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396,
  0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e,
  0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6,
  0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae,
  0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6,
  0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be,
  0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6,
  0x93c7, 0x93c8, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93ce,
  0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d6,
  0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de,
  0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6,
  0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee,
  0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6,
  0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe,
  0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447,
  0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f,
  0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457,
  0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f,
  0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467,
  0x9468, 0x9469, 0x946a, 0x946b, 0x946c, 0x946d, 0x946e, 0x946f,
  0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477,
  0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x9480,
  0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488,
  0x9489, 0x948a, 0x948b, 0x948c, 0x948d, 0x948e, 0x948f, 0x9490,
  0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498,
  0x9499, 0x949a, 0x949b, 0x949c, 0x949d, 0x949e, 0x949f, 0x94a0,
  0x94a1, 0x94a2, 0x94a3, 0x94a4, 0x94a5, 0x94a6, 0x94a7, 0x94a8,
  0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x94ae, 0x94af, 0x94b0,
  0x94b1, 0x94b2, 0x94b3, 0x94b4, 0x94b5, 0x94b6, 0x94b7, 0x94b8,
  0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd, 0x94be, 0x94bf, 0x94c0,
  0x94c1, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6, 0x94c7, 0x94c8,
  0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0,
  0x94d1, 0x94d2, 0x94d3, 0x94d4, 0x94d5, 0x94d6, 0x94d7, 0x94d8,
  0x94d9, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de, 0x94df, 0x94e0,
  0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5, 0x94e6, 0x94e7, 0x94e8,
  0x94e9, 0x94ea, 0x94eb, 0x94ec, 0x94ed, 0x94ee, 0x94ef, 0x94f0,
  0x94f1, 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, 0x94f8,
  0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd, 0x94fe, 0x9540, 0x9541,
  0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, 0x9548, 0x9549,
  0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, 0x9550, 0x9551,
  0x9552, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559,
  0x955a, 0x955b, 0x955c, 0x955d, 0x955e, 0x955f, 0x9560, 0x9561,
  0x9562, 0x9563, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569,
  0x956a, 0x956b, 0x956c, 0x956d, 0x956e, 0x956f, 0x9570, 0x9571,
  0x9572, 0x9573, 0x9574, 0x9575, 0x9576, 0x9577, 0x9578, 0x9579,
  0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582,
  0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a,
  0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592,
  0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a,
  0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2,
  0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa,
  0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2,
  0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba,
  0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2,
  0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca,
  0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2,
  0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da,
  0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2,
  0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95e8, 0x95e9, 0x95ea,
  0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef, 0x95f0, 0x95f1, 0x95f2,
  0x95f3, 0x95f4, 0x95f5, 0x95f6, 0x95f7, 0x95f8, 0x95f9, 0x95fa,
  0x95fb, 0x95fc, 0x95fd, 0x95fe, 0x9640, 0x9641, 0x9642, 0x9643,
  0x9644, 0x9645, 0x9646, 0x9647, 0x9648, 0x9649, 0x964a, 0x964b,
  0x964c, 0x964d, 0x964e, 0x964f, 0x9650, 0x9651, 0x9652, 0x9653,
  0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965b,
  0x965c, 0x965d, 0x965e, 0x965f, 0x9660, 0x9661, 0x9662, 0x9663,
  0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966a, 0x966b,
  0x966c, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9672, 0x9673,
  0x9674, 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967a, 0x967b,
  0x967c, 0x967d, 0x967e, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684,
  0x9685, 0x9686, 0x9687, 0x9688, 0x9689, 0x968a, 0x968b, 0x968c,
  0x968d, 0x968e, 0x968f, 0x9690, 0x9691, 0x9692, 0x9693, 0x9694,
  0x9695, 0x9696, 0x9697, 0x9698, 0x9699, 0x969a, 0x969b, 0x969c,
  0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4,
  0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac,
  0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4,
  0x96b5, 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc,
  0x96bd, 0x96be, 0x96bf, 0x96c0, 0x96c1, 0x96c2, 0x96c3, 0x96c4,
  0x96c5, 0x96c6, 0x96c7, 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc,
  0x96cd, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0x96d2, 0x96d3, 0x96d4,
  0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc,
  0x96dd, 0x96de, 0x96df, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4,
  0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec,
  0x96ed, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f2, 0x96f3, 0x96f4,
  0x96f5, 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0x96fc,
  0x96fd, 0x96fe, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745,
  0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d,
  0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755,
  0x9756, 0x9757, 0x9758, 0x9759, 0x975a, 0x975b, 0x975c, 0x975d,
  0x975e, 0x975f, 0x9760, 0x9761, 0x9762, 0x9763, 0x9764, 0x9765,
  0x9766, 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d,
  0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9773, 0x9774, 0x9775,
  0x9776, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d,
  0x977e, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786,
  0x9787, 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, 0x978d, 0x978e,
  0x978f, 0x9790, 0x9791, 0x9792, 0x9793, 0x9794, 0x9795, 0x9796,
  0x9797, 0x9798, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, 0x979e,
  0x979f, 0x97a0, 0x97a1, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6,
  0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae,
  0x97af, 0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 0x97b5, 0x97b6,
  0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be,
  0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6,
  0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce,
  0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6,
  0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de,
  0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e6,
  0x97e7, 0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee,
  0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6,
  0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe,
  0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847,
  0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f,
  0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857,
  0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f,
  0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867,
  0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f,
  0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877,
  0x9878, 0x9879, 0x987a, 0x987b, 0x987c, 0x987d, 0x987e, 0x9880,
  0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888,
  0x9889, 0x988a, 0x988b, 0x988c, 0x988d, 0x988e, 0x988f, 0x9890,
  0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896, 0x9897, 0x9898,
  0x9899, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0,
  0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, 0x98a8,
  0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0,
  0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8,
  0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0,
  0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8,
  0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, 0x98d0,
  0x98d1, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, 0x98d8,
  0x98d9, 0x98da, 0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df, 0x98e0,
  0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0x98e8,
  0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0,
  0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8,
  0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x9940, 0x9941,
  0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949,
  0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951,
  0x9952, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, 0x9959,
  0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961,
  0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968, 0x9969,
  0x996a, 0x996b, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0x9971,
  0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979,
  0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x9980, 0x9981, 0x9982,
  0x9983, 0x9984, 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0x998a,
  0x998b, 0x998c, 0x998d, 0x998e, 0x998f, 0x9990, 0x9991, 0x9992,
  0x9993, 0x9994, 0x9995, 0x9996, 0x9997, 0x9998, 0x9999, 0x999a,
  0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2,
  0x99a3, 0x99a4, 0x99a5, 0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa,
  0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2,
  0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba,
  0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2,
  0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca,
  0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2,
  0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da,
  0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2,
  0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea,
  0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2,
  0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, 0x99fa,
  0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x9a40, 0x9a41, 0x9a42, 0x9a43,
  0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b,
  0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53,
  0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b,
  0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63,
  0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b,
  0x9a6c, 0x9a6d, 0x9a6e, 0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73,
  0x9a74, 0x9a75, 0x9a76, 0x9a77, 0x9a78, 0x9a79, 0x9a7a, 0x9a7b,
  0x9a7c, 0x9a7d, 0x9a7e, 0x9a80, 0x9a81, 0x9a82, 0x9a83, 0x9a84,
  0x9a85, 0x9a86, 0x9a87, 0x9a88, 0x9a89, 0x9a8a, 0x9a8b, 0x9a8c,
  0x9a8d, 0x9a8e, 0x9a8f, 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94,
  0x9a95, 0x9a96, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, 0x9a9c,
  0x9a9d, 0x9a9e, 0x9a9f, 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4,
  0x9aa5, 0x9aa6, 0x9aa7, 0x9aa8, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac,
  0x9aad, 0x9aae, 0x9aaf, 0x9ab0, 0x9ab1, 0x9ab2, 0x9ab3, 0x9ab4,
  0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8, 0x9ab9, 0x9aba, 0x9abb, 0x9abc,
  0x9abd, 0x9abe, 0x9abf, 0x9ac0, 0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4,
  0x9ac5, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acb, 0x9acc,
  0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4,
  0x9ad5, 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0x9adb, 0x9adc,
  0x9add, 0x9ade, 0x9adf, 0x9ae0, 0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4,
  0x9ae5, 0x9ae6, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aeb, 0x9aec,
  0x9aed, 0x9aee, 0x9aef, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4,
  0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9, 0x9afa, 0x9afb, 0x9afc,
  0x9afd, 0x9afe, 0x9b40, 0x9b41, 0x9b42, 0x9b43, 0x9b44, 0x9b45,
  0x9b46, 0x9b47, 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4d,
  0x9b4e, 0x9b4f, 0x9b50, 0x9b51, 0x9b52, 0x9b53, 0x9b54, 0x9b55,
  0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d,
  0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65,
  0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d,
  0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75,
  0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, 0x9b7c, 0x9b7d,
  0x9b7e, 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86,
  0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e,
  0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96,
  0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e,
  0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6,
  0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae,
  0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6,
  0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe,
  0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6,
  0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce,
  0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6,
  0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, 0x9bdc, 0x9bdd, 0x9bde,
  0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6,
  0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee,
  0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6,
  0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe,
  0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47,
  0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f,
  0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57,
  0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f,
  0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67,
  0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f,
  0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77,
  0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7c, 0x9c7d, 0x9c7e, 0x9c80,
  0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, 0x9c88,
  0x9c89, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8d, 0x9c8e, 0x9c8f, 0x9c90,
  0x9c91, 0x9c92, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, 0x9c98,
  0x9c99, 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0x9c9e, 0x9c9f, 0x9ca0,
  0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8,
  0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae, 0x9caf, 0x9cb0,
  0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cb8,
  0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cbe, 0x9cbf, 0x9cc0,
  0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cc8,
  0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0,
  0x9cd1, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7, 0x9cd8,
  0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde, 0x9cdf, 0x9ce0,
  0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8,
  0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0,
  0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8,
  0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9d40, 0x9d41,
  0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49,
  0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51,
  0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59,
  0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61,
  0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69,
  0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71,
  0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79,
  0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d80, 0x9d81, 0x9d82,
  0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a,
  0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92,
  0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a,
  0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2,
  0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa,
  0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2,
  0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba,
  0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2,
  0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca,
  0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2,
  0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda,
  0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2,
  0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea,
  0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2,
  0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa,
  0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9e40, 0x9e41, 0x9e42, 0x9e43,
  0x9e44, 0x9e45, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4a, 0x9e4b,
  0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, 0x9e50, 0x9e51, 0x9e52, 0x9e53,
  0x9e54, 0x9e55, 0x9e56, 0x9e57, 0x9e58, 0x9e59, 0x9e5a, 0x9e5b,
  0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e63,
  0x9e64, 0x9e65, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b,
  0x9e6c, 0x9e6d, 0x9e6e, 0x9e6f, 0x9e70, 0x9e71, 0x9e72, 0x9e73,
  0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b,
  0x9e7c, 0x9e7d, 0x9e7e, 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84,
  0x9e85, 0x9e86, 0x9e87, 0x9e88, 0x9e89, 0x9e8a, 0x9e8b, 0x9e8c,
  0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e92, 0x9e93, 0x9e94,
  0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c,
  0x9e9d, 0x9e9e, 0x9e9f, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4,
  0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, 0x9eab, 0x9eac,
  0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4,
  0x9eb5, 0x9eb6, 0x9eb7, 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc,
  0x9ebd, 0x9ebe, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4,
  0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc,
  0x9ecd, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4,
  0x9ed5, 0x9ed6, 0x9ed7, 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc,
  0x9edd, 0x9ede, 0x9edf, 0x9ee0, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4,
  0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec,
  0x9eed, 0x9eee, 0x9eef, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4,
  0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc,
  0x9efd, 0x9efe, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45,
  0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d,
  0x9f4e, 0x9f4f, 0x9f50, 0x9f51, 0x9f52, 0x9f53, 0x9f54, 0x9f55,
  0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d,
  0x9f5e, 0x9f5f, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65,
  0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d,
  0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75,
  0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d,
  0x9f7e, 0x9f80, 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86,
  0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e,
  0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96,
  0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, 0x9f9e,
  0x9f9f, 0x9fa0, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0x9fa6,
  0x9fa7, 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae,
  0x9faf, 0x9fb0, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0x9fb6,
  0x9fb7, 0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0x9fbe,
  0x9fbf, 0x9fc0, 0x9fc1, 0x9fc2, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6,
  0x9fc7, 0x9fc8, 0x9fc9, 0x9fca, 0x9fcb, 0x9fcc, 0x9fcd, 0x9fce,
  0x9fcf, 0x9fd0, 0x9fd1, 0x9fd2, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6,
  0x9fd7, 0x9fd8, 0x9fd9, 0x9fda, 0x9fdb, 0x9fdc, 0x9fdd, 0x9fde,
  0x9fdf, 0x9fe0, 0x9fe1, 0x9fe2, 0x9fe3, 0x9fe4, 0x9fe5, 0x9fe6,
  0x9fe7, 0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec, 0x9fed, 0x9fee,
  0x9fef, 0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3, 0x9ff4, 0x9ff5, 0x9ff6,
  0x9ff7, 0x9ff8, 0x9ff9, 0x9ffa, 0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe,
  0xa040, 0xa041, 0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047,
  0xa048, 0xa049, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xa04e, 0xa04f,
  0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xa055, 0xa056, 0xa057,
  0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, 0xa05e, 0xa05f,
  0xa060, 0xa061, 0xa062, 0xa063, 0xa064, 0xa065, 0xa066, 0xa067,
  0xa068, 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f,
  0xa070, 0xa071, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077,
  0xa078, 0xa079, 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa07e, 0xa080,
  0xa081, 0xa082, 0xa083, 0xa084, 0xa085, 0xa086, 0xa087, 0xa088,
  0xa089, 0xa08a, 0xa08b, 0xa08c, 0xa08d, 0xa08e, 0xa08f, 0xa090,
  0xa091, 0xa092, 0xa093, 0xa094, 0xa095, 0xa096, 0xa097, 0xa098,
  0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d, 0xa09e, 0xa09f, 0xa0a0,
  0xa0a1, 0xa0a2, 0xa0a3, 0xa0a4, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a8,
  0xa0a9, 0xa0aa, 0xa0ab, 0xa0ac, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b0,
  0xa0b1, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8,
  0xa0b9, 0xa0ba, 0xa0bb, 0xa0bc, 0xa0bd, 0xa0be, 0xa0bf, 0xa0c0,
  0xa0c1, 0xa0c2, 0xa0c3, 0xa0c4, 0xa0c5, 0xa0c6, 0xa0c7, 0xa0c8,
  0xa0c9, 0xa0ca, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0,
  0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xa0d7, 0xa0d8,
  0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de, 0xa0df, 0xa0e0,
  0xa0e1, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e7, 0xa0e8,
  0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ef, 0xa0f0,
  0xa0f1, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8,
  0xa0f9, 0xa0fa, 0xa0fb, 0xa0fc, 0xa0fd, 0xa0fe, 0xaa40, 0xaa41,
  0xaa42, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, 0xaa48, 0xaa49,
  0xaa4a, 0xaa4b, 0xaa4c, 0xaa4d, 0xaa4e, 0xaa4f, 0xaa50, 0xaa51,
  0xaa52, 0xaa53, 0xaa54, 0xaa55, 0xaa56, 0xaa57, 0xaa58, 0xaa59,
  0xaa5a, 0xaa5b, 0xaa5c, 0xaa5d, 0xaa5e, 0xaa5f, 0xaa60, 0xaa61,
  0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xaa66, 0xaa67, 0xaa68, 0xaa69,
  0xaa6a, 0xaa6b, 0xaa6c, 0xaa6d, 0xaa6e, 0xaa6f, 0xaa70, 0xaa71,
  0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, 0xaa78, 0xaa79,
  0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d, 0xaa7e, 0xaa80, 0xaa81, 0xaa82,
  0xaa83, 0xaa84, 0xaa85, 0xaa86, 0xaa87, 0xaa88, 0xaa89, 0xaa8a,
  0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92,
  0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99, 0xaa9a,
  0xaa9b, 0xaa9c, 0xaa9d, 0xaa9e, 0xaa9f, 0xaaa0, 0xab40, 0xab41,
  0xab42, 0xab43, 0xab44, 0xab45, 0xab46, 0xab47, 0xab48, 0xab49,
  0xab4a, 0xab4b, 0xab4c, 0xab4d, 0xab4e, 0xab4f, 0xab50, 0xab51,
  0xab52, 0xab53, 0xab54, 0xab55, 0xab56, 0xab57, 0xab58, 0xab59,
  0xab5a, 0xab5b, 0xab5c, 0xab5d, 0xab5e, 0xab5f, 0xab60, 0xab61,
  0xab62, 0xab63, 0xab64, 0xab65, 0xab66, 0xab67, 0xab68, 0xab69,
  0xab6a, 0xab6b, 0xab6c, 0xab6d, 0xab6e, 0xab6f, 0xab70, 0xab71,
  0xab72, 0xab73, 0xab74, 0xab75, 0xab76, 0xab77, 0xab78, 0xab79,
  0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab7e, 0xab80, 0xab81, 0xab82,
  0xab83, 0xab84, 0xab85, 0xab86, 0xab87, 0xab88, 0xab89, 0xab8a,
  0xab8b, 0xab8c, 0xab8d, 0xab8e, 0xab8f, 0xab90, 0xab91, 0xab92,
  0xab93, 0xab94, 0xab95, 0xab96, 0xab97, 0xab98, 0xab99, 0xab9a,
  0xab9b, 0xab9c, 0xab9d, 0xab9e, 0xab9f, 0xaba0, 0xac40, 0xac41,
  0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0xac49,
  0xac4a, 0xac4b, 0xac4c, 0xac4d, 0xac4e, 0xac4f, 0xac50, 0xac51,
  0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58, 0xac59,
  0xac5a, 0xac5b, 0xac5c, 0xac5d, 0xac5e, 0xac5f, 0xac60, 0xac61,
  0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69,
  0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, 0xac70, 0xac71,
  0xac72, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78, 0xac79,
  0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac80, 0xac81, 0xac82,
  0xac83, 0xac84, 0xac85, 0xac86, 0xac87, 0xac88, 0xac89, 0xac8a,
  0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91, 0xac92,
  0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a,
  0xac9b, 0xac9c, 0xac9d, 0xac9e, 0xac9f, 0xaca0, 0xad40, 0xad41,
  0xad42, 0xad43, 0xad44, 0xad45, 0xad46, 0xad47, 0xad48, 0xad49,
  0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad50, 0xad51,
  0xad52, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59,
  0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad61,
  0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, 0xad68, 0xad69,
  0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f, 0xad70, 0xad71,
  0xad72, 0xad73, 0xad74, 0xad75, 0xad76, 0xad77, 0xad78, 0xad79,
  0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e, 0xad80, 0xad81, 0xad82,
  0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0xad88, 0xad89, 0xad8a,
  0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, 0xad90, 0xad91, 0xad92,
  0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a,
  0xad9b, 0xad9c, 0xad9d, 0xad9e, 0xad9f, 0xada0, 0xae40, 0xae41,
  0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48, 0xae49,
  0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50, 0xae51,
  0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58, 0xae59,
  0xae5a, 0xae5b, 0xae5c, 0xae5d, 0xae5e, 0xae5f, 0xae60, 0xae61,
  0xae62, 0xae63, 0xae64, 0xae65, 0xae66, 0xae67, 0xae68, 0xae69,
  0xae6a, 0xae6b, 0xae6c, 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71,
  0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae78, 0xae79,
  0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae80, 0xae81, 0xae82,
  0xae83, 0xae84, 0xae85, 0xae86, 0xae87, 0xae88, 0xae89, 0xae8a,
  0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92,
  0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a,
  0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0xaea0, 0xaf40, 0xaf41,
  0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0xaf48, 0xaf49,
  0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50, 0xaf51,
  0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59,
  0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61,
  0xaf62, 0xaf63, 0xaf64, 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69,
  0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71,
  0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf79,
  0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf80, 0xaf81, 0xaf82,
  0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, 0xaf88, 0xaf89, 0xaf8a,
  0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf90, 0xaf91, 0xaf92,
  0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a,
  0xaf9b, 0xaf9c, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xb040, 0xb041,
  0xb042, 0xb043, 0xb044, 0xb045, 0xb046, 0xb047, 0xb048, 0xb049,
  0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0xb04f, 0xb050, 0xb051,
  0xb052, 0xb053, 0xb054, 0xb055, 0xb056, 0xb057, 0xb058, 0xb059,
  0xb05a, 0xb05b, 0xb05c, 0xb05d, 0xb05e, 0xb05f, 0xb060, 0xb061,
  0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069,
  0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070, 0xb071,
  0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079,
  0xb07a, 0xb07b, 0xb07c, 0xb07d, 0xb07e, 0xb080, 0xb081, 0xb082,
  0xb083, 0xb084, 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a,
  0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xb091, 0xb092,
  0xb093, 0xb094, 0xb095, 0xb096, 0xb097, 0xb098, 0xb099, 0xb09a,
  0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, 0xb0a0, 0xb140, 0xb141,
  0xb142, 0xb143, 0xb144, 0xb145, 0xb146, 0xb147, 0xb148, 0xb149,
  0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xb151,
  0xb152, 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xb159,
  0xb15a, 0xb15b, 0xb15c, 0xb15d, 0xb15e, 0xb15f, 0xb160, 0xb161,
  0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169,
  0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171,
  0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb178, 0xb179,
  0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb17e, 0xb180, 0xb181, 0xb182,
  0xb183, 0xb184, 0xb185, 0xb186, 0xb187, 0xb188, 0xb189, 0xb18a,
  0xb18b, 0xb18c, 0xb18d, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb192,
  0xb193, 0xb194, 0xb195, 0xb196, 0xb197, 0xb198, 0xb199, 0xb19a,
  0xb19b, 0xb19c, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb240, 0xb241,
  0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, 0xb248, 0xb249,
  0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251,
  0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0xb258, 0xb259,
  0xb25a, 0xb25b, 0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xb260, 0xb261,
  0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268, 0xb269,
  0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271,
  0xb272, 0xb273, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279,
  0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb27e, 0xb280, 0xb281, 0xb282,
  0xb283, 0xb284, 0xb285, 0xb286, 0xb287, 0xb288, 0xb289, 0xb28a,
  0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0xb290, 0xb291, 0xb292,
  0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb298, 0xb299, 0xb29a,
  0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a0, 0xb340, 0xb341,
  0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, 0xb348, 0xb349,
  0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351,
  0xb352, 0xb353, 0xb354, 0xb355, 0xb356, 0xb357, 0xb358, 0xb359,
  0xb35a, 0xb35b, 0xb35c, 0xb35d, 0xb35e, 0xb35f, 0xb360, 0xb361,
  0xb362, 0xb363, 0xb364, 0xb365, 0xb366, 0xb367, 0xb368, 0xb369,
  0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0xb370, 0xb371,
  0xb372, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, 0xb378, 0xb379,
  0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb380, 0xb381, 0xb382,
  0xb383, 0xb384, 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a,
  0xb38b, 0xb38c, 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb392,
  0xb393, 0xb394, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a,
  0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb440, 0xb441,
  0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447, 0xb448, 0xb449,
  0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0xb450, 0xb451,
  0xb452, 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459,
  0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0xb461,
  0xb462, 0xb463, 0xb464, 0xb465, 0xb466, 0xb467, 0xb468, 0xb469,
  0xb46a, 0xb46b, 0xb46c, 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471,
  0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479,
  0xb47a, 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb480, 0xb481, 0xb482,
  0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0xb488, 0xb489, 0xb48a,
  0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492,
  0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a,
  0xb49b, 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb540, 0xb541,
  0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, 0xb548, 0xb549,
  0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xb550, 0xb551,
  0xb552, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559,
  0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f, 0xb560, 0xb561,
  0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, 0xb568, 0xb569,
  0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571,
  0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577, 0xb578, 0xb579,
  0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb580, 0xb581, 0xb582,
  0xb583, 0xb584, 0xb585, 0xb586, 0xb587, 0xb588, 0xb589, 0xb58a,
  0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590, 0xb591, 0xb592,
  0xb593, 0xb594, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599, 0xb59a,
  0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0xb5a0, 0xb640, 0xb641,
  0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0xb648, 0xb649,
  0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651,
  0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659,
  0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, 0xb660, 0xb661,
  0xb662, 0xb663, 0xb664, 0xb665, 0xb666, 0xb667, 0xb668, 0xb669,
  0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671,
  0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679,
  0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb680, 0xb681, 0xb682,
  0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688, 0xb689, 0xb68a,
  0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690, 0xb691, 0xb692,
  0xb693, 0xb694, 0xb695, 0xb696, 0xb697, 0xb698, 0xb699, 0xb69a,
  0xb69b, 0xb69c, 0xb69d, 0xb69e, 0xb69f, 0xb6a0, 0xb740, 0xb741,
  0xb742, 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, 0xb748, 0xb749,
  0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751,
  0xb752, 0xb753, 0xb754, 0xb755, 0xb756, 0xb757, 0xb758, 0xb759,
  0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0xb760, 0xb761,
  0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, 0xb768, 0xb769,
  0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb770, 0xb771,
  0xb772, 0xb773, 0xb774, 0xb775, 0xb776, 0xb777, 0xb778, 0xb779,
  0xb77a, 0xb77b, 0xb77c, 0xb77d, 0xb77e, 0xb780, 0xb781, 0xb782,
  0xb783, 0xb784, 0xb785, 0xb786, 0xb787, 0xb788, 0xb789, 0xb78a,
  0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb78f, 0xb790, 0xb791, 0xb792,
  0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0xb798, 0xb799, 0xb79a,
  0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, 0xb7a0, 0xb840, 0xb841,
  0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, 0xb848, 0xb849,
  0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0xb851,
  0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859,
  0xb85a, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb85f, 0xb860, 0xb861,
  0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869,
  0xb86a, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xb871,
  0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb878, 0xb879,
  0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb880, 0xb881, 0xb882,
  0xb883, 0xb884, 0xb885, 0xb886, 0xb887, 0xb888, 0xb889, 0xb88a,
  0xb88b, 0xb88c, 0xb88d, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892,
  0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a,
  0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb940, 0xb941,
  0xb942, 0xb943, 0xb944, 0xb945, 0xb946, 0xb947, 0xb948, 0xb949,
  0xb94a, 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, 0xb950, 0xb951,
  0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, 0xb958, 0xb959,
  0xb95a, 0xb95b, 0xb95c, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961,
  0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb968, 0xb969,
  0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xb970, 0xb971,
  0xb972, 0xb973, 0xb974, 0xb975, 0xb976, 0xb977, 0xb978, 0xb979,
  0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb97e, 0xb980, 0xb981, 0xb982,
  0xb983, 0xb984, 0xb985, 0xb986, 0xb987, 0xb988, 0xb989, 0xb98a,
  0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f, 0xb990, 0xb991, 0xb992,
  0xb993, 0xb994, 0xb995, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a,
  0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xba40, 0xba41,
  0xba42, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, 0xba48, 0xba49,
  0xba4a, 0xba4b, 0xba4c, 0xba4d, 0xba4e, 0xba4f, 0xba50, 0xba51,
  0xba52, 0xba53, 0xba54, 0xba55, 0xba56, 0xba57, 0xba58, 0xba59,
  0xba5a, 0xba5b, 0xba5c, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61,
  0xba62, 0xba63, 0xba64, 0xba65, 0xba66, 0xba67, 0xba68, 0xba69,
  0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70, 0xba71,
  0xba72, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, 0xba78, 0xba79,
  0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba80, 0xba81, 0xba82,
  0xba83, 0xba84, 0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a,
  0xba8b, 0xba8c, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92,
  0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a,
  0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbb40, 0xbb41,
  0xbb42, 0xbb43, 0xbb44, 0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49,
  0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51,
  0xbb52, 0xbb53, 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59,
  0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb61,
  0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69,
  0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70, 0xbb71,
  0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79,
  0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, 0xbb80, 0xbb81, 0xbb82,
  0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, 0xbb88, 0xbb89, 0xbb8a,
  0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e, 0xbb8f, 0xbb90, 0xbb91, 0xbb92,
  0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a,
  0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, 0xbba0, 0xbc40, 0xbc41,
  0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46, 0xbc47, 0xbc48, 0xbc49,
  0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xbc4f, 0xbc50, 0xbc51,
  0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59,
  0xbc5a, 0xbc5b, 0xbc5c, 0xbc5d, 0xbc5e, 0xbc5f, 0xbc60, 0xbc61,
  0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68, 0xbc69,
  0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71,
  0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77, 0xbc78, 0xbc79,
  0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc80, 0xbc81, 0xbc82,
  0xbc83, 0xbc84, 0xbc85, 0xbc86, 0xbc87, 0xbc88, 0xbc89, 0xbc8a,
  0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, 0xbc90, 0xbc91, 0xbc92,
  0xbc93, 0xbc94, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99, 0xbc9a,
  0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbd40, 0xbd41,
  0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48, 0xbd49,
  0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50, 0xbd51,
  0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, 0xbd59,
  0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, 0xbd61,
  0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68, 0xbd69,
  0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71,
  0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79,
  0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd80, 0xbd81, 0xbd82,
  0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, 0xbd88, 0xbd89, 0xbd8a,
  0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90, 0xbd91, 0xbd92,
  0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98, 0xbd99, 0xbd9a,
  0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbe40, 0xbe41,
  0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, 0xbe48, 0xbe49,
  0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, 0xbe50, 0xbe51,
  0xbe52, 0xbe53, 0xbe54, 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59,
  0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0xbe60, 0xbe61,
  0xbe62, 0xbe63, 0xbe64, 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69,
  0xbe6a, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71,
  0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79,
  0xbe7a, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe7e, 0xbe80, 0xbe81, 0xbe82,
  0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a,
  0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92,
  0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe98, 0xbe99, 0xbe9a,
  0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbf40, 0xbf41,
  0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49,
  0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51,
  0xbf52, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59,
  0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61,
  0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69,
  0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71,
  0xbf72, 0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79,
  0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf80, 0xbf81, 0xbf82,
  0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a,
  0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92,
  0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a,
  0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xc040, 0xc041,
  0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049,
  0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051,
  0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc058, 0xc059,
  0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061,
  0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, 0xc069,
  0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071,
  0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079,
  0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc080, 0xc081, 0xc082,
  0xc083, 0xc084, 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a,
  0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091, 0xc092,
  0xc093, 0xc094, 0xc095, 0xc096, 0xc097, 0xc098, 0xc099, 0xc09a,
  0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a0, 0xc140, 0xc141,
  0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, 0xc148, 0xc149,
  0xc14a, 0xc14b, 0xc14c, 0xc14d, 0xc14e, 0xc14f, 0xc150, 0xc151,
  0xc152, 0xc153, 0xc154, 0xc155, 0xc156, 0xc157, 0xc158, 0xc159,
  0xc15a, 0xc15b, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161,
  0xc162, 0xc163, 0xc164, 0xc165, 0xc166, 0xc167, 0xc168, 0xc169,
  0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc170, 0xc171,
  0xc172, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc179,
  0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc180, 0xc181, 0xc182,
  0xc183, 0xc184, 0xc185, 0xc186, 0xc187, 0xc188, 0xc189, 0xc18a,
  0xc18b, 0xc18c, 0xc18d, 0xc18e, 0xc18f, 0xc190, 0xc191, 0xc192,
  0xc193, 0xc194, 0xc195, 0xc196, 0xc197, 0xc198, 0xc199, 0xc19a,
  0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xc19f, 0xc1a0, 0xc240, 0xc241,
  0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, 0xc248, 0xc249,
  0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, 0xc250, 0xc251,
  0xc252, 0xc253, 0xc254, 0xc255, 0xc256, 0xc257, 0xc258, 0xc259,
  0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc260, 0xc261,
  0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268, 0xc269,
  0xc26a, 0xc26b, 0xc26c, 0xc26d, 0xc26e, 0xc26f, 0xc270, 0xc271,
  0xc272, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279,
  0xc27a, 0xc27b, 0xc27c, 0xc27d, 0xc27e, 0xc280, 0xc281, 0xc282,
  0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc288, 0xc289, 0xc28a,
  0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, 0xc290, 0xc291, 0xc292,
  0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a,
  0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc340, 0xc341,
  0xc342, 0xc343, 0xc344, 0xc345, 0xc346, 0xc347, 0xc348, 0xc349,
  0xc34a, 0xc34b, 0xc34c, 0xc34d, 0xc34e, 0xc34f, 0xc350, 0xc351,
  0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, 0xc358, 0xc359,
  0xc35a, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361,
  0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc368, 0xc369,
  0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0xc370, 0xc371,
  0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0xc379,
  0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc37e, 0xc380, 0xc381, 0xc382,
  0xc383, 0xc384, 0xc385, 0xc386, 0xc387, 0xc388, 0xc389, 0xc38a,
  0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392,
  0xc393, 0xc394, 0xc395, 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a,
  0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc3a0, 0xc440, 0xc441,
  0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, 0xc448, 0xc449,
  0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, 0xc450, 0xc451,
  0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, 0xc458, 0xc459,
  0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f, 0xc460, 0xc461,
  0xc462, 0xc463, 0xc464, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469,
  0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471,
  0xc472, 0xc473, 0xc474, 0xc475, 0xc476, 0xc477, 0xc478, 0xc479,
  0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc480, 0xc481, 0xc482,
  0xc483, 0xc484, 0xc485, 0xc486, 0xc487, 0xc488, 0xc489, 0xc48a,
  0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0xc491, 0xc492,
  0xc493, 0xc494, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a,
  0xc49b, 0xc49c, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc540, 0xc541,
  0xc542, 0xc543, 0xc544, 0xc545, 0xc546, 0xc547, 0xc548, 0xc549,
  0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, 0xc550, 0xc551,
  0xc552, 0xc553, 0xc554, 0xc555, 0xc556, 0xc557, 0xc558, 0xc559,
  0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc55e, 0xc55f, 0xc560, 0xc561,
  0xc562, 0xc563, 0xc564, 0xc565, 0xc566, 0xc567, 0xc568, 0xc569,
  0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc570, 0xc571,
  0xc572, 0xc573, 0xc574, 0xc575, 0xc576, 0xc577, 0xc578, 0xc579,
  0xc57a, 0xc57b, 0xc57c, 0xc57d, 0xc57e, 0xc580, 0xc581, 0xc582,
  0xc583, 0xc584, 0xc585, 0xc586, 0xc587, 0xc588, 0xc589, 0xc58a,
  0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592,
  0xc593, 0xc594, 0xc595, 0xc596, 0xc597, 0xc598, 0xc599, 0xc59a,
  0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, 0xc5a0, 0xc640, 0xc641,
  0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, 0xc648, 0xc649,
  0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc650, 0xc651,
  0xc652, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, 0xc658, 0xc659,
  0xc65a, 0xc65b, 0xc65c, 0xc65d, 0xc65e, 0xc65f, 0xc660, 0xc661,
  0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668, 0xc669,
  0xc66a, 0xc66b, 0xc66c, 0xc66d, 0xc66e, 0xc66f, 0xc670, 0xc671,
  0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0xc678, 0xc679,
  0xc67a, 0xc67b, 0xc67c, 0xc67d, 0xc67e, 0xc680, 0xc681, 0xc682,
  0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc688, 0xc689, 0xc68a,
  0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, 0xc690, 0xc691, 0xc692,
  0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xc699, 0xc69a,
  0xc69b, 0xc69c, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc740, 0xc741,
  0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749,
  0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751,
  0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759,
  0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761,
  0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769,
  0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771,
  0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779,
  0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc780, 0xc781, 0xc782,
  0xc783, 0xc784, 0xc785, 0xc786, 0xc787, 0xc788, 0xc789, 0xc78a,
  0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, 0xc790, 0xc791, 0xc792,
  0xc793, 0xc794, 0xc795, 0xc796, 0xc797, 0xc798, 0xc799, 0xc79a,
  0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a0, 0xc840, 0xc841,
  0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc848, 0xc849,
  0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851,
  0xc852, 0xc853, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859,
  0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861,
  0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869,
  0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870, 0xc871,
  0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, 0xc878, 0xc879,
  0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc880, 0xc881, 0xc882,
  0xc883, 0xc884, 0xc885, 0xc886, 0xc887, 0xc888, 0xc889, 0xc88a,
  0xc88b, 0xc88c, 0xc88d, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892,
  0xc893, 0xc894, 0xc895, 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a,
  0xc89b, 0xc89c, 0xc89d, 0xc89e, 0xc89f, 0xc8a0, 0xc940, 0xc941,
  0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, 0xc948, 0xc949,
  0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951,
  0xc952, 0xc953, 0xc954, 0xc955, 0xc956, 0xc957, 0xc958, 0xc959,
  0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, 0xc960, 0xc961,
  0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969,
  0xc96a, 0xc96b, 0xc96c, 0xc96d, 0xc96e, 0xc96f, 0xc970, 0xc971,
  0xc972, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979,
  0xc97a, 0xc97b, 0xc97c, 0xc97d, 0xc97e, 0xc980, 0xc981, 0xc982,
  0xc983, 0xc984, 0xc985, 0xc986, 0xc987, 0xc988, 0xc989, 0xc98a,
  0xc98b, 0xc98c, 0xc98d, 0xc98e, 0xc98f, 0xc990, 0xc991, 0xc992,
  0xc993, 0xc994, 0xc995, 0xc996, 0xc997, 0xc998, 0xc999, 0xc99a,
  0xc99b, 0xc99c, 0xc99d, 0xc99e, 0xc99f, 0xc9a0, 0xca40, 0xca41,
  0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, 0xca48, 0xca49,
  0xca4a, 0xca4b, 0xca4c, 0xca4d, 0xca4e, 0xca4f, 0xca50, 0xca51,
  0xca52, 0xca53, 0xca54, 0xca55, 0xca56, 0xca57, 0xca58, 0xca59,
  0xca5a, 0xca5b, 0xca5c, 0xca5d, 0xca5e, 0xca5f, 0xca60, 0xca61,
  0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca68, 0xca69,
  0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71,
  0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79,
  0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xca80, 0xca81, 0xca82,
  0xca83, 0xca84, 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a,
  0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92,
  0xca93, 0xca94, 0xca95, 0xca96, 0xca97, 0xca98, 0xca99, 0xca9a,
  0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, 0xcaa0, 0xcb40, 0xcb41,
  0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0xcb48, 0xcb49,
  0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51,
  0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb58, 0xcb59,
  0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d, 0xcb5e, 0xcb5f, 0xcb60, 0xcb61,
  0xcb62, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69,
  0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70, 0xcb71,
  0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb78, 0xcb79,
  0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 0xcb80, 0xcb81, 0xcb82,
  0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, 0xcb88, 0xcb89, 0xcb8a,
  0xcb8b, 0xcb8c, 0xcb8d, 0xcb8e, 0xcb8f, 0xcb90, 0xcb91, 0xcb92,
  0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a,
  0xcb9b, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, 0xcba0, 0xcc40, 0xcc41,
  0xcc42, 0xcc43, 0xcc44, 0xcc45, 0xcc46, 0xcc47, 0xcc48, 0xcc49,
  0xcc4a, 0xcc4b, 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51,
  0xcc52, 0xcc53, 0xcc54, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xcc59,
  0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc60, 0xcc61,
  0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xcc69,
  0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc70, 0xcc71,
  0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, 0xcc78, 0xcc79,
  0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc80, 0xcc81, 0xcc82,
  0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88, 0xcc89, 0xcc8a,
  0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92,
  0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0xcc98, 0xcc99, 0xcc9a,
  0xcc9b, 0xcc9c, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca0, 0xcd40, 0xcd41,
  0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48, 0xcd49,
  0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50, 0xcd51,
  0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59,
  0xcd5a, 0xcd5b, 0xcd5c, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd60, 0xcd61,
  0xcd62, 0xcd63, 0xcd64, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69,
  0xcd6a, 0xcd6b, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, 0xcd71,
  0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, 0xcd78, 0xcd79,
  0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd80, 0xcd81, 0xcd82,
  0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, 0xcd88, 0xcd89, 0xcd8a,
  0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92,
  0xcd93, 0xcd94, 0xcd95, 0xcd96, 0xcd97, 0xcd98, 0xcd99, 0xcd9a,
  0xcd9b, 0xcd9c, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xce40, 0xce41,
  0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48, 0xce49,
  0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51,
  0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce58, 0xce59,
  0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xce5f, 0xce60, 0xce61,
  0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce68, 0xce69,
  0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, 0xce70, 0xce71,
  0xce72, 0xce73, 0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79,
  0xce7a, 0xce7b, 0xce7c, 0xce7d, 0xce7e, 0xce80, 0xce81, 0xce82,
  0xce83, 0xce84, 0xce85, 0xce86, 0xce87, 0xce88, 0xce89, 0xce8a,
  0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce90, 0xce91, 0xce92,
  0xce93, 0xce94, 0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a,
  0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0xcf40, 0xcf41,
  0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, 0xcf48, 0xcf49,
  0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51,
  0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xcf57, 0xcf58, 0xcf59,
  0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61,
  0xcf62, 0xcf63, 0xcf64, 0xcf65, 0xcf66, 0xcf67, 0xcf68, 0xcf69,
  0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, 0xcf70, 0xcf71,
  0xcf72, 0xcf73, 0xcf74, 0xcf75, 0xcf76, 0xcf77, 0xcf78, 0xcf79,
  0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf80, 0xcf81, 0xcf82,
  0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, 0xcf88, 0xcf89, 0xcf8a,
  0xcf8b, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92,
  0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a,
  0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xd040, 0xd041,
  0xd042, 0xd043, 0xd044, 0xd045, 0xd046, 0xd047, 0xd048, 0xd049,
  0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0xd050, 0xd051,
  0xd052, 0xd053, 0xd054, 0xd055, 0xd056, 0xd057, 0xd058, 0xd059,
  0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd060, 0xd061,
  0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068, 0xd069,
  0xd06a, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070, 0xd071,
  0xd072, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079,
  0xd07a, 0xd07b, 0xd07c, 0xd07d, 0xd07e, 0xd080, 0xd081, 0xd082,
  0xd083, 0xd084, 0xd085, 0xd086, 0xd087, 0xd088, 0xd089, 0xd08a,
  0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd092,
  0xd093, 0xd094, 0xd095, 0xd096, 0xd097, 0xd098, 0xd099, 0xd09a,
  0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, 0xd0a0, 0xd140, 0xd141,
  0xd142, 0xd143, 0xd144, 0xd145, 0xd146, 0xd147, 0xd148, 0xd149,
  0xd14a, 0xd14b, 0xd14c, 0xd14d, 0xd14e, 0xd14f, 0xd150, 0xd151,
  0xd152, 0xd153, 0xd154, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159,
  0xd15a, 0xd15b, 0xd15c, 0xd15d, 0xd15e, 0xd15f, 0xd160, 0xd161,
  0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd168, 0xd169,
  0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, 0xd170, 0xd171,
  0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179,
  0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd17e, 0xd180, 0xd181, 0xd182,
  0xd183, 0xd184, 0xd185, 0xd186, 0xd187, 0xd188, 0xd189, 0xd18a,
  0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd192,
  0xd193, 0xd194, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a,
  0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, 0xd1a0, 0xd240, 0xd241,
  0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, 0xd248, 0xd249,
  0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251,
  0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0xd259,
  0xd25a, 0xd25b, 0xd25c, 0xd25d, 0xd25e, 0xd25f, 0xd260, 0xd261,
  0xd262, 0xd263, 0xd264, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269,
  0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271,
  0xd272, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279,
  0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd27e, 0xd280, 0xd281, 0xd282,
  0xd283, 0xd284, 0xd285, 0xd286, 0xd287, 0xd288, 0xd289, 0xd28a,
  0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd290, 0xd291, 0xd292,
  0xd293, 0xd294, 0xd295, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a,
  0xd29b, 0xd29c, 0xd29d, 0xd29e, 0xd29f, 0xd2a0, 0xd340, 0xd341,
  0xd342, 0xd343, 0xd344, 0xd345, 0xd346, 0xd347, 0xd348, 0xd349,
  0xd34a, 0xd34b, 0xd34c, 0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351,
  0xd352, 0xd353, 0xd354, 0xd355, 0xd356, 0xd357, 0xd358, 0xd359,
  0xd35a, 0xd35b, 0xd35c, 0xd35d, 0xd35e, 0xd35f, 0xd360, 0xd361,
  0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368, 0xd369,
  0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370, 0xd371,
  0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379,
  0xd37a, 0xd37b, 0xd37c, 0xd37d, 0xd37e, 0xd380, 0xd381, 0xd382,
  0xd383, 0xd384, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a,
  0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392,
  0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a,
  0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd440, 0xd441,
  0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449,
  0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451,
  0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459,
  0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xd460, 0xd461,
  0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468, 0xd469,
  0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f, 0xd470, 0xd471,
  0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0xd478, 0xd479,
  0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd480, 0xd481, 0xd482,
  0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd488, 0xd489, 0xd48a,
  0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490, 0xd491, 0xd492,
  0xd493, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a,
  0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd540, 0xd541,
  0xd542, 0xd543, 0xd544, 0xd545, 0xd546, 0xd547, 0xd548, 0xd549,
  0xd54a, 0xd54b, 0xd54c, 0xd54d, 0xd54e, 0xd54f, 0xd550, 0xd551,
  0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0xd558, 0xd559,
  0xd55a, 0xd55b, 0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561,
  0xd562, 0xd563, 0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0xd569,
  0xd56a, 0xd56b, 0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571,
  0xd572, 0xd573, 0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579,
  0xd57a, 0xd57b, 0xd57c, 0xd57d, 0xd57e, 0xd580, 0xd581, 0xd582,
  0xd583, 0xd584, 0xd585, 0xd586, 0xd587, 0xd588, 0xd589, 0xd58a,
  0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0xd590, 0xd591, 0xd592,
  0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a,
  0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd640, 0xd641,
  0xd642, 0xd643, 0xd644, 0xd645, 0xd646, 0xd647, 0xd648, 0xd649,
  0xd64a, 0xd64b, 0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651,
  0xd652, 0xd653, 0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659,
  0xd65a, 0xd65b, 0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661,
  0xd662, 0xd663, 0xd664, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669,
  0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd670, 0xd671,
  0xd672, 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679,
  0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd680, 0xd681, 0xd682,
  0xd683, 0xd684, 0xd685, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a,
  0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692,
  0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a,
  0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd740, 0xd741,
  0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, 0xd748, 0xd749,
  0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd750, 0xd751,
  0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759,
  0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd760, 0xd761,
  0xd762, 0xd763, 0xd764, 0xd765, 0xd766, 0xd767, 0xd768, 0xd769,
  0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f, 0xd770, 0xd771,
  0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, 0xd778, 0xd779,
  0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd780, 0xd781, 0xd782,
  0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd788, 0xd789, 0xd78a,
  0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790, 0xd791, 0xd792,
  0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798, 0xd799, 0xd79a,
  0xd79b, 0xd79c, 0xd79d, 0xd79e, 0xd79f, 0xd7a0, 0xd840, 0xd841,
  0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, 0xd848, 0xd849,
  0xd84a, 0xd84b, 0xd84c, 0xd84d, 0xd84e, 0xd84f, 0xd850, 0xd851,
  0xd852, 0xd853, 0xd854, 0xd855, 0xd856, 0xd857, 0xd858, 0xd859,
  0xd85a, 0xd85b, 0xd85c, 0xd85d, 0xd85e, 0xd85f, 0xd860, 0xd861,
  0xd862, 0xd863, 0xd864, 0xd865, 0xd866, 0xd867, 0xd868, 0xd869,
  0xd86a, 0xd86b, 0xd86c, 0xd86d, 0xd86e, 0xd86f, 0xd870, 0xd871,
  0xd872, 0xd873, 0xd874, 0xd875, 0xd876, 0xd877, 0xd878, 0xd879,
  0xd87a, 0xd87b, 0xd87c, 0xd87d, 0xd87e, 0xd880, 0xd881, 0xd882,
  0xd883, 0xd884, 0xd885, 0xd886, 0xd887, 0xd888, 0xd889, 0xd88a,
  0xd88b, 0xd88c, 0xd88d, 0xd88e, 0xd88f, 0xd890, 0xd891, 0xd892,
  0xd893, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xd899, 0xd89a,
  0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, 0xd8a0, 0xd940, 0xd941,
  0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, 0xd948, 0xd949,
  0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, 0xd950, 0xd951,
  0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, 0xd958, 0xd959,
  0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, 0xd960, 0xd961,
  0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, 0xd968, 0xd969,
  0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, 0xd970, 0xd971,
  0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, 0xd978, 0xd979,
  0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd980, 0xd981, 0xd982,
  0xd983, 0xd984, 0xd985, 0xd986, 0xd987, 0xd988, 0xd989, 0xd98a,
  0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, 0xd990, 0xd991, 0xd992,
  0xd993, 0xd994, 0xd995, 0xd996, 0xd997, 0xd998, 0xd999, 0xd99a,
  0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, 0xd9a0, 0xda40, 0xda41,
  0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, 0xda48, 0xda49,
  0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xda4f, 0xda50, 0xda51,
  0xda52, 0xda53, 0xda54, 0xda55, 0xda56, 0xda57, 0xda58, 0xda59,
  0xda5a, 0xda5b, 0xda5c, 0xda5d, 0xda5e, 0xda5f, 0xda60, 0xda61,
  0xda62, 0xda63, 0xda64, 0xda65, 0xda66, 0xda67, 0xda68, 0xda69,
  0xda6a, 0xda6b, 0xda6c, 0xda6d, 0xda6e, 0xda6f, 0xda70, 0xda71,
  0xda72, 0xda73, 0xda74, 0xda75, 0xda76, 0xda77, 0xda78, 0xda79,
  0xda7a, 0xda7b, 0xda7c, 0xda7d, 0xda7e, 0xda80, 0xda81, 0xda82,
  0xda83, 0xda84, 0xda85, 0xda86, 0xda87, 0xda88, 0xda89, 0xda8a,
  0xda8b, 0xda8c, 0xda8d, 0xda8e, 0xda8f, 0xda90, 0xda91, 0xda92,
  0xda93, 0xda94, 0xda95, 0xda96, 0xda97, 0xda98, 0xda99, 0xda9a,
  0xda9b, 0xda9c, 0xda9d, 0xda9e, 0xda9f, 0xdaa0, 0xdb40, 0xdb41,
  0xdb42, 0xdb43, 0xdb44, 0xdb45, 0xdb46, 0xdb47, 0xdb48, 0xdb49,
  0xdb4a, 0xdb4b, 0xdb4c, 0xdb4d, 0xdb4e, 0xdb4f, 0xdb50, 0xdb51,
  0xdb52, 0xdb53, 0xdb54, 0xdb55, 0xdb56, 0xdb57, 0xdb58, 0xdb59,
  0xdb5a, 0xdb5b, 0xdb5c, 0xdb5d, 0xdb5e, 0xdb5f, 0xdb60, 0xdb61,
  0xdb62, 0xdb63, 0xdb64, 0xdb65, 0xdb66, 0xdb67, 0xdb68, 0xdb69,
  0xdb6a, 0xdb6b, 0xdb6c, 0xdb6d, 0xdb6e, 0xdb6f, 0xdb70, 0xdb71,
  0xdb72, 0xdb73, 0xdb74, 0xdb75, 0xdb76, 0xdb77, 0xdb78, 0xdb79,
  0xdb7a, 0xdb7b, 0xdb7c, 0xdb7d, 0xdb7e, 0xdb80, 0xdb81, 0xdb82,
  0xdb83, 0xdb84, 0xdb85, 0xdb86, 0xdb87, 0xdb88, 0xdb89, 0xdb8a,
  0xdb8b, 0xdb8c, 0xdb8d, 0xdb8e, 0xdb8f, 0xdb90, 0xdb91, 0xdb92,
  0xdb93, 0xdb94, 0xdb95, 0xdb96, 0xdb97, 0xdb98, 0xdb99, 0xdb9a,
  0xdb9b, 0xdb9c, 0xdb9d, 0xdb9e, 0xdb9f, 0xdba0, 0xdc40, 0xdc41,
  0xdc42, 0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xdc47, 0xdc48, 0xdc49,
  0xdc4a, 0xdc4b, 0xdc4c, 0xdc4d, 0xdc4e, 0xdc4f, 0xdc50, 0xdc51,
  0xdc52, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc57, 0xdc58, 0xdc59,
  0xdc5a, 0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xdc5f, 0xdc60, 0xdc61,
  0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68, 0xdc69,
  0xdc6a, 0xdc6b, 0xdc6c, 0xdc6d, 0xdc6e, 0xdc6f, 0xdc70, 0xdc71,
  0xdc72, 0xdc73, 0xdc74, 0xdc75, 0xdc76, 0xdc77, 0xdc78, 0xdc79,
  0xdc7a, 0xdc7b, 0xdc7c, 0xdc7d, 0xdc7e, 0xdc80, 0xdc81, 0xdc82,
  0xdc83, 0xdc84, 0xdc85, 0xdc86, 0xdc87, 0xdc88, 0xdc89, 0xdc8a,
  0xdc8b, 0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, 0xdc90, 0xdc91, 0xdc92,
  0xdc93, 0xdc94, 0xdc95, 0xdc96, 0xdc97, 0xdc98, 0xdc99, 0xdc9a,
  0xdc9b, 0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, 0xdca0, 0xdd40, 0xdd41,
  0xdd42, 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, 0xdd48, 0xdd49,
  0xdd4a, 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51,
  0xdd52, 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58, 0xdd59,
  0xdd5a, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61,
  0xdd62, 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68, 0xdd69,
  0xdd6a, 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70, 0xdd71,
  0xdd72, 0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, 0xdd78, 0xdd79,
  0xdd7a, 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd80, 0xdd81, 0xdd82,
  0xdd83, 0xdd84, 0xdd85, 0xdd86, 0xdd87, 0xdd88, 0xdd89, 0xdd8a,
  0xdd8b, 0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, 0xdd90, 0xdd91, 0xdd92,
  0xdd93, 0xdd94, 0xdd95, 0xdd96, 0xdd97, 0xdd98, 0xdd99, 0xdd9a,
  0xdd9b, 0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0xde40, 0xde41,
  0xde42, 0xde43, 0xde44, 0xde45, 0xde46, 0xde47, 0xde48, 0xde49,
  0xde4a, 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, 0xde50, 0xde51,
  0xde52, 0xde53, 0xde54, 0xde55, 0xde56, 0xde57, 0xde58, 0xde59,
  0xde5a, 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, 0xde60, 0xde61,
  0xde62, 0xde63, 0xde64, 0xde65, 0xde66, 0xde67, 0xde68, 0xde69,
  0xde6a, 0xde6b, 0xde6c, 0xde6d, 0xde6e, 0xde6f, 0xde70, 0xde71,
  0xde72, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, 0xde78, 0xde79,
  0xde7a, 0xde7b, 0xde7c, 0xde7d, 0xde7e, 0xde80, 0xde81, 0xde82,
  0xde83, 0xde84, 0xde85, 0xde86, 0xde87, 0xde88, 0xde89, 0xde8a,
  0xde8b, 0xde8c, 0xde8d, 0xde8e, 0xde8f, 0xde90, 0xde91, 0xde92,
  0xde93, 0xde94, 0xde95, 0xde96, 0xde97, 0xde98, 0xde99, 0xde9a,
  0xde9b, 0xde9c, 0xde9d, 0xde9e, 0xde9f, 0xdea0, 0xdf40, 0xdf41,
  0xdf42, 0xdf43, 0xdf44, 0xdf45, 0xdf46, 0xdf47, 0xdf48, 0xdf49,
  0xdf4a, 0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, 0xdf50, 0xdf51,
  0xdf52, 0xdf53, 0xdf54, 0xdf55, 0xdf56, 0xdf57, 0xdf58, 0xdf59,
  0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xdf5e, 0xdf5f, 0xdf60, 0xdf61,
  0xdf62, 0xdf63, 0xdf64, 0xdf65, 0xdf66, 0xdf67, 0xdf68, 0xdf69,
  0xdf6a, 0xdf6b, 0xdf6c, 0xdf6d, 0xdf6e, 0xdf6f, 0xdf70, 0xdf71,
  0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xdf76, 0xdf77, 0xdf78, 0xdf79,
  0xdf7a, 0xdf7b, 0xdf7c, 0xdf7d, 0xdf7e, 0xdf80, 0xdf81, 0xdf82,
  0xdf83, 0xdf84, 0xdf85, 0xdf86, 0xdf87, 0xdf88, 0xdf89, 0xdf8a,
  0xdf8b, 0xdf8c, 0xdf8d, 0xdf8e, 0xdf8f, 0xdf90, 0xdf91, 0xdf92,
  0xdf93, 0xdf94, 0xdf95, 0xdf96, 0xdf97, 0xdf98, 0xdf99, 0xdf9a,
  0xdf9b, 0xdf9c, 0xdf9d, 0xdf9e, 0xdf9f, 0xdfa0, 0xe040, 0xe041,
  0xe042, 0xe043, 0xe044, 0xe045, 0xe046, 0xe047, 0xe048, 0xe049,
  0xe04a, 0xe04b, 0xe04c, 0xe04d, 0xe04e, 0xe04f, 0xe050, 0xe051,
  0xe052, 0xe053, 0xe054, 0xe055, 0xe056, 0xe057, 0xe058, 0xe059,
  0xe05a, 0xe05b, 0xe05c, 0xe05d, 0xe05e, 0xe05f, 0xe060, 0xe061,
  0xe062, 0xe063, 0xe064, 0xe065, 0xe066, 0xe067, 0xe068, 0xe069,
  0xe06a, 0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, 0xe070, 0xe071,
  0xe072, 0xe073, 0xe074, 0xe075, 0xe076, 0xe077, 0xe078, 0xe079,
  0xe07a, 0xe07b, 0xe07c, 0xe07d, 0xe07e, 0xe080, 0xe081, 0xe082,
  0xe083, 0xe084, 0xe085, 0xe086, 0xe087, 0xe088, 0xe089, 0xe08a,
  0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xe08f, 0xe090, 0xe091, 0xe092,
  0xe093, 0xe094, 0xe095, 0xe096, 0xe097, 0xe098, 0xe099, 0xe09a,
  0xe09b, 0xe09c, 0xe09d, 0xe09e, 0xe09f, 0xe0a0, 0xe140, 0xe141,
  0xe142, 0xe143, 0xe144, 0xe145, 0xe146, 0xe147, 0xe148, 0xe149,
  0xe14a, 0xe14b, 0xe14c, 0xe14d, 0xe14e, 0xe14f, 0xe150, 0xe151,
  0xe152, 0xe153, 0xe154, 0xe155, 0xe156, 0xe157, 0xe158, 0xe159,
  0xe15a, 0xe15b, 0xe15c, 0xe15d, 0xe15e, 0xe15f, 0xe160, 0xe161,
  0xe162, 0xe163, 0xe164, 0xe165, 0xe166, 0xe167, 0xe168, 0xe169,
  0xe16a, 0xe16b, 0xe16c, 0xe16d, 0xe16e, 0xe16f, 0xe170, 0xe171,
  0xe172, 0xe173, 0xe174, 0xe175, 0xe176, 0xe177, 0xe178, 0xe179,
  0xe17a, 0xe17b, 0xe17c, 0xe17d, 0xe17e, 0xe180, 0xe181, 0xe182,
  0xe183, 0xe184, 0xe185, 0xe186, 0xe187, 0xe188, 0xe189, 0xe18a,
  0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192,
  0xe193, 0xe194, 0xe195, 0xe196, 0xe197, 0xe198, 0xe199, 0xe19a,
  0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe240, 0xe241,
  0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249,
  0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251,
  0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, 0xe258, 0xe259,
  0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, 0xe260, 0xe261,
  0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, 0xe268, 0xe269,
  0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, 0xe270, 0xe271,
  0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, 0xe278, 0xe279,
  0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe280, 0xe281, 0xe282,
  0xe283, 0xe284, 0xe285, 0xe286, 0xe287, 0xe288, 0xe289, 0xe28a,
  0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, 0xe290, 0xe291, 0xe292,
  0xe293, 0xe294, 0xe295, 0xe296, 0xe297, 0xe298, 0xe299, 0xe29a,
  0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, 0xe2a0, 0xe340, 0xe341,
  0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, 0xe348, 0xe349,
  0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, 0xe350, 0xe351,
  0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, 0xe358, 0xe359,
  0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, 0xe360, 0xe361,
  0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, 0xe368, 0xe369,
  0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xe36e, 0xe36f, 0xe370, 0xe371,
  0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, 0xe378, 0xe379,
  0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe380, 0xe381, 0xe382,
  0xe383, 0xe384, 0xe385, 0xe386, 0xe387, 0xe388, 0xe389, 0xe38a,
  0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, 0xe390, 0xe391, 0xe392,
  0xe393, 0xe394, 0xe395, 0xe396, 0xe397, 0xe398, 0xe399, 0xe39a,
  0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, 0xe3a0, 0xe440, 0xe441,
  0xe442, 0xe443, 0xe444, 0xe445, 0xe446, 0xe447, 0xe448, 0xe449,
  0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e, 0xe44f, 0xe450, 0xe451,
  0xe452, 0xe453, 0xe454, 0xe455, 0xe456, 0xe457, 0xe458, 0xe459,
  0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e, 0xe45f, 0xe460, 0xe461,
  0xe462, 0xe463, 0xe464, 0xe465, 0xe466, 0xe467, 0xe468, 0xe469,
  0xe46a, 0xe46b, 0xe46c, 0xe46d, 0xe46e, 0xe46f, 0xe470, 0xe471,
  0xe472, 0xe473, 0xe474, 0xe475, 0xe476, 0xe477, 0xe478, 0xe479,
  0xe47a, 0xe47b, 0xe47c, 0xe47d, 0xe47e, 0xe480, 0xe481, 0xe482,
  0xe483, 0xe484, 0xe485, 0xe486, 0xe487, 0xe488, 0xe489, 0xe48a,
  0xe48b, 0xe48c, 0xe48d, 0xe48e, 0xe48f, 0xe490, 0xe491, 0xe492,
  0xe493, 0xe494, 0xe495, 0xe496, 0xe497, 0xe498, 0xe499, 0xe49a,
  0xe49b, 0xe49c, 0xe49d, 0xe49e, 0xe49f, 0xe4a0, 0xe540, 0xe541,
  0xe542, 0xe543, 0xe544, 0xe545, 0xe546, 0xe547, 0xe548, 0xe549,
  0xe54a, 0xe54b, 0xe54c, 0xe54d, 0xe54e, 0xe54f, 0xe550, 0xe551,
  0xe552, 0xe553, 0xe554, 0xe555, 0xe556, 0xe557, 0xe558, 0xe559,
  0xe55a, 0xe55b, 0xe55c, 0xe55d, 0xe55e, 0xe55f, 0xe560, 0xe561,
  0xe562, 0xe563, 0xe564, 0xe565, 0xe566, 0xe567, 0xe568, 0xe569,
  0xe56a, 0xe56b, 0xe56c, 0xe56d, 0xe56e, 0xe56f, 0xe570, 0xe571,
  0xe572, 0xe573, 0xe574, 0xe575, 0xe576, 0xe577, 0xe578, 0xe579,
  0xe57a, 0xe57b, 0xe57c, 0xe57d, 0xe57e, 0xe580, 0xe581, 0xe582,
  0xe583, 0xe584, 0xe585, 0xe586, 0xe587, 0xe588, 0xe589, 0xe58a,
  0xe58b, 0xe58c, 0xe58d, 0xe58e, 0xe58f, 0xe590, 0xe591, 0xe592,
  0xe593, 0xe594, 0xe595, 0xe596, 0xe597, 0xe598, 0xe599, 0xe59a,
  0xe59b, 0xe59c, 0xe59d, 0xe59e, 0xe59f, 0xe5a0, 0xe640, 0xe641,
  0xe642, 0xe643, 0xe644, 0xe645, 0xe646, 0xe647, 0xe648, 0xe649,
  0xe64a, 0xe64b, 0xe64c, 0xe64d, 0xe64e, 0xe64f, 0xe650, 0xe651,
  0xe652, 0xe653, 0xe654, 0xe655, 0xe656, 0xe657, 0xe658, 0xe659,
  0xe65a, 0xe65b, 0xe65c, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0xe661,
  0xe662, 0xe663, 0xe664, 0xe665, 0xe666, 0xe667, 0xe668, 0xe669,
  0xe66a, 0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, 0xe670, 0xe671,
  0xe672, 0xe673, 0xe674, 0xe675, 0xe676, 0xe677, 0xe678, 0xe679,
  0xe67a, 0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe680, 0xe681, 0xe682,
  0xe683, 0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0xe689, 0xe68a,
  0xe68b, 0xe68c, 0xe68d, 0xe68e, 0xe68f, 0xe690, 0xe691, 0xe692,
  0xe693, 0xe694, 0xe695, 0xe696, 0xe697, 0xe698, 0xe699, 0xe69a,
  0xe69b, 0xe69c, 0xe69d, 0xe69e, 0xe69f, 0xe6a0, 0xe740, 0xe741,
  0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, 0xe748, 0xe749,
  0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, 0xe750, 0xe751,
  0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, 0xe758, 0xe759,
  0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, 0xe760, 0xe761,
  0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, 0xe768, 0xe769,
  0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, 0xe770, 0xe771,
  0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, 0xe778, 0xe779,
  0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe780, 0xe781, 0xe782,
  0xe783, 0xe784, 0xe785, 0xe786, 0xe787, 0xe788, 0xe789, 0xe78a,
  0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791, 0xe792,
  0xe793, 0xe794, 0xe795, 0xe796, 0xe797, 0xe798, 0xe799, 0xe79a,
  0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, 0xe7a0, 0xe840, 0xe841,
  0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, 0xe848, 0xe849,
  0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xe84f, 0xe850, 0xe851,
  0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857, 0xe858, 0xe859,
  0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f, 0xe860, 0xe861,
  0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867, 0xe868, 0xe869,
  0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f, 0xe870, 0xe871,
  0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877, 0xe878, 0xe879,
  0xe87a, 0xe87b, 0xe87c, 0xe87d, 0xe87e, 0xe880, 0xe881, 0xe882,
  0xe883, 0xe884, 0xe885, 0xe886, 0xe887, 0xe888, 0xe889, 0xe88a,
  0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f, 0xe890, 0xe891, 0xe892,
  0xe893, 0xe894, 0xe895, 0xe896, 0xe897, 0xe898, 0xe899, 0xe89a,
  0xe89b, 0xe89c, 0xe89d, 0xe89e, 0xe89f, 0xe8a0, 0xe940, 0xe941,
  0xe942, 0xe943, 0xe944, 0xe945, 0xe946, 0xe947, 0xe948, 0xe949,
  0xe94a, 0xe94b, 0xe94c, 0xe94d, 0xe94e, 0xe94f, 0xe950, 0xe951,
  0xe952, 0xe953, 0xe954, 0xe955, 0xe956, 0xe957, 0xe958, 0xe959,
  0xe95a, 0xe95b, 0xe95c, 0xe95d, 0xe95e, 0xe95f, 0xe960, 0xe961,
  0xe962, 0xe963, 0xe964, 0xe965, 0xe966, 0xe967, 0xe968, 0xe969,
  0xe96a, 0xe96b, 0xe96c, 0xe96d, 0xe96e, 0xe96f, 0xe970, 0xe971,
  0xe972, 0xe973, 0xe974, 0xe975, 0xe976, 0xe977, 0xe978, 0xe979,
  0xe97a, 0xe97b, 0xe97c, 0xe97d, 0xe97e, 0xe980, 0xe981, 0xe982,
  0xe983, 0xe984, 0xe985, 0xe986, 0xe987, 0xe988, 0xe989, 0xe98a,
  0xe98b, 0xe98c, 0xe98d, 0xe98e, 0xe98f, 0xe990, 0xe991, 0xe992,
  0xe993, 0xe994, 0xe995, 0xe996, 0xe997, 0xe998, 0xe999, 0xe99a,
  0xe99b, 0xe99c, 0xe99d, 0xe99e, 0xe99f, 0xe9a0, 0xea40, 0xea41,
  0xea42, 0xea43, 0xea44, 0xea45, 0xea46, 0xea47, 0xea48, 0xea49,
  0xea4a, 0xea4b, 0xea4c, 0xea4d, 0xea4e, 0xea4f, 0xea50, 0xea51,
  0xea52, 0xea53, 0xea54, 0xea55, 0xea56, 0xea57, 0xea58, 0xea59,
  0xea5a, 0xea5b, 0xea5c, 0xea5d, 0xea5e, 0xea5f, 0xea60, 0xea61,
  0xea62, 0xea63, 0xea64, 0xea65, 0xea66, 0xea67, 0xea68, 0xea69,
  0xea6a, 0xea6b, 0xea6c, 0xea6d, 0xea6e, 0xea6f, 0xea70, 0xea71,
  0xea72, 0xea73, 0xea74, 0xea75, 0xea76, 0xea77, 0xea78, 0xea79,
  0xea7a, 0xea7b, 0xea7c, 0xea7d, 0xea7e, 0xea80, 0xea81, 0xea82,
  0xea83, 0xea84, 0xea85, 0xea86, 0xea87, 0xea88, 0xea89, 0xea8a,
  0xea8b, 0xea8c, 0xea8d, 0xea8e, 0xea8f, 0xea90, 0xea91, 0xea92,
  0xea93, 0xea94, 0xea95, 0xea96, 0xea97, 0xea98, 0xea99, 0xea9a,
  0xea9b, 0xea9c, 0xea9d, 0xea9e, 0xea9f, 0xeaa0, 0xeb40, 0xeb41,
  0xeb42, 0xeb43, 0xeb44, 0xeb45, 0xeb46, 0xeb47, 0xeb48, 0xeb49,
  0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0xeb51,
  0xeb52, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59,
  0xeb5a, 0xeb5b, 0xeb5c, 0xeb5d, 0xeb5e, 0xeb5f, 0xeb60, 0xeb61,
  0xeb62, 0xeb63, 0xeb64, 0xeb65, 0xeb66, 0xeb67, 0xeb68, 0xeb69,
  0xeb6a, 0xeb6b, 0xeb6c, 0xeb6d, 0xeb6e, 0xeb6f, 0xeb70, 0xeb71,
  0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76, 0xeb77, 0xeb78, 0xeb79,
  0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xeb80, 0xeb81, 0xeb82,
  0xeb83, 0xeb84, 0xeb85, 0xeb86, 0xeb87, 0xeb88, 0xeb89, 0xeb8a,
  0xeb8b, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, 0xeb90, 0xeb91, 0xeb92,
  0xeb93, 0xeb94, 0xeb95, 0xeb96, 0xeb97, 0xeb98, 0xeb99, 0xeb9a,
  0xeb9b, 0xeb9c, 0xeb9d, 0xeb9e, 0xeb9f, 0xeba0, 0xec40, 0xec41,
  0xec42, 0xec43, 0xec44, 0xec45, 0xec46, 0xec47, 0xec48, 0xec49,
  0xec4a, 0xec4b, 0xec4c, 0xec4d, 0xec4e, 0xec4f, 0xec50, 0xec51,
  0xec52, 0xec53, 0xec54, 0xec55, 0xec56, 0xec57, 0xec58, 0xec59,
  0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f, 0xec60, 0xec61,
  0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67, 0xec68, 0xec69,
  0xec6a, 0xec6b, 0xec6c, 0xec6d, 0xec6e, 0xec6f, 0xec70, 0xec71,
  0xec72, 0xec73, 0xec74, 0xec75, 0xec76, 0xec77, 0xec78, 0xec79,
  0xec7a, 0xec7b, 0xec7c, 0xec7d, 0xec7e, 0xec80, 0xec81, 0xec82,
  0xec83, 0xec84, 0xec85, 0xec86, 0xec87, 0xec88, 0xec89, 0xec8a,
  0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xec8f, 0xec90, 0xec91, 0xec92,
  0xec93, 0xec94, 0xec95, 0xec96, 0xec97, 0xec98, 0xec99, 0xec9a,
  0xec9b, 0xec9c, 0xec9d, 0xec9e, 0xec9f, 0xeca0, 0xed40, 0xed41,
  0xed42, 0xed43, 0xed44, 0xed45, 0xed46, 0xed47, 0xed48, 0xed49,
  0xed4a, 0xed4b, 0xed4c, 0xed4d, 0xed4e, 0xed4f, 0xed50, 0xed51,
  0xed52, 0xed53, 0xed54, 0xed55, 0xed56, 0xed57, 0xed58, 0xed59,
  0xed5a, 0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, 0xed60, 0xed61,
  0xed62, 0xed63, 0xed64, 0xed65, 0xed66, 0xed67, 0xed68, 0xed69,
  0xed6a, 0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, 0xed70, 0xed71,
  0xed72, 0xed73, 0xed74, 0xed75, 0xed76, 0xed77, 0xed78, 0xed79,
  0xed7a, 0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed80, 0xed81, 0xed82,
  0xed83, 0xed84, 0xed85, 0xed86, 0xed87, 0xed88, 0xed89, 0xed8a,
  0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, 0xed90, 0xed91, 0xed92,
  0xed93, 0xed94, 0xed95, 0xed96, 0xed97, 0xed98, 0xed99, 0xed9a,
  0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, 0xeda0, 0xee40, 0xee41,
  0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, 0xee48, 0xee49,
  0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, 0xee50, 0xee51,
  0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, 0xee58, 0xee59,
  0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, 0xee60, 0xee61,
  0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, 0xee68, 0xee69,
  0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, 0xee70, 0xee71,
  0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, 0xee78, 0xee79,
  0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee80, 0xee81, 0xee82,
  0xee83, 0xee84, 0xee85, 0xee86, 0xee87, 0xee88, 0xee89, 0xee8a,
  0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, 0xee90, 0xee91, 0xee92,
  0xee93, 0xee94, 0xee95, 0xee96, 0xee97, 0xee98, 0xee99, 0xee9a,
  0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, 0xeea0, 0xef40, 0xef41,
  0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47, 0xef48, 0xef49,
  0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51,
  0xef52, 0xef53, 0xef54, 0xef55, 0xef56, 0xef57, 0xef58, 0xef59,
  0xef5a, 0xef5b, 0xef5c, 0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61,
  0xef62, 0xef63, 0xef64, 0xef65, 0xef66, 0xef67, 0xef68, 0xef69,
  0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71,
  0xef72, 0xef73, 0xef74, 0xef75, 0xef76, 0xef77, 0xef78, 0xef79,
  0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef80, 0xef81, 0xef82,
  0xef83, 0xef84, 0xef85, 0xef86, 0xef87, 0xef88, 0xef89, 0xef8a,
  0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90, 0xef91, 0xef92,
  0xef93, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98, 0xef99, 0xef9a,
  0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0, 0xf040, 0xf041,
  0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047, 0xf048, 0xf049,
  0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f, 0xf050, 0xf051,
  0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057, 0xf058, 0xf059,
  0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f, 0xf060, 0xf061,
  0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067, 0xf068, 0xf069,
  0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071,
  0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077, 0xf078, 0xf079,
  0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf080, 0xf081, 0xf082,
  0xf083, 0xf084, 0xf085, 0xf086, 0xf087, 0xf088, 0xf089, 0xf08a,
  0xf08b, 0xf08c, 0xf08d, 0xf08e, 0xf08f, 0xf090, 0xf091, 0xf092,
  0xf093, 0xf094, 0xf095, 0xf096, 0xf097, 0xf098, 0xf099, 0xf09a,
  0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f, 0xf0a0, 0xf140, 0xf141,
  0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147, 0xf148, 0xf149,
  0xf14a, 0xf14b, 0xf14c, 0xf14d, 0xf14e, 0xf14f, 0xf150, 0xf151,
  0xf152, 0xf153, 0xf154, 0xf155, 0xf156, 0xf157, 0xf158, 0xf159,
  0xf15a, 0xf15b, 0xf15c, 0xf15d, 0xf15e, 0xf15f, 0xf160, 0xf161,
  0xf162, 0xf163, 0xf164, 0xf165, 0xf166, 0xf167, 0xf168, 0xf169,
  0xf16a, 0xf16b, 0xf16c, 0xf16d, 0xf16e, 0xf16f, 0xf170, 0xf171,
  0xf172, 0xf173, 0xf174, 0xf175, 0xf176, 0xf177, 0xf178, 0xf179,
  0xf17a, 0xf17b, 0xf17c, 0xf17d, 0xf17e, 0xf180, 0xf181, 0xf182,
  0xf183, 0xf184, 0xf185, 0xf186, 0xf187, 0xf188, 0xf189, 0xf18a,
  0xf18b, 0xf18c, 0xf18d, 0xf18e, 0xf18f, 0xf190, 0xf191, 0xf192,
  0xf193, 0xf194, 0xf195, 0xf196, 0xf197, 0xf198, 0xf199, 0xf19a,
  0xf19b, 0xf19c, 0xf19d, 0xf19e, 0xf19f, 0xf1a0, 0xf240, 0xf241,
  0xf242, 0xf243, 0xf244, 0xf245, 0xf246, 0xf247, 0xf248, 0xf249,
  0xf24a, 0xf24b, 0xf24c, 0xf24d, 0xf24e, 0xf24f, 0xf250, 0xf251,
  0xf252, 0xf253, 0xf254, 0xf255, 0xf256, 0xf257, 0xf258, 0xf259,
  0xf25a, 0xf25b, 0xf25c, 0xf25d, 0xf25e, 0xf25f, 0xf260, 0xf261,
  0xf262, 0xf263, 0xf264, 0xf265, 0xf266, 0xf267, 0xf268, 0xf269,
  0xf26a, 0xf26b, 0xf26c, 0xf26d, 0xf26e, 0xf26f, 0xf270, 0xf271,
  0xf272, 0xf273, 0xf274, 0xf275, 0xf276, 0xf277, 0xf278, 0xf279,
  0xf27a, 0xf27b, 0xf27c, 0xf27d, 0xf27e, 0xf280, 0xf281, 0xf282,
  0xf283, 0xf284, 0xf285, 0xf286, 0xf287, 0xf288, 0xf289, 0xf28a,
  0xf28b, 0xf28c, 0xf28d, 0xf28e, 0xf28f, 0xf290, 0xf291, 0xf292,
  0xf293, 0xf294, 0xf295, 0xf296, 0xf297, 0xf298, 0xf299, 0xf29a,
  0xf29b, 0xf29c, 0xf29d, 0xf29e, 0xf29f, 0xf2a0, 0xf340, 0xf341,
  0xf342, 0xf343, 0xf344, 0xf345, 0xf346, 0xf347, 0xf348, 0xf349,
  0xf34a, 0xf34b, 0xf34c, 0xf34d, 0xf34e, 0xf34f, 0xf350, 0xf351,
  0xf352, 0xf353, 0xf354, 0xf355, 0xf356, 0xf357, 0xf358, 0xf359,
  0xf35a, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361,
  0xf362, 0xf363, 0xf364, 0xf365, 0xf366, 0xf367, 0xf368, 0xf369,
  0xf36a, 0xf36b, 0xf36c, 0xf36d, 0xf36e, 0xf36f, 0xf370, 0xf371,
  0xf372, 0xf373, 0xf374, 0xf375, 0xf376, 0xf377, 0xf378, 0xf379,
  0xf37a, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf380, 0xf381, 0xf382,
  0xf383, 0xf384, 0xf385, 0xf386, 0xf387, 0xf388, 0xf389, 0xf38a,
  0xf38b, 0xf38c, 0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392,
  0xf393, 0xf394, 0xf395, 0xf396, 0xf397, 0xf398, 0xf399, 0xf39a,
  0xf39b, 0xf39c, 0xf39d, 0xf39e, 0xf39f, 0xf3a0, 0xf440, 0xf441,
  0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf447, 0xf448, 0xf449,
  0xf44a, 0xf44b, 0xf44c, 0xf44d, 0xf44e, 0xf44f, 0xf450, 0xf451,
  0xf452, 0xf453, 0xf454, 0xf455, 0xf456, 0xf457, 0xf458, 0xf459,
  0xf45a, 0xf45b, 0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461,
  0xf462, 0xf463, 0xf464, 0xf465, 0xf466, 0xf467, 0xf468, 0xf469,
  0xf46a, 0xf46b, 0xf46c, 0xf46d, 0xf46e, 0xf46f, 0xf470, 0xf471,
  0xf472, 0xf473, 0xf474, 0xf475, 0xf476, 0xf477, 0xf478, 0xf479,
  0xf47a, 0xf47b, 0xf47c, 0xf47d, 0xf47e, 0xf480, 0xf481, 0xf482,
  0xf483, 0xf484, 0xf485, 0xf486, 0xf487, 0xf488, 0xf489, 0xf48a,
  0xf48b, 0xf48c, 0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0xf492,
  0xf493, 0xf494, 0xf495, 0xf496, 0xf497, 0xf498, 0xf499, 0xf49a,
  0xf49b, 0xf49c, 0xf49d, 0xf49e, 0xf49f, 0xf4a0, 0xf540, 0xf541,
  0xf542, 0xf543, 0xf544, 0xf545, 0xf546, 0xf547, 0xf548, 0xf549,
  0xf54a, 0xf54b, 0xf54c, 0xf54d, 0xf54e, 0xf54f, 0xf550, 0xf551,
  0xf552, 0xf553, 0xf554, 0xf555, 0xf556, 0xf557, 0xf558, 0xf559,
  0xf55a, 0xf55b, 0xf55c, 0xf55d, 0xf55e, 0xf55f, 0xf560, 0xf561,
  0xf562, 0xf563, 0xf564, 0xf565, 0xf566, 0xf567, 0xf568, 0xf569,
  0xf56a, 0xf56b, 0xf56c, 0xf56d, 0xf56e, 0xf56f, 0xf570, 0xf571,
  0xf572, 0xf573, 0xf574, 0xf575, 0xf576, 0xf577, 0xf578, 0xf579,
  0xf57a, 0xf57b, 0xf57c, 0xf57d, 0xf57e, 0xf580, 0xf581, 0xf582,
  0xf583, 0xf584, 0xf585, 0xf586, 0xf587, 0xf588, 0xf589, 0xf58a,
  0xf58b, 0xf58c, 0xf58d, 0xf58e, 0xf58f, 0xf590, 0xf591, 0xf592,
  0xf593, 0xf594, 0xf595, 0xf596, 0xf597, 0xf598, 0xf599, 0xf59a,
  0xf59b, 0xf59c, 0xf59d, 0xf59e, 0xf59f, 0xf5a0, 0xf640, 0xf641,
  0xf642, 0xf643, 0xf644, 0xf645, 0xf646, 0xf647, 0xf648, 0xf649,
  0xf64a, 0xf64b, 0xf64c, 0xf64d, 0xf64e, 0xf64f, 0xf650, 0xf651,
  0xf652, 0xf653, 0xf654, 0xf655, 0xf656, 0xf657, 0xf658, 0xf659,
  0xf65a, 0xf65b, 0xf65c, 0xf65d, 0xf65e, 0xf65f, 0xf660, 0xf661,
  0xf662, 0xf663, 0xf664, 0xf665, 0xf666, 0xf667, 0xf668, 0xf669,
  0xf66a, 0xf66b, 0xf66c, 0xf66d, 0xf66e, 0xf66f, 0xf670, 0xf671,
  0xf672, 0xf673, 0xf674, 0xf675, 0xf676, 0xf677, 0xf678, 0xf679,
  0xf67a, 0xf67b, 0xf67c, 0xf67d, 0xf67e, 0xf680, 0xf681, 0xf682,
  0xf683, 0xf684, 0xf685, 0xf686, 0xf687, 0xf688, 0xf689, 0xf68a,
  0xf68b, 0xf68c, 0xf68d, 0xf68e, 0xf68f, 0xf690, 0xf691, 0xf692,
  0xf693, 0xf694, 0xf695, 0xf696, 0xf697, 0xf698, 0xf699, 0xf69a,
  0xf69b, 0xf69c, 0xf69d, 0xf69e, 0xf69f, 0xf6a0, 0xf740, 0xf741,
  0xf742, 0xf743, 0xf744, 0xf745, 0xf746, 0xf747, 0xf748, 0xf749,
  0xf74a, 0xf74b, 0xf74c, 0xf74d, 0xf74e, 0xf74f, 0xf750, 0xf751,
  0xf752, 0xf753, 0xf754, 0xf755, 0xf756, 0xf757, 0xf758, 0xf759,
  0xf75a, 0xf75b, 0xf75c, 0xf75d, 0xf75e, 0xf75f, 0xf760, 0xf761,
  0xf762, 0xf763, 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769,
  0xf76a, 0xf76b, 0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771,
  0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0xf779,
  0xf77a, 0xf77b, 0xf77c, 0xf77d, 0xf77e, 0xf780, 0xf781, 0xf782,
  0xf783, 0xf784, 0xf785, 0xf786, 0xf787, 0xf788, 0xf789, 0xf78a,
  0xf78b, 0xf78c, 0xf78d, 0xf78e, 0xf78f, 0xf790, 0xf791, 0xf792,
  0xf793, 0xf794, 0xf795, 0xf796, 0xf797, 0xf798, 0xf799, 0xf79a,
  0xf79b, 0xf79c, 0xf79d, 0xf79e, 0xf79f, 0xf7a0, 0xf840, 0xf841,
  0xf842, 0xf843, 0xf844, 0xf845, 0xf846, 0xf847, 0xf848, 0xf849,
  0xf84a, 0xf84b, 0xf84c, 0xf84d, 0xf84e, 0xf84f, 0xf850, 0xf851,
  0xf852, 0xf853, 0xf854, 0xf855, 0xf856, 0xf857, 0xf858, 0xf859,
  0xf85a, 0xf85b, 0xf85c, 0xf85d, 0xf85e, 0xf85f, 0xf860, 0xf861,
  0xf862, 0xf863, 0xf864, 0xf865, 0xf866, 0xf867, 0xf868, 0xf869,
  0xf86a, 0xf86b, 0xf86c, 0xf86d, 0xf86e, 0xf86f, 0xf870, 0xf871,
  0xf872, 0xf873, 0xf874, 0xf875, 0xf876, 0xf877, 0xf878, 0xf879,
  0xf87a, 0xf87b, 0xf87c, 0xf87d, 0xf87e, 0xf880, 0xf881, 0xf882,
  0xf883, 0xf884, 0xf885, 0xf886, 0xf887, 0xf888, 0xf889, 0xf88a,
  0xf88b, 0xf88c, 0xf88d, 0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892,
  0xf893, 0xf894, 0xf895, 0xf896, 0xf897, 0xf898, 0xf899, 0xf89a,
  0xf89b, 0xf89c, 0xf89d, 0xf89e, 0xf89f, 0xf8a0, 0xf940, 0xf941,
  0xf942, 0xf943, 0xf944, 0xf945, 0xf946, 0xf947, 0xf948, 0xf949,
  0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951,
  0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0xf958, 0xf959,
  0xf95a, 0xf95b, 0xf95c, 0xf95d, 0xf95e, 0xf95f, 0xf960, 0xf961,
  0xf962, 0xf963, 0xf964, 0xf965, 0xf966, 0xf967, 0xf968, 0xf969,
  0xf96a, 0xf96b, 0xf96c, 0xf96d, 0xf96e, 0xf96f, 0xf970, 0xf971,
  0xf972, 0xf973, 0xf974, 0xf975, 0xf976, 0xf977, 0xf978, 0xf979,
  0xf97a, 0xf97b, 0xf97c, 0xf97d, 0xf97e, 0xf980, 0xf981, 0xf982,
  0xf983, 0xf984, 0xf985, 0xf986, 0xf987, 0xf988, 0xf989, 0xf98a,
  0xf98b, 0xf98c, 0xf98d, 0xf98e, 0xf98f, 0xf990, 0xf991, 0xf992,
  0xf993, 0xf994, 0xf995, 0xf996, 0xf997, 0xf998, 0xf999, 0xf99a,
  0xf99b, 0xf99c, 0xf99d, 0xf99e, 0xf99f, 0xf9a0, 0xfa40, 0xfa41,
  0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49,
  0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51,
  0xfa52, 0xfa53, 0xfa54, 0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59,
  0xfa5a, 0xfa5b, 0xfa5c, 0xfa5d, 0xfa5e, 0xfa5f, 0xfa60, 0xfa61,
  0xfa62, 0xfa63, 0xfa64, 0xfa65, 0xfa66, 0xfa67, 0xfa68, 0xfa69,
  0xfa6a, 0xfa6b, 0xfa6c, 0xfa6d, 0xfa6e, 0xfa6f, 0xfa70, 0xfa71,
  0xfa72, 0xfa73, 0xfa74, 0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79,
  0xfa7a, 0xfa7b, 0xfa7c, 0xfa7d, 0xfa7e, 0xfa80, 0xfa81, 0xfa82,
  0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfa87, 0xfa88, 0xfa89, 0xfa8a,
  0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, 0xfa90, 0xfa91, 0xfa92,
  0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, 0xfa98, 0xfa99, 0xfa9a,
  0xfa9b, 0xfa9c, 0xfa9d, 0xfa9e, 0xfa9f, 0xfaa0, 0xfb40, 0xfb41,
  0xfb42, 0xfb43, 0xfb44, 0xfb45, 0xfb46, 0xfb47, 0xfb48, 0xfb49,
  0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51,
  0xfb52, 0xfb53, 0xfb54, 0xfb55, 0xfb56, 0xfb57, 0xfb58, 0xfb59,
  0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5e, 0xfb5f, 0xfb60, 0xfb61,
  0xfb62, 0xfb63, 0xfb64, 0xfb65, 0xfb66, 0xfb67, 0xfb68, 0xfb69,
  0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfb6f, 0xfb70, 0xfb71,
  0xfb72, 0xfb73, 0xfb74, 0xfb75, 0xfb76, 0xfb77, 0xfb78, 0xfb79,
  0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xfb7e, 0xfb80, 0xfb81, 0xfb82,
  0xfb83, 0xfb84, 0xfb85, 0xfb86, 0xfb87, 0xfb88, 0xfb89, 0xfb8a,
  0xfb8b, 0xfb8c, 0xfb8d, 0xfb8e, 0xfb8f, 0xfb90, 0xfb91, 0xfb92,
  0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, 0xfb98, 0xfb99, 0xfb9a,
  0xfb9b, 0xfb9c, 0xfb9d, 0xfb9e, 0xfb9f, 0xfba0, 0xfc40, 0xfc41,
  0xfc42, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc47, 0xfc48, 0xfc49,
  0xfc4a, 0xfc4b, 0xfc4c, 0xfc4d, 0xfc4e, 0xfc4f, 0xfc50, 0xfc51,
  0xfc52, 0xfc53, 0xfc54, 0xfc55, 0xfc56, 0xfc57, 0xfc58, 0xfc59,
  0xfc5a, 0xfc5b, 0xfc5c, 0xfc5d, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61,
  0xfc62, 0xfc63, 0xfc64, 0xfc65, 0xfc66, 0xfc67, 0xfc68, 0xfc69,
  0xfc6a, 0xfc6b, 0xfc6c, 0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71,
  0xfc72, 0xfc73, 0xfc74, 0xfc75, 0xfc76, 0xfc77, 0xfc78, 0xfc79,
  0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc80, 0xfc81, 0xfc82,
  0xfc83, 0xfc84, 0xfc85, 0xfc86, 0xfc87, 0xfc88, 0xfc89, 0xfc8a,
  0xfc8b, 0xfc8c, 0xfc8d, 0xfc8e, 0xfc8f, 0xfc90, 0xfc91, 0xfc92,
  0xfc93, 0xfc94, 0xfc95, 0xfc96, 0xfc97, 0xfc98, 0xfc99, 0xfc9a,
  0xfc9b, 0xfc9c, 0xfc9d, 0xfc9e, 0xfc9f, 0xfca0, 0xfd40, 0xfd41,
  0xfd42, 0xfd43, 0xfd44, 0xfd45, 0xfd46, 0xfd47, 0xfd48, 0xfd49,
  0xfd4a, 0xfd4b, 0xfd4c, 0xfd4d, 0xfd4e, 0xfd4f, 0xfd50, 0xfd51,
  0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57, 0xfd58, 0xfd59,
  0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d, 0xfd5e, 0xfd5f, 0xfd60, 0xfd61,
  0xfd62, 0xfd63, 0xfd64, 0xfd65, 0xfd66, 0xfd67, 0xfd68, 0xfd69,
  0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d, 0xfd6e, 0xfd6f, 0xfd70, 0xfd71,
  0xfd72, 0xfd73, 0xfd74, 0xfd75, 0xfd76, 0xfd77, 0xfd78, 0xfd79,
  0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0xfd7e, 0xfd80, 0xfd81, 0xfd82,
  0xfd83, 0xfd84, 0xfd85, 0xfd86, 0xfd87, 0xfd88, 0xfd89, 0xfd8a,
  0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, 0xfd90, 0xfd91, 0xfd92,
  0xfd93, 0xfd94, 0xfd95, 0xfd96, 0xfd97, 0xfd98, 0xfd99, 0xfd9a,
  0xfd9b, 0xfd9c, 0xfd9d, 0xfd9e, 0xfd9f, 0xfda0, 0xfe40, 0xfe41,
  0xfe42, 0xfe43, 0xfe44, 0xfe45, 0xfe46, 0xfe47, 0xfe48, 0xfe49,
  0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xa955, 0xa968,
  0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, 0xa96f, 0xa970,
  0xa971, 0xa972, 0xa973, 0xa974, 0xa975, 0xa976, 0xa977, 0xa978,
  0xa979, 0xa97a, 0xa97b, 0xa97c, 0xa97d, 0xa97e, 0xa980, 0xa981,
  0xa982, 0xa983, 0xa984, 0xa985, 0xa986, 0xa987, 0xa988, 0xa956,
  0xa957,
};

typedef struct {
  unsigned short indx; /* index into big table */
  unsigned short used; /* bitmask of used entries */
} Summary16;

static const Summary16 gbkext_inv_uni2indx_page02[14] = {
  /* 0x0200 */
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
  {    0, 0x0c00 }, {    2, 0x0200 },
};
static const Summary16 gbkext_inv_uni2indx_page20[44] = {
  /* 0x2000 */
  {    3, 0x0000 }, {    3, 0x0029 }, {    6, 0x0020 }, {    7, 0x0020 },
  {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 },
  {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 },
  {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 }, {    8, 0x0000 },
  /* 0x2100 */
  {    8, 0x0220 }, {   10, 0x0000 }, {   10, 0x0002 }, {   11, 0x0000 },
  {   11, 0x0000 }, {   11, 0x0000 }, {   11, 0x0000 }, {   11, 0x0000 },
  {   11, 0x0000 }, {   11, 0x03c0 }, {   15, 0x0000 }, {   15, 0x0000 },
  {   15, 0x0000 }, {   15, 0x0000 }, {   15, 0x0000 }, {   15, 0x0000 },
  /* 0x2200 */
  {   15, 0x0000 }, {   15, 0x8020 }, {   17, 0x0008 }, {   18, 0x0000 },
  {   18, 0x0000 }, {   18, 0x0004 }, {   19, 0x00c0 }, {   21, 0x0000 },
  {   21, 0x0000 }, {   21, 0x0020 }, {   22, 0x0000 }, {   22, 0x8000 },
};
static const Summary16 gbkext_inv_uni2indx_page25[17] = {
  /* 0x2500 */
  {   23, 0x0000 }, {   23, 0x0000 }, {   23, 0x0000 }, {   23, 0x0000 },
  {   23, 0x0000 }, {   23, 0xffff }, {   39, 0xffff }, {   55, 0x000f },
  {   59, 0xfffe }, {   74, 0x0038 }, {   77, 0x0000 }, {   77, 0x3000 },
  {   79, 0x0000 }, {   79, 0x0000 }, {   79, 0x003c }, {   83, 0x0000 },
  /* 0x2600 */
  {   83, 0x0200 },
};
static const Summary16 gbkext_inv_uni2indx_page30[16] = {
  /* 0x3000 */
  {   84, 0x00c0 }, {   86, 0x6004 }, {   89, 0x03fe }, {   98, 0x0000 },
  {   98, 0x0000 }, {   98, 0x0000 }, {   98, 0x0000 }, {   98, 0x0000 },
  {   98, 0x0000 }, {   98, 0x7800 }, {  102, 0x0000 }, {  102, 0x0000 },
  {  102, 0x0000 }, {  102, 0x0000 }, {  102, 0x0000 }, {  102, 0x7000 },
};
static const Summary16 gbkext_inv_uni2indx_page32[30] = {
  /* 0x3200 */
  {  105, 0x0000 }, {  105, 0x0000 }, {  105, 0x0000 }, {  105, 0x0002 },
  {  106, 0x0000 }, {  106, 0x0000 }, {  106, 0x0000 }, {  106, 0x0000 },
  {  106, 0x0000 }, {  106, 0x0000 }, {  106, 0x0008 }, {  107, 0x0000 },
  {  107, 0x0000 }, {  107, 0x0000 }, {  107, 0x0000 }, {  107, 0x0000 },
  /* 0x3300 */
  {  107, 0x0000 }, {  107, 0x0000 }, {  107, 0x0000 }, {  107, 0x0000 },
  {  107, 0x0000 }, {  107, 0x0000 }, {  107, 0x0000 }, {  107, 0x0000 },
  {  107, 0xc000 }, {  109, 0x7000 }, {  112, 0x0002 }, {  113, 0x0000 },
  {  113, 0x4010 }, {  115, 0x0026 },
};
static const Summary16 gbkext_inv_uni2indx_page4e[1307] = {
  /* 0x4e00 */
  {  118, 0x8074 }, {  123, 0x8084 }, {  126, 0xc24b }, {  133, 0x10aa },
  {  138, 0x0457 }, {  144, 0x0ca2 }, {  149, 0xfdbc }, {  161, 0xbff4 },
  {  173, 0x04bf }, {  181, 0x72c1 }, {  188, 0x8408 }, {  191, 0x73d3 },
  {  201, 0x9100 }, {  204, 0x1c05 }, {  209, 0xe2c5 }, {  217, 0x5712 },
  /* 0x4f00 */
  {  224, 0x19fd }, {  234, 0x307c }, {  241, 0x730a }, {  248, 0xcaaa },
  {  256, 0x1fb7 }, {  267, 0x0054 }, {  270, 0x6d46 }, {  278, 0x27a6 },
  {  286, 0x54e7 }, {  295, 0xd76d }, {  306, 0x2816 }, {  311, 0x7fdf },
  {  325, 0x3bc7 }, {  335, 0x0a7c }, {  342, 0x18b5 }, {  349, 0xbaf5 },
  /* 0x5000 */
  {  360, 0x4fff }, {  373, 0x68eb }, {  382, 0x889d }, {  389, 0xabff },
  {  402, 0x2e77 }, {  412, 0xebdf }, {  425, 0xefdf }, {  439, 0x373f },
  {  450, 0xdede }, {  462, 0xffff }, {  478, 0xec57 }, {  488, 0xf3fb },
  {  501, 0x7fff }, {  516, 0xfbbf }, {  530, 0x8f3f }, {  541, 0xf7d7 },
  /* 0x5100 */
  {  554, 0xf73f }, {  567, 0xfffb }, {  582, 0xfffd }, {  597, 0x7fff },
  {  612, 0xd484 }, {  618, 0xeb8d }, {  628, 0x86db }, {  637, 0xc404 },
  {  641, 0xccd8 }, {  649, 0xe51b }, {  658, 0x67ca }, {  667, 0xc710 },
  {  673, 0x652e }, {  681, 0xd7fd }, {  694, 0x57ec }, {  704, 0x4096 },
  /* 0x5200 */
  {  709, 0x9a30 }, {  715, 0xd039 }, {  722, 0x94ee }, {  731, 0x5036 },
  {  737, 0xcbf0 }, {  746, 0xafac }, {  756, 0x795d }, {  766, 0x5ffb },
  {  779, 0xfef9 }, {  792, 0x17f6 }, {  802, 0xc0f0 }, {  808, 0x3ff1 },
  {  819, 0xf577 }, {  831, 0x7eba }, {  842, 0xffef }, {  857, 0x39fe },
  /* 0x5300 */
  {  868, 0x5e9e }, {  878, 0xd91e }, {  887, 0xbbb4 }, {  897, 0x31ff },
  {  908, 0x3855 }, {  915, 0x2b11 }, {  921, 0x3520 }, {  926, 0x7a44 },
  {  933, 0xc58b }, {  941, 0x5adf }, {  952, 0xbc93 }, {  961, 0x77bf },
  {  974, 0xc0f9 }, {  982, 0x742d }, {  990, 0x0086 }, {  993, 0xc410 },
  /* 0x5400 */
  {  997, 0x08a5 }, { 1002, 0x1710 }, { 1007, 0x0434 }, { 1011, 0xa4c9 },
  { 1018, 0xf2b6 }, { 1028, 0xe402 }, { 1033, 0xfeab }, { 1045, 0xc611 },
  { 1051, 0x27aa }, { 1059, 0xd18a }, { 1066, 0x4027 }, { 1071, 0x56e5 },
  { 1080, 0x0c28 }, { 1084, 0x0940 }, { 1087, 0x981f }, { 1095, 0x4bf3 },
  /* 0x5500 */
  { 1105, 0x7d3d }, { 1116, 0xf7ec }, { 1128, 0x2b62 }, { 1135, 0x2f74 },
  { 1144, 0xf9a5 }, { 1154, 0xef9e }, { 1166, 0x8b0d }, { 1173, 0xa61f },
  { 1182, 0x7060 }, { 1187, 0x4ced }, { 1196, 0xff7f }, { 1211, 0x9555 },
  { 1219, 0xcdcf }, { 1230, 0x4fa1 }, { 1238, 0x6285 }, { 1244, 0x9f53 },
  /* 0x5600 */
  { 1254, 0x2cfc }, { 1263, 0x36ff }, { 1275, 0xcf67 }, { 1286, 0x75a9 },
  { 1295, 0x8fff }, { 1308, 0xec6f }, { 1319, 0xe0eb }, { 1328, 0xe7bd },
  { 1340, 0x3f9f }, { 1352, 0xfff7 }, { 1367, 0x7ff7 }, { 1381, 0xef7f },
  { 1395, 0xfbff }, { 1410, 0x136f }, { 1419, 0xd7e8 }, { 1429, 0x19cc },
  /* 0x5700 */
  { 1436, 0xf8a7 }, { 1446, 0x6fff }, { 1460, 0x08f7 }, { 1468, 0xb1f6 },
  { 1478, 0x0b7a }, { 1486, 0x037c }, { 1493, 0x50ac }, { 1499, 0xe737 },
  { 1510, 0xe783 }, { 1519, 0xf7f3 }, { 1532, 0x9520 }, { 1537, 0xfeeb },
  { 1550, 0x37f3 }, { 1561, 0x58cb }, { 1569, 0x5fee }, { 1581, 0xd8ef },
  /* 0x5800 */
  { 1592, 0xd73a }, { 1602, 0xbddd }, { 1614, 0xfbec }, { 1626, 0xffde },
  { 1640, 0xcfef }, { 1653, 0xbeed }, { 1665, 0xe7df }, { 1678, 0xbfff },
  { 1693, 0xfdd4 }, { 1704, 0x39f3 }, { 1714, 0xfcff }, { 1728, 0xefff },
  { 1743, 0xffdd }, { 1757, 0xffdd }, { 1771, 0xa7ef }, { 1783, 0xfdb6 },
  /* 0x5900 */
  { 1795, 0x5f6b }, { 1806, 0x698f }, { 1815, 0x114f }, { 1822, 0xe86d },
  { 1831, 0x3469 }, { 1838, 0xfa0d }, { 1847, 0xffda }, { 1860, 0xdca7 },
  { 1870, 0xda21 }, { 1877, 0xbd33 }, { 1887, 0x30c7 }, { 1894, 0xb5fb },
  { 1906, 0xf3bf }, { 1919, 0xca60 }, { 1925, 0xeed7 }, { 1937, 0x75ff },
  /* 0x5a00 */
  { 1950, 0xec05 }, { 1957, 0x6ef5 }, { 1968, 0xfdd6 }, { 1980, 0xefa9 },
  { 1991, 0xf9be }, { 2003, 0xfbdf }, { 2017, 0xfb7b }, { 2030, 0x7b0f },
  { 2040, 0xffff }, { 2056, 0xf3fb }, { 2069, 0xfbff }, { 2084, 0xbed3 },
  { 2095, 0xedf9 }, { 2107, 0xeeab }, { 2118, 0xf5b4 }, { 2128, 0xfffd },
  /* 0x5b00 */
  { 2143, 0xfdff }, { 2158, 0xff3f }, { 2172, 0xffff }, { 2188, 0xff6b },
  { 2201, 0xfffe }, { 2216, 0x4044 }, { 2219, 0xe983 }, { 2227, 0xdbd4 },
  { 2237, 0x6444 }, { 2242, 0x8057 }, { 2248, 0xf380 }, { 2255, 0x1c86 },
  { 2261, 0xef0b }, { 2271, 0x1ff2 }, { 2281, 0xbecd }, { 2292, 0x60fe },
  /* 0x5c00 */
  { 2301, 0x79ad }, { 2311, 0xca8d }, { 2319, 0xef4b }, { 2330, 0x00ed },
  { 2336, 0x30d8 }, { 2342, 0xbddc }, { 2353, 0x3f94 }, { 2362, 0x79fd },
  { 2374, 0xcef9 }, { 2385, 0xe02c }, { 2391, 0xc5f3 }, { 2401, 0x5e55 },
  { 2410, 0xf7ed }, { 2423, 0xfdfb }, { 2437, 0xda8d }, { 2446, 0xf7fe },
  /* 0x5d00 */
  { 2460, 0xbf33 }, { 2471, 0xb7af }, { 2483, 0x9d2f }, { 2493, 0x9fef },
  { 2506, 0xe37f }, { 2518, 0xd6ff }, { 2531, 0x65ff }, { 2543, 0xffef },
  { 2558, 0xfffb }, { 2573, 0xddff }, { 2587, 0xffff }, { 2603, 0xff7f },
  { 2618, 0xdfdf }, { 2632, 0x97ff }, { 2645, 0x3419 }, { 2651, 0x9f61 },
  /* 0x5e00 */
  { 2660, 0x6e91 }, { 2668, 0xc08c }, { 2673, 0x9f3f }, { 2685, 0xc67d },
  { 2695, 0xefcb }, { 2707, 0xb7cf }, { 2719, 0xfff9 }, { 2733, 0x42a3 },
  { 2739, 0x732e }, { 2748, 0x2904 }, { 2752, 0xdf1e }, { 2763, 0xbc17 },
  { 2772, 0xf9ff }, { 2786, 0xf7b1 }, { 2797, 0xfaff }, { 2811, 0x3b2f },
  /* 0x5f00 */
  { 2821, 0x72e0 }, { 2828, 0x7655 }, { 2837, 0x591e }, { 2845, 0xe9fd },
  { 2857, 0xfffe }, { 2872, 0xde12 }, { 2880, 0xc9a9 }, { 2888, 0xe574 },
  { 2897, 0xe048 }, { 2902, 0xec5a }, { 2911, 0x9afd }, { 2922, 0xcf5f },
  { 2934, 0x4d87 }, { 2942, 0xdc38 }, { 2950, 0x936c }, { 2958, 0x16dd },
  /* 0x6000 */
  { 2967, 0x1b80 }, { 2972, 0xc58b }, { 2980, 0x701c }, { 2986, 0x67df },
  { 2998, 0xd7f1 }, { 3009, 0xd9da }, { 3019, 0x4063 }, { 3024, 0x40b6 },
  { 3030, 0xcde7 }, { 3041, 0x53ab }, { 3050, 0x46b6 }, { 3058, 0xe6e9 },
  { 3068, 0xf39f }, { 3080, 0x4add }, { 3089, 0x043e }, { 3095, 0xf9a6 },
  /* 0x6100 */
  { 3105, 0x1cbc }, { 3113, 0x7bdf }, { 3126, 0xf726 }, { 3136, 0x7fff },
  { 3151, 0xaaff }, { 3163, 0xdfdd }, { 3176, 0xfe7b }, { 3189, 0xff5e },
  { 3202, 0xb7ff }, { 3216, 0xdfef }, { 3230, 0xec7f }, { 3242, 0xbf7f },
  { 3256, 0xf2fb }, { 3268, 0xffe9 }, { 3281, 0xffbf }, { 3296, 0x7fdf },
  /* 0x6200 */
  { 3310, 0x02bf }, { 3318, 0x7218 }, { 3324, 0xabc9 }, { 3333, 0x1f67 },
  { 3343, 0x8474 }, { 3349, 0xf6e1 }, { 3359, 0x0137 }, { 3365, 0x2db6 },
  { 3374, 0xf9ee }, { 3386, 0x7211 }, { 3392, 0xe6c8 }, { 3400, 0x45dd },
  { 3409, 0x880b }, { 3414, 0x6022 }, { 3418, 0x0c13 }, { 3423, 0x0f25 },
  /* 0x6300 */
  { 3430, 0xbc79 }, { 3440, 0x13bd }, { 3449, 0x72c0 }, { 3455, 0xd9fb },
  { 3467, 0x0593 }, { 3473, 0x3fde }, { 3485, 0x9d71 }, { 3494, 0xf33d },
  { 3505, 0x287a }, { 3512, 0xfeba }, { 3524, 0x8852 }, { 3529, 0xaa66 },
  { 3537, 0x1daf }, { 3547, 0xbfba }, { 3559, 0xd9f4 }, { 3569, 0x5eab },
  /* 0x6400 */
  { 3579, 0x67d8 }, { 3588, 0xa7e6 }, { 3598, 0xcbbc }, { 3608, 0x5bef },
  { 3620, 0xfa0d }, { 3629, 0xbeeb }, { 3641, 0xdd7f }, { 3654, 0xf8ff },
  { 3667, 0xff4b }, { 3679, 0xbd99 }, { 3689, 0x8def }, { 3700, 0xea5e },
  { 3710, 0x9fda }, { 3721, 0xbe7a }, { 3732, 0xffab }, { 3745, 0xffff },
  /* 0x6500 */
  { 3761, 0xfdfe }, { 3775, 0xfefb }, { 3789, 0x37df }, { 3801, 0x348f },
  { 3809, 0x6cdf }, { 3820, 0x959d }, { 3829, 0xe7b3 }, { 3840, 0xff6a },
  { 3852, 0xe77f }, { 3865, 0x6574 }, { 3873, 0x554d }, { 3881, 0xcdfe },
  { 3893, 0x2785 }, { 3900, 0xff3b }, { 3913, 0x0c1a }, { 3918, 0xfb3c },
  /* 0x6600 */
  { 3929, 0x2bb2 }, { 3937, 0x5dc7 }, { 3947, 0x5e5e }, { 3957, 0xaf8d },
  { 3967, 0x67f5 }, { 3978, 0x7b03 }, { 3986, 0x3ead }, { 3996, 0xbb2e },
  { 4006, 0xef6b }, { 4018, 0xdf3d }, { 4030, 0xbe7f }, { 4043, 0xbdef },
  { 4056, 0xffff }, { 4072, 0xc5ff }, { 4084, 0xfdbf }, { 4098, 0x2d62 },
  /* 0x6700 */
  { 4105, 0xd0fe }, { 4115, 0x574e }, { 4124, 0x42bf }, { 4133, 0xdbcd },
  { 4144, 0x2cb2 }, { 4151, 0x2fb4 }, { 4160, 0x58dc }, { 4168, 0x2f52 },
  { 4176, 0xf56d }, { 4187, 0x8a5e }, { 4195, 0x5253 }, { 4202, 0xfe16 },
  { 4212, 0x7fe5 }, { 4224, 0x88e0 }, { 4229, 0x6dda }, { 4239, 0x5fe4 },
  /* 0x6800 */
  { 4249, 0x205e }, { 4255, 0xdf35 }, { 4266, 0xf9fd }, { 4279, 0x8c73 },
  { 4287, 0xa880 }, { 4291, 0xffc4 }, { 4302, 0xf400 }, { 4307, 0xff2f },
  { 4320, 0x7f95 }, { 4331, 0xff77 }, { 4345, 0x5e3b }, { 4355, 0xffd6 },
  { 4368, 0xd5fa }, { 4379, 0xfadb }, { 4391, 0xbff6 }, { 4404, 0xe9dc },
  /* 0x6900 */
  { 4414, 0x97dd }, { 4425, 0x7ffa }, { 4438, 0xdfee }, { 4451, 0x5dee },
  { 4462, 0xfffb }, { 4477, 0x9b6f }, { 4488, 0xb7b6 }, { 4499, 0xec7d },
  { 4510, 0xdc2a }, { 4518, 0xe6cf }, { 4529, 0xd67f }, { 4541, 0xf76d },
  { 4553, 0xabfd }, { 4565, 0x77ee }, { 4577, 0xdffe }, { 4591, 0x5ffb },
  /* 0x6a00 */
  { 4604, 0xfbff }, { 4619, 0x7e7f }, { 4632, 0x7afd }, { 4644, 0x9fdd },
  { 4656, 0xff6f }, { 4670, 0xf4fe }, { 4682, 0xffdd }, { 4696, 0xedfd },
  { 4709, 0xbfee }, { 4722, 0xff7c }, { 4735, 0xe5fe }, { 4747, 0xffff },
  { 4763, 0xffff }, { 4779, 0xffff }, { 4795, 0xffff }, { 4811, 0xffff },
  /* 0x6b00 */
  { 4827, 0xffff }, { 4843, 0xffff }, { 4859, 0xff60 }, { 4869, 0xb97b },
  { 4880, 0xed37 }, { 4891, 0xfdff }, { 4906, 0xfb03 }, { 4915, 0xe5ff },
  { 4928, 0xd121 }, { 4934, 0xf3b3 }, { 4945, 0xfbfd }, { 4959, 0x7f47 },
  { 4970, 0x57d9 }, { 4980, 0xf503 }, { 4988, 0x73fd }, { 5000, 0xddd7 },
  /* 0x6c00 */
  { 5012, 0x5f1f }, { 5023, 0x7084 }, { 5028, 0x3829 }, { 5034, 0xdeca },
  { 5044, 0xf938 }, { 5053, 0x074e }, { 5060, 0xf8ec }, { 5070, 0x9daa },
  { 5079, 0x6c91 }, { 5086, 0x75e6 }, { 5096, 0x9105 }, { 5101, 0x04f1 },
  { 5107, 0xe9cf }, { 5118, 0xb706 }, { 5126, 0x32d0 }, { 5132, 0x8214 },
  /* 0x6d00 */
  { 5136, 0xa76d }, { 5146, 0xb17b }, { 5156, 0xb35f }, { 5167, 0x85d1 },
  { 5174, 0x1215 }, { 5179, 0xa9e1 }, { 5187, 0x39b6 }, { 5196, 0xee6f },
  { 5208, 0xacdb }, { 5218, 0x17c5 }, { 5226, 0x3024 }, { 5230, 0x7edb },
  { 5242, 0xe70e }, { 5251, 0x9cbd }, { 5261, 0xa7ac }, { 5270, 0xe575 },
  /* 0x6e00 */
  { 5280, 0x8bdf }, { 5291, 0xdb2c }, { 5300, 0x55c4 }, { 5307, 0xfaeb },
  { 5319, 0x9fe7 }, { 5331, 0x76a7 }, { 5341, 0xb7ff }, { 5355, 0x3fff },
  { 5369, 0x7d97 }, { 5380, 0x6efe }, { 5392, 0x7b5b }, { 5403, 0xd329 },
  { 5411, 0x7779 }, { 5422, 0x3b45 }, { 5430, 0xfc88 }, { 5438, 0xfdef },
  /* 0x6f00 */
  { 5452, 0x7dbb }, { 5464, 0xffc7 }, { 5477, 0x51ee }, { 5486, 0xbfb5 },
  { 5498, 0xd73f }, { 5510, 0xaeff }, { 5523, 0x9fbb }, { 5535, 0xeaeb },
  { 5546, 0x8cef }, { 5556, 0xefff }, { 5571, 0xff7d }, { 5585, 0xfdb7 },
  { 5598, 0xfdfa }, { 5611, 0xbff9 }, { 5624, 0x3ffc }, { 5636, 0xffff },
  /* 0x7000 */
  { 5652, 0xffff }, { 5668, 0xf3fd }, { 5681, 0xfff7 }, { 5696, 0xfddf },
  { 5710, 0x6fff }, { 5724, 0xbfff }, { 5739, 0x47ff }, { 5751, 0x2e9e },
  { 5760, 0xb9de }, { 5771, 0xcd8b }, { 5780, 0x07ff }, { 5791, 0xc475 },
  { 5799, 0xfaf0 }, { 5809, 0x74ff }, { 5821, 0x442f }, { 5828, 0xdd7f },
  /* 0x7100 */
  { 5841, 0xf9ff }, { 5855, 0xf896 }, { 5864, 0x7fbf }, { 5878, 0xffbc },
  { 5891, 0xabdf }, { 5903, 0xafff }, { 5917, 0xbe2f }, { 5928, 0xdaf3 },
  { 5939, 0x7bef }, { 5952, 0x7cef }, { 5964, 0xeefe }, { 5977, 0xfdd7 },
  { 5990, 0xbff7 }, { 6004, 0xffcf }, { 6018, 0xbf5e }, { 6030, 0xfdff },
  /* 0x7200 */
  { 6045, 0xffbf }, { 6060, 0xdfff }, { 6075, 0xeaff }, { 6088, 0x541c },
  { 6094, 0xce7f }, { 6106, 0x55bb }, { 6116, 0x3d39 }, { 6125, 0x39db },
  { 6135, 0x53ec }, { 6144, 0x7ffb }, { 6158, 0x4fff }, { 6171, 0xfc2e },
  { 6181, 0x9ee1 }, { 6190, 0xbd7a }, { 6201, 0x0cfc }, { 6209, 0xe260 },
  /* 0x7300 */
  { 6215, 0xbbf5 }, { 6227, 0x8717 }, { 6235, 0xa1d9 }, { 6243, 0x3c6d },
  { 6252, 0xdfff }, { 6267, 0xff7a }, { 6280, 0x4ffe }, { 6292, 0xbfff },
  { 6307, 0xb56f }, { 6318, 0x77bd }, { 6330, 0x35fb }, { 6341, 0xf372 },
  { 6351, 0x58fa }, { 6360, 0xbdfc }, { 6372, 0xdd5e }, { 6383, 0xfffb },
  /* 0x7400 */
  { 6398, 0x7997 }, { 6408, 0xf3fe }, { 6421, 0xaa9b }, { 6430, 0xef86 },
  { 6440, 0xfffd }, { 6455, 0x215f }, { 6463, 0xdfff }, { 6478, 0xbf3e },
  { 6490, 0xb774 }, { 6500, 0xaffe }, { 6513, 0xfc7f }, { 6526, 0xfbff },
  { 6541, 0xffff }, { 6557, 0xaffb }, { 6570, 0x3fa2 }, { 6579, 0x7f2f },
  /* 0x7500 */
  { 6591, 0x5fef }, { 6604, 0x68f5 }, { 6613, 0x44df }, { 6622, 0xb250 },
  { 6628, 0x26de }, { 6637, 0xe1ef }, { 6648, 0xfb9f }, { 6661, 0x7ceb },
  { 6672, 0x77b7 }, { 6684, 0x5929 }, { 6691, 0x27c4 }, { 6698, 0x8cc0 },
  { 6703, 0xd843 }, { 6710, 0xb68b }, { 6719, 0xf223 }, { 6727, 0x6dec },
  /* 0x7600 */
  { 6737, 0xebd4 }, { 6747, 0x745e }, { 6756, 0xd18a }, { 6763, 0x2ec6 },
  { 6771, 0xcff6 }, { 6783, 0xafaf }, { 6795, 0x77f7 }, { 6808, 0x96ff },
  { 6820, 0xb62b }, { 6829, 0xfdb5 }, { 6841, 0xbfef }, { 6855, 0x7fe9 },
  { 6867, 0x1a9b }, { 6875, 0x7628 }, { 6882, 0x3fdf }, { 6895, 0xace9 },
  /* 0x7700 */
  { 6904, 0xd46d }, { 6913, 0x79ff }, { 6926, 0x5cba }, { 6935, 0xea1f },
  { 6945, 0xff74 }, { 6957, 0xf3fc }, { 6969, 0xe691 }, { 6977, 0x1dff },
  { 6989, 0x8fce }, { 6999, 0x7ff9 }, { 7012, 0xe95a }, { 7021, 0x57d6 },
  { 7031, 0xdfff }, { 7046, 0xe77f }, { 7059, 0x8553 }, { 7066, 0x1eb7 },
  /* 0x7800 */
  { 7076, 0xcdf8 }, { 7086, 0x4a29 }, { 7092, 0xcd17 }, { 7101, 0xa06e },
  { 7108, 0xaf5e }, { 7119, 0xdf1a }, { 7129, 0x83ff }, { 7140, 0xef7f },
  { 7154, 0x8d7f }, { 7165, 0x6275 }, { 7173, 0xff55 }, { 7185, 0xbde0 },
  { 7194, 0xf1dd }, { 7205, 0xfdce }, { 7217, 0xeeff }, { 7231, 0xfb6b },
  /* 0x7900 */
  { 7243, 0xffdd }, { 7257, 0xbff7 }, { 7271, 0xffef }, { 7286, 0xa3ef },
  { 7297, 0xfcbc }, { 7308, 0x0337 }, { 7315, 0x5e5a }, { 7324, 0xfa7f },
  { 7337, 0x7bcc }, { 7347, 0xfbff }, { 7362, 0xff7f }, { 7377, 0x91f7 },
  { 7387, 0xd5b4 }, { 7396, 0x7ed9 }, { 7407, 0x5527 }, { 7415, 0xd6fe },
  /* 0x7a00 */
  { 7427, 0x97b2 }, { 7436, 0xbb6f }, { 7448, 0xfff6 }, { 7462, 0x4577 },
  { 7471, 0xffbf }, { 7486, 0xff7d }, { 7500, 0xffff }, { 7516, 0x782e },
  { 7524, 0xdea4 }, { 7533, 0x4e19 }, { 7540, 0xce9e }, { 7550, 0x7ff7 },
  { 7564, 0xf7ff }, { 7579, 0x3dbf }, { 7591, 0x5f96 }, { 7601, 0x59ff },
  /* 0x7b00 */
  { 7613, 0x72a7 }, { 7622, 0xb5cd }, { 7632, 0xa28e }, { 7639, 0xaaf5 },
  { 7649, 0x655f }, { 7659, 0xd2a8 }, { 7666, 0xbffa }, { 7679, 0xb559 },
  { 7688, 0xdfde }, { 7701, 0xcf4e }, { 7711, 0xc039 }, { 7717, 0xfeed },
  { 7730, 0xef3d }, { 7742, 0xd9f5 }, { 7753, 0xbb9d }, { 7764, 0xaf7d },
  /* 0x7c00 */
  { 7776, 0x677f }, { 7788, 0x7fbf }, { 7802, 0xfb3f }, { 7815, 0x7eff },
  { 7829, 0xdffc }, { 7842, 0xffff }, { 7858, 0xffff }, { 7874, 0xc7e7 },
  { 7885, 0xfdff }, { 7900, 0x0e59 }, { 7907, 0xbbcb }, { 7918, 0x8df1 },
  { 7927, 0xca5d }, { 7936, 0x6d1f }, { 7946, 0x7efe }, { 7959, 0xf6ff },
  /* 0x7d00 */
  { 7973, 0xfbff }, { 7988, 0xffff }, { 8004, 0x777a }, { 8015, 0xffff },
  { 8031, 0xffff }, { 8047, 0xffff }, { 8063, 0xbfff }, { 8078, 0xff7f },
  { 8093, 0xffff }, { 8109, 0xffff }, { 8125, 0xbfbf }, { 8139, 0xffff },
  { 8155, 0xffff }, { 8171, 0xffff }, { 8187, 0xffff }, { 8203, 0xffff },
  /* 0x7e00 */
  { 8219, 0xffff }, { 8235, 0xffff }, { 8251, 0xffff }, { 8267, 0xf7ff },
  { 8282, 0xff7d }, { 8296, 0xffff }, { 8312, 0xffff }, { 8328, 0xffff },
  { 8344, 0xfffb }, { 8359, 0x77ff }, { 8373, 0x4000 }, { 8374, 0x1810 },
  { 8377, 0x0000 }, { 8377, 0x0040 }, { 8378, 0x1010 }, { 8380, 0x0200 },
  /* 0x7f00 */
  { 8381, 0x0400 }, { 8382, 0x4001 }, { 8384, 0x0000 }, { 8384, 0xfa80 },
  { 8391, 0xffcb }, { 8404, 0x7a4c }, { 8412, 0xb8f9 }, { 8422, 0xbde9 },
  { 8433, 0xabfd }, { 8445, 0x1bef }, { 8456, 0x7f6d }, { 8468, 0x4cfa },
  { 8477, 0xabdd }, { 8488, 0x7ecf }, { 8500, 0xbd9c }, { 8510, 0xe7f4 },
  /* 0x8000 */
  { 8521, 0xc784 }, { 8528, 0xec0a }, { 8535, 0xf81a }, { 8543, 0x5615 },
  { 8550, 0xc3b3 }, { 8559, 0xfaeb }, { 8571, 0xf9ff }, { 8585, 0x7ffd },
  { 8599, 0xe526 }, { 8607, 0x42b7 }, { 8615, 0x11c8 }, { 8620, 0x0b69 },
  { 8627, 0x8fa0 }, { 8634, 0x813f }, { 8642, 0x404d }, { 8647, 0xcaa0 },
  /* 0x8100 */
  { 8653, 0x19bb }, { 8662, 0xbaa0 }, { 8669, 0x6fff }, { 8683, 0xbeb9 },
  { 8694, 0xe2bf }, { 8705, 0xf9c4 }, { 8714, 0x9d5e }, { 8724, 0x01ec },
  { 8730, 0x7afa }, { 8741, 0xc6fd }, { 8752, 0xfab7 }, { 8764, 0xf3f7 },
  { 8777, 0xebb0 }, { 8786, 0xffff }, { 8802, 0xcb77 }, { 8813, 0xa7e7 },
  /* 0x8200 */
  { 8824, 0xcf88 }, { 8832, 0x27ea }, { 8841, 0x42f1 }, { 8848, 0xb404 },
  { 8853, 0x756f }, { 8864, 0x7aff }, { 8877, 0x3eff }, { 8890, 0x19e2 },
  { 8897, 0x12eb }, { 8905, 0x4c79 }, { 8913, 0x008d }, { 8917, 0x9c64 },
  { 8924, 0x026d }, { 8930, 0x2641 }, { 8935, 0x7784 }, { 8943, 0xf56d },
  /* 0x8300 */
  { 8954, 0x2c01 }, { 8958, 0xe34d }, { 8967, 0x467f }, { 8977, 0xe885 },
  { 8984, 0x7d36 }, { 8994, 0x23e8 }, { 9001, 0x0004 }, { 9002, 0xc67f },
  { 9013, 0xbd9f }, { 9025, 0xa6f3 }, { 9035, 0xf0fe }, { 9046, 0xc820 },
  { 9050, 0x6b5c }, { 9059, 0x4eaf }, { 9069, 0xf9dc }, { 9080, 0xdcf8 },
  /* 0x8400 */
  { 9090, 0x07a5 }, { 9097, 0xcefd }, { 9109, 0xfe0f }, { 9120, 0xcefd },
  { 9132, 0xffbf }, { 9147, 0xe17d }, { 9157, 0xc5f5 }, { 9167, 0xfa95 },
  { 9177, 0xa47b }, { 9186, 0xed7f }, { 9199, 0x7ffd }, { 9213, 0x58eb },
  { 9222, 0xd9ed }, { 9233, 0x5fb4 }, { 9243, 0xef96 }, { 9254, 0x6ffe },
  /* 0x8500 */
  { 9267, 0xefff }, { 9282, 0x7b75 }, { 9293, 0xe7fd }, { 9306, 0xc07f },
  { 9315, 0xf8f7 }, { 9327, 0xbdbf }, { 9340, 0xfeef }, { 9354, 0xb1eb },
  { 9364, 0x7f4f }, { 9376, 0xe7ff }, { 9390, 0x3aef }, { 9401, 0xfd7e },
  { 9414, 0x7dfd }, { 9427, 0xefd6 }, { 9439, 0xfdef }, { 9453, 0x77ff },
  /* 0x8600 */
  { 9467, 0xffdf }, { 9482, 0xffbd }, { 9496, 0xfd7f }, { 9510, 0xeeff },
  { 9524, 0x1fff }, { 9537, 0xbbec }, { 9548, 0xa7fb }, { 9560, 0x01fd },
  { 9568, 0xc3f8 }, { 9577, 0xcfd7 }, { 9589, 0x6867 }, { 9597, 0xfb8c },
  { 9607, 0x312e }, { 9614, 0x34ec }, { 9622, 0x9def }, { 9634, 0xbce0 },
  /* 0x8700 */
  { 9642, 0xd872 }, { 9650, 0xaa53 }, { 9658, 0xbdd1 }, { 9668, 0x376d },
  { 9678, 0xac7f }, { 9689, 0xfd77 }, { 9702, 0xbfc6 }, { 9713, 0x87ae },
  { 9722, 0xd6d3 }, { 9732, 0x7f77 }, { 9745, 0x46ff }, { 9756, 0xdbd7 },
  { 9768, 0xf3be }, { 9780, 0xf7f1 }, { 9792, 0xbbde }, { 9804, 0xbdff },
  /* 0x8800 */
  { 9818, 0xfbf7 }, { 9832, 0xf797 }, { 9844, 0xfff9 }, { 9858, 0xedfb },
  { 9871, 0xcfce }, { 9882, 0xfd6f }, { 9895, 0xa4c1 }, { 9901, 0x1f7a },
  { 9911, 0xd6c9 }, { 9920, 0xefbb }, { 9933, 0xd7eb }, { 9945, 0xef7d },
  { 9958, 0xbd99 }, { 9968, 0x7ccb }, { 9978, 0xfec3 }, { 9989, 0xace4 },
  /* 0x8900 */
  { 9997, 0xfbfb }, { 10011, 0xf1f2 }, { 10021, 0xf3dd }, { 10033, 0xffae },
  { 10046, 0xffed }, { 10060, 0x3fff }, { 10074, 0xffbf }, { 10089, 0x77ff },
  { 10103, 0xffb5 }, { 10116, 0xffff }, { 10132, 0xffff }, { 10148, 0xffff },
  { 10164, 0x2009 }, { 10167, 0xabb8 }, { 10176, 0x7797 }, { 10187, 0xfff7 },
  /* 0x8a00 */
  { 10202, 0xff7e }, { 10216, 0xffff }, { 10232, 0xffff }, { 10248, 0xbfff },
  { 10263, 0xfeff }, { 10278, 0xffff }, { 10294, 0xffff }, { 10310, 0xfdff },
  { 10325, 0xf9ff }, { 10339, 0xfff7 }, { 10354, 0xffff }, { 10370, 0xffff },
  { 10386, 0xffff }, { 10402, 0xffff }, { 10418, 0xffff }, { 10434, 0xffff },
  /* 0x8b00 */
  { 10450, 0xff7f }, { 10465, 0xffff }, { 10481, 0xffbf }, { 10496, 0xffff },
  { 10512, 0xffff }, { 10528, 0xffff }, { 10544, 0xefbf }, { 10558, 0xffff },
  { 10574, 0xffff }, { 10590, 0xffff }, { 10606, 0x1000 }, { 10607, 0x0802 },
  { 10609, 0x0080 }, { 10610, 0x0001 }, { 10611, 0x0400 }, { 10612, 0x0000 },
  /* 0x8c00 */
  { 10612, 0x0200 }, { 10613, 0x4000 }, { 10614, 0x0000 }, { 10614, 0xff00 },
  { 10622, 0xed3d }, { 10633, 0xfbdf }, { 10647, 0xf3f9 }, { 10659, 0xf8f7 },
  { 10671, 0xe9db }, { 10682, 0xfeef }, { 10696, 0xffff }, { 10712, 0xffff },
  { 10728, 0xffff }, { 10744, 0xffff }, { 10760, 0xffff }, { 10776, 0xffff },
  /* 0x8d00 */
  { 10792, 0xffff }, { 10808, 0x1fff }, { 10821, 0x0001 }, { 10822, 0x0000 },
  { 10822, 0x0000 }, { 10822, 0x8086 }, { 10826, 0xd720 }, { 10833, 0xff06 },
  { 10843, 0xf3cd }, { 10854, 0x7fed }, { 10867, 0xfff7 }, { 10882, 0x2ac5 },
  { 10889, 0x27a7 }, { 10898, 0x133d }, { 10906, 0x62e7 }, { 10915, 0xd057 },
  /* 0x8e00 */
  { 10923, 0x69df }, { 10934, 0x1fef }, { 10946, 0x29f3 }, { 10955, 0xd9dd },
  { 10966, 0xf068 }, { 10973, 0xfdf9 }, { 10986, 0x4dbf }, { 10997, 0x6faa },
  { 11007, 0x7f5d }, { 11019, 0xafee }, { 11031, 0x67ff }, { 11044, 0xfbfb },
  { 11058, 0xbfff }, { 11073, 0xffff }, { 11089, 0xffff }, { 11105, 0xffff },
  /* 0x8f00 */
  { 11121, 0xffff }, { 11137, 0xffff }, { 11153, 0xffff }, { 11169, 0xffff },
  { 11185, 0xffff }, { 11201, 0xffff }, { 11217, 0x043f }, { 11224, 0x0000 },
  { 11224, 0x1001 }, { 11226, 0x2004 }, { 11228, 0xf4f7 }, { 11240, 0x9dbc },
  { 11250, 0xbe49 }, { 11259, 0x04c4 }, { 11263, 0x908b }, { 11269, 0xdc76 },
  /* 0x9000 */
  { 11279, 0x5180 }, { 11283, 0x1328 }, { 11288, 0x1fb8 }, { 11297, 0xa69f },
  { 11307, 0x5f69 }, { 11317, 0xf670 }, { 11326, 0x9ed3 }, { 11336, 0x5fcf },
  { 11348, 0xf6f2 }, { 11359, 0xd555 }, { 11368, 0x2bb1 }, { 11376, 0xb084 },
  { 11381, 0x3b4d }, { 11390, 0xc774 }, { 11399, 0x5639 }, { 11407, 0x9eef },
  /* 0x9100 */
  { 11419, 0xffeb }, { 11433, 0xbdff }, { 11447, 0x7ff3 }, { 11460, 0xfdfd },
  { 11474, 0x01b7 }, { 11481, 0x9b7a }, { 11491, 0x29c1 }, { 11497, 0x1c08 },
  { 11501, 0xc55f }, { 11511, 0xf3f8 }, { 11522, 0x1bf3 }, { 11532, 0xfbcf },
  { 11545, 0x097f }, { 11554, 0xeffd }, { 11568, 0xffff }, { 11584, 0xffff },
  /* 0x9200 */
  { 11600, 0xffff }, { 11616, 0xffff }, { 11632, 0xffff }, { 11648, 0xffff },
  { 11664, 0xffff }, { 11680, 0xffff }, { 11696, 0xffff }, { 11712, 0xffef },
  { 11727, 0xbfff }, { 11742, 0xffff }, { 11758, 0xbfff }, { 11773, 0xffff },
  { 11789, 0xfeff }, { 11804, 0xffff }, { 11820, 0xffff }, { 11836, 0xffff },
  /* 0x9300 */
  { 11852, 0xffff }, { 11868, 0xffff }, { 11884, 0xffff }, { 11900, 0xbfff },
  { 11915, 0xffff }, { 11931, 0xffff }, { 11947, 0xfbff }, { 11962, 0xffff },
  { 11978, 0x7fff }, { 11993, 0xffff }, { 12009, 0xffff }, { 12025, 0xffff },
  { 12041, 0xfbff }, { 12056, 0xffbf }, { 12071, 0xffff }, { 12087, 0xffff },
  /* 0x9400 */
  { 12103, 0xffff }, { 12119, 0xffff }, { 12135, 0xffff }, { 12151, 0xbfff },
  { 12166, 0xffff }, { 12182, 0xffff }, { 12198, 0xf7ff }, { 12213, 0xffff },
  { 12229, 0x001f }, { 12234, 0x0142 }, { 12237, 0x0000 }, { 12237, 0x0000 },
  { 12237, 0x8080 }, { 12239, 0x0418 }, { 12242, 0x0040 }, { 12243, 0x0800 },
  /* 0x9500 */
  { 12244, 0x0000 }, { 12244, 0x1000 }, { 12245, 0x0081 }, { 12247, 0x2008 },
  { 12249, 0x0908 }, { 12252, 0x0420 }, { 12254, 0x4001 }, { 12256, 0x7fb0 },
  { 12266, 0xffff }, { 12282, 0xffff }, { 12298, 0xffff }, { 12314, 0xffff },
  { 12330, 0xffff }, { 12346, 0xffff }, { 12362, 0x10ff }, { 12371, 0x8000 },
  /* 0x9600 */
  { 12372, 0x0080 }, { 12373, 0x4908 }, { 12377, 0xbbf9 }, { 12389, 0x4781 },
  { 12395, 0xc40a }, { 12400, 0x77ce }, { 12411, 0xe869 }, { 12419, 0xff0b },
  { 12430, 0x569f }, { 12440, 0xec6e }, { 12450, 0xff7f }, { 12465, 0x8db6 },
  { 12474, 0x0d0c }, { 12479, 0xffdb }, { 12493, 0x78fe }, { 12504, 0xbd37 },
  /* 0x9700 */
  { 12515, 0x1c2c }, { 12521, 0xafb7 }, { 12533, 0xdbff }, { 12547, 0xbcfa },
  { 12558, 0xffff }, { 12574, 0xb5b3 }, { 12584, 0xfdd8 }, { 12595, 0xefa7 },
  { 12607, 0xd7df }, { 12620, 0xfee9 }, { 12632, 0x57f6 }, { 12643, 0xffeb },
  { 12657, 0xffff }, { 12673, 0xffff }, { 12689, 0xc13f }, { 12698, 0xff97 },
  /* 0x9800 */
  { 12711, 0xffff }, { 12727, 0xffff }, { 12743, 0xffff }, { 12759, 0xffff },
  { 12775, 0xffff }, { 12791, 0xffff }, { 12807, 0xffff }, { 12823, 0x001f },
  { 12828, 0x4800 }, { 12830, 0x0224 }, { 12833, 0xff08 }, { 12842, 0xffff },
  { 12858, 0xbfff }, { 12873, 0x38d1 }, { 12880, 0xfe7f }, { 12894, 0xffff },
  /* 0x9900 */
  { 12910, 0xdfff }, { 12925, 0xfffe }, { 12940, 0xbfff }, { 12955, 0xffff },
  { 12971, 0xffff }, { 12987, 0xffcf }, { 13001, 0x0057 }, { 13006, 0x4b08 },
  { 13011, 0x520c }, { 13016, 0xfc00 }, { 13022, 0xfedf }, { 13036, 0xffff },
  { 13052, 0xffff }, { 13068, 0xffff }, { 13084, 0xffff }, { 13100, 0xffff },
  /* 0x9a00 */
  { 13116, 0xffff }, { 13132, 0xffff }, { 13148, 0xffff }, { 13164, 0xffff },
  { 13180, 0xffff }, { 13196, 0xffff }, { 13212, 0x0fff }, { 13224, 0x0004 },
  { 13225, 0x6208 }, { 13229, 0x0230 }, { 13232, 0xfe40 }, { 13240, 0xea3c },
  { 13249, 0xe7d8 }, { 13259, 0x7ef5 }, { 13271, 0x57bd }, { 13282, 0xf5ff },
  /* 0x9b00 */
  { 13296, 0x7ef7 }, { 13309, 0x7ff7 }, { 13323, 0x7ff7 }, { 13337, 0xe7fb },
  { 13350, 0x5c41 }, { 13356, 0xffed }, { 13370, 0xffff }, { 13386, 0xffff },
  { 13402, 0xffff }, { 13418, 0xffff }, { 13434, 0xffff }, { 13450, 0xffff },
  { 13466, 0xffff }, { 13482, 0xffff }, { 13498, 0xffff }, { 13514, 0xffff },
  /* 0x9c00 */
  { 13530, 0xffff }, { 13546, 0xffff }, { 13562, 0xffff }, { 13578, 0xffff },
  { 13594, 0xffff }, { 13610, 0xffff }, { 13626, 0xffff }, { 13642, 0x6fff },
  { 13656, 0x9619 }, { 13663, 0x23c8 }, { 13669, 0x9400 }, { 13672, 0xc200 },
  { 13675, 0x0307 }, { 13680, 0x0c06 }, { 13684, 0xfffb }, { 13699, 0xffff },
  /* 0x9d00 */
  { 13715, 0xffff }, { 13731, 0xffff }, { 13747, 0xffff }, { 13763, 0xffff },
  { 13779, 0xffff }, { 13795, 0xffff }, { 13811, 0xffff }, { 13827, 0xffff },
  { 13843, 0xffff }, { 13859, 0xffff }, { 13875, 0xffff }, { 13891, 0xffff },
  { 13907, 0xffff }, { 13923, 0xffff }, { 13939, 0xffff }, { 13955, 0xffff },
  /* 0x9e00 */
  { 13971, 0xffff }, { 13987, 0x7fff }, { 14002, 0x4090 }, { 14005, 0x1811 },
  { 14009, 0x2001 }, { 14011, 0xa25d }, { 14019, 0xc027 }, { 14025, 0x3ff4 },
  { 14036, 0xf67b }, { 14048, 0x5ff3 }, { 14060, 0xffbf }, { 14075, 0x96ef },
  { 14086, 0x1def }, { 14097, 0x46ed }, { 14106, 0x795a }, { 14115, 0xa5ff },
  /* 0x9f00 */
  { 14127, 0x97ff }, { 14140, 0xfd76 }, { 14152, 0x6ffa }, { 14164, 0x957f },
  { 14175, 0xffef }, { 14190, 0xfffc }, { 14204, 0xffff }, { 14220, 0x7fff },
  { 14235, 0xe006 }, { 14240, 0x71ff }, { 14252, 0x003e },
};
static const Summary16 gbkext_inv_uni2indx_pagef9[19] = {
  /* 0xf900 */
  { 14257, 0x0000 }, { 14257, 0x0000 }, { 14257, 0x1000 }, { 14258, 0x0000 },
  { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0200 },
  { 14259, 0x0000 }, { 14259, 0x0020 }, { 14260, 0x0000 }, { 14260, 0x0000 },
  { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0080 }, { 14261, 0x0002 },
  /* 0xfa00 */
  { 14262, 0xf000 }, { 14266, 0x811a }, { 14271, 0x039b },
};
static const Summary16 gbkext_inv_uni2indx_pagefe[31] = {
  /* 0xfe00 */
  { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0001 },
  { 14279, 0xfe00 }, { 14286, 0xfef7 }, { 14300, 0x0f7f }, { 14311, 0x0000 },
  { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 },
  { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 },
  /* 0xff00 */
  { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 },
  { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 },
  { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 },
  { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0014 },
};

static int gbkext_inv_wctomb(unsigned int* r, unsigned int wc) {
    const Summary16 *summary = NULL;
    if (wc >= 0x0200 && wc < 0x02e0) {
        summary = &gbkext_inv_uni2indx_page02[(wc>>4)-0x020];
    } else if (wc >= 0x2000 && wc < 0x22c0) {
        summary = &gbkext_inv_uni2indx_page20[(wc>>4)-0x200];
    } else if (wc >= 0x2500 && wc < 0x2610) {
        summary = &gbkext_inv_uni2indx_page25[(wc>>4)-0x250];
    } else if (wc >= 0x3000 && wc < 0x3100) {
        summary = &gbkext_inv_uni2indx_page30[(wc>>4)-0x300];
    } else if (wc >= 0x3200 && wc < 0x33e0) {
        summary = &gbkext_inv_uni2indx_page32[(wc>>4)-0x320];
    } else if (wc >= 0x4e00 && wc < 0x9fb0) {
        summary = &gbkext_inv_uni2indx_page4e[(wc>>4)-0x4e0];
    } else if (wc >= 0xf900 && wc < 0xfa30) {
        summary = &gbkext_inv_uni2indx_pagef9[(wc>>4)-0xf90];
    } else if (wc >= 0xfe00 && wc < 0xfff0) {
        summary = &gbkext_inv_uni2indx_pagefe[(wc>>4)-0xfe0];
    }
    if (summary) {
        unsigned short used = summary->used;
        unsigned int i = wc & 0x0f;
        if (used & ((unsigned short) 1 << i)) {
            /* Keep in 'used' only the bits 0..i-1. */
            used &= ((unsigned short) 1 << i) - 1;
            /* Add 'summary->indx' and the number of bits set in 'used'. */
            used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
            used = (used & 0x3333) + ((used & 0xcccc) >> 2);
            used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
            used = (used & 0x00ff) + (used >> 8);
            *r = gbkext_inv_2charset[summary->indx + used];
            return 2;
        }
    }
    return 0;
}

/*
 * GBK (libiconv-1.16/lib/gbk.h)
 */

static int gbk_wctomb(unsigned int* r, unsigned int wc) {
    int ret;

    /* ZINT: Note these mappings U+30FB and U+2015 different from GB 2312 */
    if (wc != 0x30fb && wc != 0x2015) {
        ret = gb2312_wctomb_zint(r, wc); /* In gb2312.c */
        if (ret) {
            return ret;
        }
    }
    ret = gbkext_inv_wctomb(r, wc);
    if (ret) {
        return ret;
    }
    if (wc >= 0x2170 && wc <= 0x2179) {
        *r = 0xa2a1 + (wc-0x2170);
        return 2;
    }
    ret = cp936ext_wctomb(r, wc);
    if (ret) {
        return ret;
    }
    /* ZINT: gb2312_wctomb_zint() is patched to map U+00B7 to 0xA1A4 and U+2014 to 0xA1AA */

    return 0;
}

/*
 * GB18030 two-byte extension (libiconv-1.16/lib/gb18030ext.h)
 */

static const unsigned short gb18030ext_page2e[80] = {
  0x0000, 0xfe50, 0x0000, 0x0000, 0xfe54, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/
  0xfe57, 0x0000, 0x0000, 0xfe58, 0xfe5d, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe5e, /*0x90-0x97*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x98-0x9f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe6b, /*0xa0-0xa7*/
  0x0000, 0x0000, 0xfe6e, 0x0000, 0x0000, 0x0000, 0xfe71, 0x0000, /*0xa8-0xaf*/
  0x0000, 0x0000, 0x0000, 0xfe73, 0x0000, 0x0000, 0xfe74, 0xfe75, /*0xb0-0xb7*/
  0x0000, 0x0000, 0x0000, 0xfe79, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc0-0xc7*/
  0x0000, 0x0000, 0xfe84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc8-0xcf*/
};
static const unsigned short gb18030ext_page2f[16] = {
  0xa98a, 0xa98b, 0xa98c, 0xa98d, 0xa98e, 0xa98f, 0xa990, 0xa991, /*0xf0-0xf7*/
  0xa992, 0xa993, 0xa994, 0xa995, 0x0000, 0x0000, 0x0000, 0x0000, /*0xf8-0xff*/
};
static const unsigned short gb18030ext_page34[56] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe56, /*0x40-0x47*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/
  0x0000, 0x0000, 0x0000, 0xfe55, 0x0000, 0x0000, 0x0000, 0x0000, /*0x70-0x77*/
};
static const unsigned short gb18030ext_page36[24] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe5c, 0x0000, /*0x08-0x0f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x10-0x17*/
  0x0000, 0x0000, 0xfe5b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/
};
static const unsigned short gb18030ext_page39[24] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe62, /*0xc8-0xcf*/
  0xfe65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd0-0xd7*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe63, /*0xd8-0xdf*/
};
static const unsigned short gb18030ext_page43[56] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0xfe78, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/
  0x0000, 0xfe77, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb0-0xb7*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc0-0xc7*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc8-0xcf*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd0-0xd7*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe7a, 0x0000, 0x0000, /*0xd8-0xdf*/
};
static const unsigned short gb18030ext_page46[32] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0xfe7d, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/
  0x0000, 0xfe7c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/
};
static const unsigned short gb18030ext_page47_1[16] = {
  0x0000, 0x0000, 0x0000, 0xfe80, 0x0000, 0x0000, 0x0000, 0x0000, /*0x20-0x27*/
  0x0000, 0xfe81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/
};
static const unsigned short gb18030ext_page47_2[24] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0xfe82, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe83, 0x0000, 0x0000, /*0x88-0x8f*/
};
static const unsigned short gb18030ext_page49[120] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe85, /*0x40-0x47*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x70-0x77*/
  0x0000, 0x0000, 0xfe86, 0x0000, 0x0000, 0xfe87, 0x0000, 0x0000, /*0x78-0x7f*/
  0x0000, 0x0000, 0xfe88, 0xfe89, 0x0000, 0xfe8a, 0xfe8b, 0x0000, /*0x80-0x87*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x90-0x97*/
  0x0000, 0x0000, 0x0000, 0xfe8d, 0x0000, 0x0000, 0x0000, 0xfe8c, /*0x98-0x9f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa0-0xa7*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe8f, 0xfe8e, /*0xb0-0xb7*/
};
static const unsigned short gb18030ext_page4c[56] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe96, /*0x70-0x77*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x90-0x97*/
  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe93, /*0x98-0x9f*/
  0xfe94, 0xfe95, 0xfe97, 0xfe92, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa0-0xa7*/
};
static const unsigned short gb18030ext_page4d[16] = {
  0x0000, 0x0000, 0x0000, 0xfe98, 0xfe99, 0xfe9a, 0xfe9b, 0xfe9c, /*0x10-0x17*/
  0xfe9d, 0xfe9e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/
};
static const unsigned short gb18030ext_page9f[16] = {
  0x0000, 0x0000, 0x0000, 0x0000, 0xfe59, 0xfe61, 0xfe66, 0xfe67, /*0xb0-0xb7*/
  0xfe6d, 0xfe7e, 0xfe90, 0xfea0, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/
};
static const unsigned short gb18030ext_pagefe[16] = {
  0xa6d9, 0xa6db, 0xa6da, 0xa6dc, 0xa6dd, 0xa6de, 0xa6df, 0xa6ec, /*0x10-0x17*/
  0xa6ed, 0xa6f3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/
};

static int gb18030ext_wctomb(unsigned int* r, unsigned int wc) {
    unsigned short c = 0;
    if (wc == 0x01f9) {
        c = 0xa8bf;
    } else if (wc == 0x1e3f) {
        c = 0xa8bc;
    } else if (wc == 0x20ac) {
        c = 0xa2e3;
    } else if (wc >= 0x2e80 && wc < 0x2ed0) {
        c = gb18030ext_page2e[wc-0x2e80];
    } else if (wc >= 0x2ff0 && wc < 0x3000) {
        c = gb18030ext_page2f[wc-0x2ff0];
    } else if (wc == 0x303e) {
        c = 0xa989;
    } else if (wc >= 0x3440 && wc < 0x3478) {
        c = gb18030ext_page34[wc-0x3440];
    } else if (wc == 0x359e) {
        c = 0xfe5a;
    } else if (wc >= 0x3608 && wc < 0x3620) {
        c = gb18030ext_page36[wc-0x3608];
    } else if (wc == 0x3918) {
        c = 0xfe60;
    } else if (wc == 0x396e) {
        c = 0xfe5f;
    } else if (wc >= 0x39c8 && wc < 0x39e0) {
        c = gb18030ext_page39[wc-0x39c8];
    } else if (wc == 0x3a73) {
        c = 0xfe64;
    } else if (wc == 0x3b4e) {
        c = 0xfe68;
    } else if (wc == 0x3c6e) {
        c = 0xfe69;
    } else if (wc == 0x3ce0) {
        c = 0xfe6a;
    } else if (wc == 0x4056) {
        c = 0xfe6f;
    } else if (wc == 0x415f) {
        c = 0xfe70;
    } else if (wc == 0x4337) {
        c = 0xfe72;
    } else if (wc >= 0x43a8 && wc < 0x43e0) {
        c = gb18030ext_page43[wc-0x43a8];
    } else if (wc == 0x44d6) {
        c = 0xfe7b;
    } else if (wc >= 0x4648 && wc < 0x4668) {
        c = gb18030ext_page46[wc-0x4648];
    } else if (wc >= 0x4720 && wc < 0x4730) {
        c = gb18030ext_page47_1[wc-0x4720];
    } else if (wc >= 0x4778 && wc < 0x4790) {
        c = gb18030ext_page47_2[wc-0x4778];
    } else if (wc >= 0x4940 && wc < 0x49b8) {
        c = gb18030ext_page49[wc-0x4940];
    } else if (wc >= 0x4c70 && wc < 0x4ca8) {
        c = gb18030ext_page4c[wc-0x4c70];
    } else if (wc >= 0x4d10 && wc < 0x4d20) {
        c = gb18030ext_page4d[wc-0x4d10];
    } else if (wc == 0x4dae) {
        c = 0xfe9f;
    } else if (wc >= 0x9fb4 && wc < 0x9fbc) {
        c = gb18030ext_page9f[wc-0x9fb0];
    } else if (wc >= 0xfe10 && wc < 0xfe1a) {
        c = gb18030ext_pagefe[wc-0xfe10];
    } else if (wc == 0x20087) {
        c = 0xfe51;
    } else if (wc == 0x20089) {
        c = 0xfe52;
    } else if (wc == 0x200cc) {
        c = 0xfe53;
    } else if (wc == 0x215d7) {
        c = 0xfe6c;
    } else if (wc == 0x2298f) {
        c = 0xfe76;
    } else if (wc == 0x241fe) {
        c = 0xfe91;
    }
    if (c != 0) {
        *r = c;
        return 2;
    }
    return 0;
}

/*
 * GB18030 four-byte extension (libiconv-1.16/lib/gb18030uni.h)
 */

static const unsigned short gb18030uni_uni2charset_ranges[412] = {
  0x0080, 0x00a3,  0x00a5, 0x00a6,  0x00a9, 0x00af,  0x00b2, 0x00b6,
  0x00b8, 0x00d6,  0x00d8, 0x00df,  0x00e2, 0x00e7,  0x00eb, 0x00eb,
  0x00ee, 0x00f1,  0x00f4, 0x00f6,  0x00f8, 0x00f8,  0x00fb, 0x00fb,
  0x00fd, 0x0100,  0x0102, 0x0112,  0x0114, 0x011a,  0x011c, 0x012a,
  0x012c, 0x0143,  0x0145, 0x0147,  0x0149, 0x014c,  0x014e, 0x016a,
  0x016c, 0x01cd,  0x01cf, 0x01cf,  0x01d1, 0x01d1,  0x01d3, 0x01d3,
  0x01d5, 0x01d5,  0x01d7, 0x01d7,  0x01d9, 0x01d9,  0x01db, 0x01db,
  0x01dd, 0x01f8,  0x01fa, 0x0250,  0x0252, 0x0260,  0x0262, 0x02c6,
  0x02c8, 0x02c8,  0x02cc, 0x02d8,  0x02da, 0x0390,  0x03a2, 0x03a2,
  0x03aa, 0x03b0,  0x03c2, 0x03c2,  0x03ca, 0x0400,  0x0402, 0x040f,
  0x0450, 0x0450,  0x0452, 0x200f,  0x2011, 0x2012,  0x2017, 0x2017,
  0x201a, 0x201b,  0x201e, 0x2024,  0x2027, 0x202f,  0x2031, 0x2031,
  0x2034, 0x2034,  0x2036, 0x203a,  0x203c, 0x20ab,  0x20ad, 0x2102,
  0x2104, 0x2104,  0x2106, 0x2108,  0x210a, 0x2115,  0x2117, 0x2120,
  0x2122, 0x215f,  0x216c, 0x216f,  0x217a, 0x218f,  0x2194, 0x2195,
  0x219a, 0x2207,  0x2209, 0x220e,  0x2210, 0x2210,  0x2212, 0x2214,
  0x2216, 0x2219,  0x221b, 0x221c,  0x2221, 0x2222,  0x2224, 0x2224,
  0x2226, 0x2226,  0x222c, 0x222d,  0x222f, 0x2233,  0x2238, 0x223c,
  0x223e, 0x2247,  0x2249, 0x224b,  0x224d, 0x2251,  0x2253, 0x225f,
  0x2262, 0x2263,  0x2268, 0x226d,  0x2270, 0x2294,  0x2296, 0x2298,
  0x229a, 0x22a4,  0x22a6, 0x22be,  0x22c0, 0x2311,  0x2313, 0x245f,
  0x246a, 0x2473,  0x249c, 0x24ff,  0x254c, 0x254f,  0x2574, 0x2580,
  0x2590, 0x2592,  0x2596, 0x259f,  0x25a2, 0x25b1,  0x25b4, 0x25bb,
  0x25be, 0x25c5,  0x25c8, 0x25ca,  0x25cc, 0x25cd,  0x25d0, 0x25e1,
  0x25e6, 0x2604,  0x2607, 0x2608,  0x260a, 0x263f,  0x2641, 0x2641,
  0x2643, 0x2e80,  0x2e82, 0x2e83,  0x2e85, 0x2e87,  0x2e89, 0x2e8a,
  0x2e8d, 0x2e96,  0x2e98, 0x2ea6,  0x2ea8, 0x2ea9,  0x2eab, 0x2ead,
  0x2eaf, 0x2eb2,  0x2eb4, 0x2eb5,  0x2eb8, 0x2eba,  0x2ebc, 0x2ec9,
  0x2ecb, 0x2fef,  0x2ffc, 0x2fff,  0x3004, 0x3004,  0x3018, 0x301c,
  0x301f, 0x3020,  0x302a, 0x303d,  0x303f, 0x3040,  0x3094, 0x309a,
  0x309f, 0x30a0,  0x30f7, 0x30fb,  0x30ff, 0x3104,  0x312a, 0x321f,
  0x322a, 0x3230,  0x3232, 0x32a2,  0x32a4, 0x338d,  0x3390, 0x339b,
  0x339f, 0x33a0,  0x33a2, 0x33c3,  0x33c5, 0x33cd,  0x33cf, 0x33d0,
  0x33d3, 0x33d4,  0x33d6, 0x3446,  0x3448, 0x3472,  0x3474, 0x359d,
  0x359f, 0x360d,  0x360f, 0x3619,  0x361b, 0x3917,  0x3919, 0x396d,
  0x396f, 0x39ce,  0x39d1, 0x39de,  0x39e0, 0x3a72,  0x3a74, 0x3b4d,
  0x3b4f, 0x3c6d,  0x3c6f, 0x3cdf,  0x3ce1, 0x4055,  0x4057, 0x415e,
  0x4160, 0x4336,  0x4338, 0x43ab,  0x43ad, 0x43b0,  0x43b2, 0x43dc,
  0x43de, 0x44d5,  0x44d7, 0x464b,  0x464d, 0x4660,  0x4662, 0x4722,
  0x4724, 0x4728,  0x472a, 0x477b,  0x477d, 0x478c,  0x478e, 0x4946,
  0x4948, 0x4979,  0x497b, 0x497c,  0x497e, 0x4981,  0x4984, 0x4984,
  0x4987, 0x499a,  0x499c, 0x499e,  0x49a0, 0x49b5,  0x49b8, 0x4c76,
  0x4c78, 0x4c9e,  0x4ca4, 0x4d12,  0x4d1a, 0x4dad,  0x4daf, 0x4dff,
  0x9fa6, 0xd7ff,
                   0xe76c, 0xe76c,  0xe7c8, 0xe7c8,  0xe7e7, 0xe7f3,
  0xe815, 0xe815,  0xe819, 0xe81d,  0xe81f, 0xe825,  0xe827, 0xe82a,
  0xe82d, 0xe830,  0xe833, 0xe83a,  0xe83c, 0xe842,  0xe844, 0xe853,
  0xe856, 0xe863,
                   0xe865, 0xf92b,  0xf92d, 0xf978,  0xf97a, 0xf994,
  0xf996, 0xf9e6,  0xf9e8, 0xf9f0,  0xf9f2, 0xfa0b,  0xfa10, 0xfa10,
  0xfa12, 0xfa12,  0xfa15, 0xfa17,  0xfa19, 0xfa1e,  0xfa22, 0xfa22,
  0xfa25, 0xfa26,  0xfa2a, 0xfe2f,  0xfe32, 0xfe32,  0xfe45, 0xfe48,
  0xfe53, 0xfe53,  0xfe58, 0xfe58,  0xfe67, 0xfe67,  0xfe6c, 0xff00,
  0xff5f, 0xffdf,  0xffe6, 0xffff
};

static const unsigned short gb18030uni_ranges[206] = {
    128,   129,   131,   133,   134,   135,   137,   140,
    142,   144,   145,   147,   148,   149,   150,   151,
    152,   153,   154,   155,   156,   157,   158,   159,
    160,   161,   162,   163,   164,   165,   166,   167,
    168,   171,   172,   189,   196,   213,   220,   221,
    285,   286,   287,   291,   293,   295,   297,   298,
    300,   301,   302,   303,   304,   305,   306,   307,
    308,   320,   330,   334,   338,   339,   340,   341,
    342,   343,   347,   348,   349,   354,   355,   359,
    360,   361,   362,   363,   365,   369,   371,   372,
    373,   374,   375,   376,   386,   426,   502,   538,
    553,   556,   558,   560,   562,   564,   565,   567,
    571,   573,   574,   575,   576,   577,   578,   579,
    581,   582,   583,   584,   585,   586,   588,   589,
    590,   602,   606,   625,   627,   636,   637,   720,
    724,   810,   813,   850,   860,   861,   862,   864,
    867,   868,   869,   870,   872,   873,   874,   875,
    876,   877,   878,   879,   880,   882,   883,   884,
    885,   886,   887,   888,   889,   890,   891,   892,
    893,   894,   895,   896,   897,   898,   899,   900,
    901,   902,   903,   905,   907,   908,   909,   911,
    912,   917,   924,   925, 21827,
                                     25775, 25866, 25896,
  25929, 25932, 25933, 25934, 25936, 25938, 25939, 25940,
  25942,
         25943, 25944, 25945, 25946, 25947, 25948, 25952,
  25953, 25955, 25956, 25959, 25961, 25964, 25966, 25984,
  25994, 25998, 26012, 26016, 26110, 26116
};

static int gb18030uni_wctomb(unsigned int* r1, unsigned int* r2, unsigned int wc) {
    unsigned int i = wc;
    if (i >= 0x0080 && i <= 0xffff) {
        if (i == 0xe7c7) {
            i = 7457;
        } else {
            unsigned int k1 = 0;
            unsigned int k2 = 205;
            while (k1 < k2) {
                unsigned int k = (k1 + k2) / 2;
                if (i <= gb18030uni_uni2charset_ranges[2*k+1]) {
                    k2 = k;
                } else if (i >= gb18030uni_uni2charset_ranges[2*k+2]) {
                    k1 = k + 1;
                } else {
                    return 0;
                }
            }
            {
                unsigned int diff = gb18030uni_ranges[k1];
                i -= diff;
            }
        }
        *r2 = (i % 10) + 0x30; i = i / 10;
        *r2 |= ((i % 126) + 0x81) << 8; i = i / 126;
        *r1 = (i % 10) + 0x30; i = i / 10;
        *r1 |= (i + 0x81) << 8;
        return 4;
    }
    return 0;
}

/*
 * GB18030 (libiconv-1.16/lib/gb18030.h)
 */

static const unsigned short gb18030_pua2charset[31*3] = {
/* Unicode range   GB18030 range */
  0xe766, 0xe76b,  0xa2ab, /*.. 0xa2b0, */
  0xe76d, 0xe76d,  0xa2e4,
  0xe76e, 0xe76f,  0xa2ef, /*.. 0xa2f0, */
  0xe770, 0xe771,  0xa2fd, /*.. 0xa2fe, */
  0xe772, 0xe77c,  0xa4f4, /*.. 0xa4fe, */
  0xe77d, 0xe784,  0xa5f7, /*.. 0xa5fe, */
  0xe785, 0xe78c,  0xa6b9, /*.. 0xa6c0, */
  0xe78d, 0xe793,  0xa6d9, /*.. 0xa6df, */
  0xe794, 0xe795,  0xa6ec, /*.. 0xa6ed, */
  0xe796, 0xe796,  0xa6f3,
  0xe797, 0xe79f,  0xa6f6, /*.. 0xa6fe, */
  0xe7a0, 0xe7ae,  0xa7c2, /*.. 0xa7d0, */
  0xe7af, 0xe7bb,  0xa7f2, /*.. 0xa7fe, */
  0xe7bc, 0xe7c6,  0xa896, /*.. 0xa8a0, */
  0xe7c9, 0xe7cc,  0xa8c1, /*.. 0xa8c4, */
  0xe7cd, 0xe7e1,  0xa8ea, /*.. 0xa8fe, */
  0xe7e2, 0xe7e2,  0xa958,
  0xe7e3, 0xe7e3,  0xa95b,
  0xe7e4, 0xe7e6,  0xa95d, /*.. 0xa95f, */
  0xe7f4, 0xe800,  0xa997, /*.. 0xa9a3, */
  0xe801, 0xe80f,  0xa9f0, /*.. 0xa9fe, */
  0xe810, 0xe814,  0xd7fa, /*.. 0xd7fe, */
  0xe816, 0xe818,  0xfe51, /*.. 0xfe53, */
  0xe81e, 0xe81e,  0xfe59,
  0xe826, 0xe826,  0xfe61,
  0xe82b, 0xe82c,  0xfe66, /*.. 0xfe67, */
  0xe831, 0xe832,  0xfe6c, /*.. 0xfe6d, */
  0xe83b, 0xe83b,  0xfe76,
  0xe843, 0xe843,  0xfe7e,
  0xe854, 0xe855,  0xfe90, /*.. 0xfe91, */
  0xe864, 0xe864,  0xfea0,
};

INTERNAL int gb18030_wctomb_zint(unsigned int* r1, unsigned int* r2, unsigned int wc) {
    int ret;

    /* Code set 0 (ASCII) */
    if (wc < 0x0080) {
        *r1 = wc;
        return 1;
    }

    /* Code set 1 (GBK extended) */
    ret = gbk_wctomb(r1, wc);
    if (ret) {
        return ret;
    }

    ret = gb18030ext_wctomb(r1, wc);
    if (ret) {
        return ret;
    }

    /* Code set 2 (remainder of Unicode U+0000..U+FFFF) */
    if (wc >= 0xe000 && wc <= 0xe864) {
        if (wc < 0xe766) {
            /* User-defined characters range U+E000..U+E765 */
            if (wc < 0xe4c6) {
                unsigned int i = wc - 0xe000;
                *r1 = (i % 94) + 0xa1; i = i / 94;
                *r1 |= (i < 6 ? i + 0xaa : i + 0xf2) << 8;
                return 2;
            } else {
                unsigned int i = wc - 0xe4c6;
                *r1 = ((i / 96) + 0xa1) << 8; i = i % 96;
                *r1 |= i + (i >= 0x3f ? 0x41 : 0x40);
                return 2;
            }
        } else {
            /* User-defined characters, two-byte part of range U+E766..U+E864 */
            unsigned int k1 = 0;
            unsigned int k2 = 31;
            /* Invariant: We know that if wc occurs in Unicode interval in
            gb18030_pua2charset, it does so at a k with  k1 <= k < k2. */
            while (k1 < k2) {
                unsigned int k = (k1 + k2) / 2;
                if (wc < gb18030_pua2charset[k*3+0]) {
                    k2 = k;
                } else if (wc > gb18030_pua2charset[k*3+1]) {
                    k1 = k + 1;
                } else {
                    *r1 = gb18030_pua2charset[k*3+2] + (wc - gb18030_pua2charset[k*3+0]);
                    return 2;
                }
            }
        }
    }
    ret = gb18030uni_wctomb(r1, r2, wc);
    if (ret) {
        return ret;
    }

    /* Code set 3 (Unicode U+10000..U+10FFFF) */
    if (wc >= 0x10000 && wc < 0x110000) {
        unsigned int i = wc - 0x10000;
        *r2 = (i % 10) + 0x30; i = i / 10;
        *r2 |= ((i % 126) + 0x81) << 8; i = i / 126;
        *r1 = (i % 10) + 0x30; i = i / 10;
        *r1 |= (i + 0x90) << 8;
        return 4;
    }
    return 0;
}

/* Convert UTF-8 string to GB 18030 and place in array of ints */
INTERNAL int gb18030_utf8tomb(struct zint_symbol *symbol, const unsigned char source[], size_t* p_length, unsigned int* gbdata) {
    int i, j, error_number, ret;
    unsigned int length;
#ifndef _MSC_VER
    unsigned int utfdata[*p_length + 1];
#else
    unsigned int* utfdata = (unsigned int*) _alloca((*p_length + 1) * sizeof(unsigned int));
#endif

    error_number = utf8_to_unicode(symbol, source, utfdata, p_length, 0 /*disallow_4byte*/);
    if (error_number != 0) {
        return error_number;
    }

    for (i = 0, j = 0, length = *p_length; i < length; i++, j++) {
        if (utfdata[i] < 0x80) {
            gbdata[j] = utfdata[i];
        } else {
            ret = gb18030_wctomb_zint(gbdata + j, gbdata + j + 1, utfdata[i]);
            if (ret == 0) {
                strcpy(symbol->errtxt, "820: Invalid character in input data");
                return ZINT_ERROR_INVALID_DATA;
            }
            if (ret == 4) {
                j++;
            }
        }
    }

    *p_length = j;

    return 0;
}

/* Convert UTF-8 string to single byte ECI and place in array of ints */
INTERNAL int gb18030_utf8tosb(int eci, const unsigned char source[], size_t* p_length, unsigned int* gbdata) {
    int error_number;
#ifndef _MSC_VER
    unsigned char single_byte[*p_length + 1];
#else
    unsigned char* single_byte = (unsigned char*) _alloca(*p_length + 1);
#endif

    error_number = utf_to_eci(eci, source, single_byte, p_length);
    if (error_number != 0) {
        /* Note not setting `symbol->errtxt`, up to caller */
        return error_number;
    }

    gb18030_cpy(single_byte, p_length, gbdata);

    return 0;
}

/* Copy byte input stream to array of ints, putting double-bytes that match HANXIN Chinese mode in single entry, and quad-bytes in 2 entries */
INTERNAL void gb18030_cpy(const unsigned char source[], size_t* p_length, unsigned int* gbdata) {
    int i, j, done;
    unsigned int length;
    unsigned char c1, c2, c3, c4;
    for (i = 0, j = 0, length = *p_length; i < length; i++, j++) {
        done = 0;
        c1 = source[i];
        if (length - i >= 2) {
            if (c1 >= 0x81 && c1 <= 0xFE) {
                c2 = source[i + 1];
                if ((c2 >= 0x40 && c2 <= 0x7E) || (c2 >= 0x80 && c2 <= 0xFE)) {
                    gbdata[j] = (c1 << 8) | c2;
                    i++;
                    done = 1;
                } else if (length - i >= 4 && (c2 >= 0x30 && c2 <= 0x39)) {
                    c3 = source[i + 2];
                    c4 = source[i + 3];
                    if ((c3 >= 0x81 && c3 <= 0xFE) && (c4 >= 0x30 && c4 <= 0x39)) {
                        gbdata[j++] = (c1 << 8) | c2;
                        gbdata[j] = (c3 << 8) | c4;
                        i += 3;
                        done = 1;
                    }
                }
            }
        }
        if (!done) {
            gbdata[j] = c1;
        }
    }
    *p_length = j;
}
Changes to jni/zint/backend/gb18030.h.

more than 10,000 changes

Added jni/zint/backend/gb2312.c.


























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */
/*
 * Adapted from GNU LIBICONV library and patched to add 2 duplicate mappings
 * for compatibility with GB 18030 subset:
 * 1) U+00B7 to 0xA1A4 (duplicate of U+30FB)
 * 2) U+2014 to 0xA1AA (duplicate of U+2015)
 */
/*
 * Copyright (C) 1999-2001, 2012, 2016 Free Software Foundation, Inc.
 * This file is part of the GNU LIBICONV Library.
 *
 * The GNU LIBICONV Library is free software; you can redistribute it
 * and/or modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * The GNU LIBICONV Library is distributed in the hope that it will be
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with the GNU LIBICONV Library; see the file COPYING.LIB.
 * If not, see <https://www.gnu.org/licenses/>.
 */
#include <string.h>
#include "common.h"
#include "gb2312.h"

INTERNAL int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */

/*
 * GB2312.1980-0 (libiconv-1.16/lib/gb2312.h)
 */

/* ZINT: Table converted from GB 2312 to EUC-CN values using tools/cnv_gb2312.php:
 *
while ($line = fgets(STDIN)) {
    echo preg_replace_callback('/0x([0-9a-f]{4})/', function ($matches) {
        return '0x' . dechex(hexdec($matches[1]) + 0x8080);
    }, $line);
}
 */
static const unsigned short gb2312_2charset[7445] = {
  0xa1e8, 0xa1ec, 0xa1a7, 0xa1e3, 0xa1c0, 0xa1c1, 0xa8a4, 0xa8a2,
  0xa8a8, 0xa8a6, 0xa8ba, 0xa8ac, 0xa8aa, 0xa8b0, 0xa8ae, 0xa1c2,
  0xa8b4, 0xa8b2, 0xa8b9, 0xa8a1, 0xa8a5, 0xa8a7, 0xa8a9, 0xa8ad,
  0xa8b1, 0xa8a3, 0xa8ab, 0xa8af, 0xa8b3, 0xa8b5, 0xa8b6, 0xa8b7,
  0xa8b8, 0xa1a6, 0xa1a5, 0xa6a1, 0xa6a2, 0xa6a3, 0xa6a4, 0xa6a5,
  0xa6a6, 0xa6a7, 0xa6a8, 0xa6a9, 0xa6aa, 0xa6ab, 0xa6ac, 0xa6ad,
  0xa6ae, 0xa6af, 0xa6b0, 0xa6b1, 0xa6b2, 0xa6b3, 0xa6b4, 0xa6b5,
  0xa6b6, 0xa6b7, 0xa6b8, 0xa6c1, 0xa6c2, 0xa6c3, 0xa6c4, 0xa6c5,
  0xa6c6, 0xa6c7, 0xa6c8, 0xa6c9, 0xa6ca, 0xa6cb, 0xa6cc, 0xa6cd,
  0xa6ce, 0xa6cf, 0xa6d0, 0xa6d1, 0xa6d2, 0xa6d3, 0xa6d4, 0xa6d5,
  0xa6d6, 0xa6d7, 0xa6d8, 0xa7a7, 0xa7a1, 0xa7a2, 0xa7a3, 0xa7a4,
  0xa7a5, 0xa7a6, 0xa7a8, 0xa7a9, 0xa7aa, 0xa7ab, 0xa7ac, 0xa7ad,
  0xa7ae, 0xa7af, 0xa7b0, 0xa7b1, 0xa7b2, 0xa7b3, 0xa7b4, 0xa7b5,
  0xa7b6, 0xa7b7, 0xa7b8, 0xa7b9, 0xa7ba, 0xa7bb, 0xa7bc, 0xa7bd,
  0xa7be, 0xa7bf, 0xa7c0, 0xa7c1, 0xa7d1, 0xa7d2, 0xa7d3, 0xa7d4,
  0xa7d5, 0xa7d6, 0xa7d8, 0xa7d9, 0xa7da, 0xa7db, 0xa7dc, 0xa7dd,
  0xa7de, 0xa7df, 0xa7e0, 0xa7e1, 0xa7e2, 0xa7e3, 0xa7e4, 0xa7e5,
  0xa7e6, 0xa7e7, 0xa7e8, 0xa7e9, 0xa7ea, 0xa7eb, 0xa7ec, 0xa7ed,
  0xa7ee, 0xa7ef, 0xa7f0, 0xa7f1, 0xa7d7, 0xa1aa, 0xa1ac, 0xa1ae,
  0xa1af, 0xa1b0, 0xa1b1, 0xa1ad, 0xa1eb, 0xa1e4, 0xa1e5, 0xa1f9,
  0xa1e6, 0xa1ed, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6,
  0xa2f7, 0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0xa1fb, 0xa1fc,
  0xa1fa, 0xa1fd, 0xa1ca, 0xa1c7, 0xa1c6, 0xa1cc, 0xa1d8, 0xa1de,
  0xa1cf, 0xa1ce, 0xa1c4, 0xa1c5, 0xa1c9, 0xa1c8, 0xa1d2, 0xa1d3,
  0xa1e0, 0xa1df, 0xa1c3, 0xa1cb, 0xa1d7, 0xa1d6, 0xa1d5, 0xa1d9,
  0xa1d4, 0xa1dc, 0xa1dd, 0xa1da, 0xa1db, 0xa1d1, 0xa1cd, 0xa1d0,
  0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0,
  0xa2e1, 0xa2e2, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca,
  0xa2cb, 0xa2cc, 0xa2cd, 0xa2ce, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d2,
  0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, 0xa2b1, 0xa2b2,
  0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa2b9, 0xa2ba,
  0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2,
  0xa2c3, 0xa2c4, 0xa9a4, 0xa9a5, 0xa9a6, 0xa9a7, 0xa9a8, 0xa9a9,
  0xa9aa, 0xa9ab, 0xa9ac, 0xa9ad, 0xa9ae, 0xa9af, 0xa9b0, 0xa9b1,
  0xa9b2, 0xa9b3, 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8, 0xa9b9,
  0xa9ba, 0xa9bb, 0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, 0xa9c0, 0xa9c1,
  0xa9c2, 0xa9c3, 0xa9c4, 0xa9c5, 0xa9c6, 0xa9c7, 0xa9c8, 0xa9c9,
  0xa9ca, 0xa9cb, 0xa9cc, 0xa9cd, 0xa9ce, 0xa9cf, 0xa9d0, 0xa9d1,
  0xa9d2, 0xa9d3, 0xa9d4, 0xa9d5, 0xa9d6, 0xa9d7, 0xa9d8, 0xa9d9,
  0xa9da, 0xa9db, 0xa9dc, 0xa9dd, 0xa9de, 0xa9df, 0xa9e0, 0xa9e1,
  0xa9e2, 0xa9e3, 0xa9e4, 0xa9e5, 0xa9e6, 0xa9e7, 0xa9e8, 0xa9e9,
  0xa9ea, 0xa9eb, 0xa9ec, 0xa9ed, 0xa9ee, 0xa9ef, 0xa1f6, 0xa1f5,
  0xa1f8, 0xa1f7, 0xa1f4, 0xa1f3, 0xa1f0, 0xa1f2, 0xa1f1, 0xa1ef,
  0xa1ee, 0xa1e2, 0xa1e1, 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a8, 0xa1a9,
  0xa1b4, 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b8, 0xa1b9, 0xa1ba, 0xa1bb,
  0xa1be, 0xa1bf, 0xa1fe, 0xa1b2, 0xa1b3, 0xa1bc, 0xa1bd, 0xa4a1,
  0xa4a2, 0xa4a3, 0xa4a4, 0xa4a5, 0xa4a6, 0xa4a7, 0xa4a8, 0xa4a9,
  0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4ae, 0xa4af, 0xa4b0, 0xa4b1,
  0xa4b2, 0xa4b3, 0xa4b4, 0xa4b5, 0xa4b6, 0xa4b7, 0xa4b8, 0xa4b9,
  0xa4ba, 0xa4bb, 0xa4bc, 0xa4bd, 0xa4be, 0xa4bf, 0xa4c0, 0xa4c1,
  0xa4c2, 0xa4c3, 0xa4c4, 0xa4c5, 0xa4c6, 0xa4c7, 0xa4c8, 0xa4c9,
  0xa4ca, 0xa4cb, 0xa4cc, 0xa4cd, 0xa4ce, 0xa4cf, 0xa4d0, 0xa4d1,
  0xa4d2, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7, 0xa4d8, 0xa4d9,
  0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4de, 0xa4df, 0xa4e0, 0xa4e1,
  0xa4e2, 0xa4e3, 0xa4e4, 0xa4e5, 0xa4e6, 0xa4e7, 0xa4e8, 0xa4e9,
  0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ee, 0xa4ef, 0xa4f0, 0xa4f1,
  0xa4f2, 0xa4f3, 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a5, 0xa5a6,
  0xa5a7, 0xa5a8, 0xa5a9, 0xa5aa, 0xa5ab, 0xa5ac, 0xa5ad, 0xa5ae,
  0xa5af, 0xa5b0, 0xa5b1, 0xa5b2, 0xa5b3, 0xa5b4, 0xa5b5, 0xa5b6,
  0xa5b7, 0xa5b8, 0xa5b9, 0xa5ba, 0xa5bb, 0xa5bc, 0xa5bd, 0xa5be,
  0xa5bf, 0xa5c0, 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5, 0xa5c6,
  0xa5c7, 0xa5c8, 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd, 0xa5ce,
  0xa5cf, 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa5d4, 0xa5d5, 0xa5d6,
  0xa5d7, 0xa5d8, 0xa5d9, 0xa5da, 0xa5db, 0xa5dc, 0xa5dd, 0xa5de,
  0xa5df, 0xa5e0, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e5, 0xa5e6,
  0xa5e7, 0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ee,
  0xa5ef, 0xa5f0, 0xa5f1, 0xa5f2, 0xa5f3, 0xa5f4, 0xa5f5, 0xa5f6,
  0xa1a4, 0xa8c5, 0xa8c6, 0xa8c7, 0xa8c8, 0xa8c9, 0xa8ca, 0xa8cb,
  0xa8cc, 0xa8cd, 0xa8ce, 0xa8cf, 0xa8d0, 0xa8d1, 0xa8d2, 0xa8d3,
  0xa8d4, 0xa8d5, 0xa8d6, 0xa8d7, 0xa8d8, 0xa8d9, 0xa8da, 0xa8db,
  0xa8dc, 0xa8dd, 0xa8de, 0xa8df, 0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3,
  0xa8e4, 0xa8e5, 0xa8e6, 0xa8e7, 0xa8e8, 0xa8e9, 0xa2e5, 0xa2e6,
  0xa2e7, 0xa2e8, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee,
  0xd2bb, 0xb6a1, 0xc6df, 0xcdf2, 0xd5c9, 0xc8fd, 0xc9cf, 0xcfc2,
  0xd8a2, 0xb2bb, 0xd3eb, 0xd8a4, 0xb3f3, 0xd7a8, 0xc7d2, 0xd8a7,
  0xcac0, 0xc7f0, 0xb1fb, 0xd2b5, 0xb4d4, 0xb6ab, 0xcbbf, 0xd8a9,
  0xb6aa, 0xc1bd, 0xd1cf, 0xc9a5, 0xd8ad, 0xb8f6, 0xd1be, 0xe3dc,
  0xd6d0, 0xb7e1, 0xb4ae, 0xc1d9, 0xd8bc, 0xcde8, 0xb5a4, 0xceaa,
  0xd6f7, 0xc0f6, 0xbed9, 0xd8af, 0xc4cb, 0xbec3, 0xd8b1, 0xc3b4,
  0xd2e5, 0xd6ae, 0xceda, 0xd5a7, 0xbaf5, 0xb7a6, 0xc0d6, 0xc6b9,
  0xc5d2, 0xc7c7, 0xb9d4, 0xb3cb, 0xd2d2, 0xd8bf, 0xbec5, 0xc6f2,
  0xd2b2, 0xcfb0, 0xcfe7, 0xcae9, 0xd8c0, 0xc2f2, 0xc2d2, 0xc8e9,
  0xc7ac, 0xc1cb, 0xd3e8, 0xd5f9, 0xcac2, 0xb6fe, 0xd8a1, 0xd3da,
  0xbff7, 0xd4c6, 0xbba5, 0xd8c1, 0xcee5, 0xbeae, 0xd8a8, 0xd1c7,
  0xd0a9, 0xd8bd, 0xd9ef, 0xcdf6, 0xbfba, 0xbdbb, 0xbaa5, 0xd2e0,
  0xb2fa, 0xbae0, 0xc4b6, 0xcfed, 0xbea9, 0xcda4, 0xc1c1, 0xc7d7,
  0xd9f1, 0xd9f4, 0xc8cb, 0xd8e9, 0xd2da, 0xcab2, 0xc8ca, 0xd8ec,
  0xd8ea, 0xd8c6, 0xbdf6, 0xc6cd, 0xb3f0, 0xd8eb, 0xbdf1, 0xbde9,
  0xc8d4, 0xb4d3, 0xc2d8, 0xb2d6, 0xd7d0, 0xcacb, 0xcbfb, 0xd5cc,
  0xb8b6, 0xcfc9, 0xd9da, 0xd8f0, 0xc7aa, 0xd8ee, 0xb4fa, 0xc1ee,
  0xd2d4, 0xd8ed, 0xd2c7, 0xd8ef, 0xc3c7, 0xd1f6, 0xd6d9, 0xd8f2,
  0xd8f5, 0xbcfe, 0xbcdb, 0xc8ce, 0xb7dd, 0xb7c2, 0xc6f3, 0xd8f8,
  0xd2c1, 0xcee9, 0xbcbf, 0xb7fc, 0xb7a5, 0xd0dd, 0xd6da, 0xd3c5,
  0xbbef, 0xbbe1, 0xd8f1, 0xc9a1, 0xceb0, 0xb4ab, 0xd8f3, 0xc9cb,
  0xd8f6, 0xc2d7, 0xd8f7, 0xceb1, 0xd8f9, 0xb2ae, 0xb9c0, 0xd9a3,
  0xb0e9, 0xc1e6, 0xc9ec, 0xcbc5, 0xcbc6, 0xd9a4, 0xb5e8, 0xb5ab,
  0xcebb, 0xb5cd, 0xd7a1, 0xd7f4, 0xd3d3, 0xcce5, 0xbace, 0xd9a2,
  0xd9dc, 0xd3e0, 0xd8fd, 0xb7f0, 0xd7f7, 0xd8fe, 0xd8fa, 0xd9a1,
  0xc4e3, 0xd3b6, 0xd8f4, 0xd9dd, 0xd8fb, 0xc5e5, 0xc0d0, 0xd1f0,
  0xb0db, 0xbcd1, 0xd9a6, 0xd9a5, 0xd9ac, 0xd9ae, 0xd9ab, 0xcab9,
  0xd9a9, 0xd6b6, 0xb3de, 0xd9a8, 0xc0fd, 0xcacc, 0xd9aa, 0xd9a7,
  0xd9b0, 0xb6b1, 0xb9a9, 0xd2c0, 0xcfc0, 0xc2c2, 0xbdc4, 0xd5ec,
  0xb2e0, 0xc7c8, 0xbfeb, 0xd9ad, 0xd9af, 0xceea, 0xbaee, 0xc7d6,
  0xb1e3, 0xb4d9, 0xb6ed, 0xd9b4, 0xbfa1, 0xd9de, 0xc7ce, 0xc0fe,
  0xd9b8, 0xcbd7, 0xb7fd, 0xd9b5, 0xd9b7, 0xb1a3, 0xd3e1, 0xd9b9,
  0xd0c5, 0xd9b6, 0xd9b1, 0xd9b2, 0xc1a9, 0xd9b3, 0xbcf3, 0xd0de,
  0xb8a9, 0xbee3, 0xd9bd, 0xd9ba, 0xb0b3, 0xd9c2, 0xd9c4, 0xb1b6,
  0xd9bf, 0xb5b9, 0xbef3, 0xccc8, 0xbaf2, 0xd2d0, 0xd9c3, 0xbde8,
  0xb3ab, 0xd9c5, 0xbeeb, 0xd9c6, 0xd9bb, 0xc4df, 0xd9be, 0xd9c1,
  0xd9c0, 0xd5ae, 0xd6b5, 0xc7e3, 0xd9c8, 0xbcd9, 0xd9ca, 0xd9bc,
  0xd9cb, 0xc6ab, 0xd9c9, 0xd7f6, 0xcda3, 0xbda1, 0xd9cc, 0xc5bc,
  0xcdb5, 0xd9cd, 0xd9c7, 0xb3a5, 0xbffe, 0xb8b5, 0xc0fc, 0xb0f8,
  0xb4f6, 0xd9ce, 0xd9cf, 0xb4a2, 0xd9d0, 0xb4df, 0xb0c1, 0xd9d1,
  0xc9b5, 0xcff1, 0xd9d2, 0xc1c5, 0xd9d6, 0xc9ae, 0xd9d5, 0xd9d4,
  0xd9d7, 0xcbdb, 0xbda9, 0xc6a7, 0xd9d3, 0xd9d8, 0xd9d9, 0xc8e5,
  0xc0dc, 0xb6f9, 0xd8a3, 0xd4ca, 0xd4aa, 0xd0d6, 0xb3e4, 0xd5d7,
  0xcfc8, 0xb9e2, 0xbfcb, 0xc3e2, 0xb6d2, 0xcdc3, 0xd9ee, 0xd9f0,
  0xb5b3, 0xb6b5, 0xbea4, 0xc8eb, 0xc8ab, 0xb0cb, 0xb9ab, 0xc1f9,
  0xd9e2, 0xc0bc, 0xb9b2, 0xb9d8, 0xd0cb, 0xb1f8, 0xc6e4, 0xbedf,
  0xb5e4, 0xd7c8, 0xd1f8, 0xbce6, 0xcade, 0xbcbd, 0xd9e6, 0xd8e7,
  0xc4da, 0xb8d4, 0xc8bd, 0xb2e1, 0xd4d9, 0xc3b0, 0xc3e1, 0xdaa2,
  0xc8df, 0xd0b4, 0xbefc, 0xc5a9, 0xb9da, 0xdaa3, 0xd4a9, 0xdaa4,
  0xd9fb, 0xb6ac, 0xb7eb, 0xb1f9, 0xd9fc, 0xb3e5, 0xbef6, 0xbff6,
  0xd2b1, 0xc0e4, 0xb6b3, 0xd9fe, 0xd9fd, 0xbebb, 0xc6e0, 0xd7bc,
  0xdaa1, 0xc1b9, 0xb5f2, 0xc1e8, 0xbcf5, 0xb4d5, 0xc1dd, 0xc4fd,
  0xbcb8, 0xb7b2, 0xb7ef, 0xd9ec, 0xc6be, 0xbfad, 0xbbcb, 0xb5ca,
  0xdbc9, 0xd0d7, 0xcdb9, 0xb0bc, 0xb3f6, 0xbbf7, 0xdbca, 0xbaaf,
  0xd4e4, 0xb5b6, 0xb5f3, 0xd8d6, 0xc8d0, 0xb7d6, 0xc7d0, 0xd8d7,
  0xbfaf, 0xdbbb, 0xd8d8, 0xd0cc, 0xbbae, 0xebbe, 0xc1d0, 0xc1f5,
  0xd4f2, 0xb8d5, 0xb4b4, 0xb3f5, 0xc9be, 0xc5d0, 0xc5d9, 0xc0fb,
  0xb1f0, 0xd8d9, 0xb9ce, 0xb5bd, 0xd8da, 0xd6c6, 0xcba2, 0xc8af,
  0xc9b2, 0xb4cc, 0xbfcc, 0xb9f4, 0xd8db, 0xd8dc, 0xb6e7, 0xbcc1,
  0xccea, 0xcff7, 0xd8dd, 0xc7b0, 0xb9d0, 0xbda3, 0xccde, 0xc6ca,
  0xd8e0, 0xd8de, 0xd8df, 0xb0fe, 0xbee7, 0xcaa3, 0xbcf4, 0xb8b1,
  0xb8ee, 0xd8e2, 0xbdcb, 0xd8e4, 0xd8e3, 0xc5fc, 0xd8e5, 0xd8e6,
  0xc1a6, 0xc8b0, 0xb0ec, 0xb9a6, 0xbcd3, 0xcef1, 0xdbbd, 0xc1d3,
  0xb6af, 0xd6fa, 0xc5ac, 0xbdd9, 0xdbbe, 0xdbbf, 0xc0f8, 0xbea2,
  0xc0cd, 0xdbc0, 0xcac6, 0xb2aa, 0xd3c2, 0xc3e3, 0xd1ab, 0xdbc2,
  0xc0d5, 0xdbc3, 0xbfb1, 0xc4bc, 0xc7da, 0xdbc4, 0xd9e8, 0xc9d7,
  0xb9b4, 0xcef0, 0xd4c8, 0xb0fc, 0xb4d2, 0xd0d9, 0xd9e9, 0xdecb,
  0xd9eb, 0xd8b0, 0xbbaf, 0xb1b1, 0xb3d7, 0xd8ce, 0xd4d1, 0xbdb3,
  0xbfef, 0xcfbb, 0xd8d0, 0xb7cb, 0xd8d1, 0xc6a5, 0xc7f8, 0xd2bd,
  0xd8d2, 0xc4e4, 0xcaae, 0xc7a7, 0xd8a6, 0xc9fd, 0xcee7, 0xbbdc,
  0xb0eb, 0xbbaa, 0xd0ad, 0xb1b0, 0xd7e4, 0xd7bf, 0xb5a5, 0xc2f4,
  0xc4cf, 0xb2a9, 0xb2b7, 0xb1e5, 0xdfb2, 0xd5bc, 0xbfa8, 0xc2ac,
  0xd8d5, 0xc2b1, 0xd8d4, 0xced4, 0xdae0, 0xcec0, 0xd8b4, 0xc3ae,
  0xd3a1, 0xcea3, 0xbcb4, 0xc8b4, 0xc2d1, 0xbeed, 0xd0b6, 0xdae1,
  0xc7e4, 0xb3a7, 0xb6f2, 0xccfc, 0xc0fa, 0xc0f7, 0xd1b9, 0xd1e1,
  0xd8c7, 0xb2de, 0xc0e5, 0xbaf1, 0xd8c8, 0xd4ad, 0xcfe1, 0xd8c9,
  0xd8ca, 0xcfc3, 0xb3f8, 0xbec7, 0xd8cb, 0xdbcc, 0xc8a5, 0xcfd8,
  0xc8fe, 0xb2ce, 0xd3d6, 0xb2e6, 0xbcb0, 0xd3d1, 0xcbab, 0xb7b4,
  0xb7a2, 0xcae5, 0xc8a1, 0xcadc, 0xb1e4, 0xd0f0, 0xc5d1, 0xdbc5,
  0xb5fe, 0xbfda, 0xb9c5, 0xbee4, 0xc1ed, 0xdfb6, 0xdfb5, 0xd6bb,
  0xbdd0, 0xd5d9, 0xb0c8, 0xb6a3, 0xbfc9, 0xcca8, 0xdfb3, 0xcab7,
  0xd3d2, 0xd8cf, 0xd2b6, 0xbac5, 0xcbbe, 0xccbe, 0xdfb7, 0xb5f0,
  0xdfb4, 0xd3f5, 0xb3d4, 0xb8f7, 0xdfba, 0xbacf, 0xbcaa, 0xb5f5,
  0xcdac, 0xc3fb, 0xbaf3, 0xc0f4, 0xcdc2, 0xcff2, 0xdfb8, 0xcfc5,
  0xc2c0, 0xdfb9, 0xc2f0, 0xbefd, 0xc1df, 0xcdcc, 0xd2f7, 0xb7cd,
  0xdfc1, 0xdfc4, 0xb7f1, 0xb0c9, 0xb6d6, 0xb7d4, 0xbaac, 0xccfd,
  0xbfd4, 0xcbb1, 0xc6f4, 0xd6a8, 0xdfc5, 0xcee2, 0xb3b3, 0xcefc,
  0xb4b5, 0xcec7, 0xbaf0, 0xcee1, 0xd1bd, 0xdfc0, 0xb4f4, 0xb3ca,
  0xb8e6, 0xdfbb, 0xc4c5, 0xdfbc, 0xdfbd, 0xdfbe, 0xc5bb, 0xdfbf,
  0xdfc2, 0xd4b1, 0xdfc3, 0xc7ba, 0xced8, 0xc4d8, 0xdfca, 0xdfcf,
  0xd6dc, 0xdfc9, 0xdfda, 0xceb6, 0xbac7, 0xdfce, 0xdfc8, 0xc5de,
  0xc9eb, 0xbaf4, 0xc3fc, 0xbed7, 0xdfc6, 0xdfcd, 0xc5d8, 0xd5a6,
  0xbacd, 0xbecc, 0xd3bd, 0xb8c0, 0xd6e4, 0xdfc7, 0xb9be, 0xbfa7,
  0xc1fc, 0xdfcb, 0xdfcc, 0xdfd0, 0xdfdb, 0xdfe5, 0xdfd7, 0xdfd6,
  0xd7c9, 0xdfe3, 0xdfe4, 0xe5eb, 0xd2a7, 0xdfd2, 0xbfa9, 0xd4db,
  0xbfc8, 0xdfd4, 0xcfcc, 0xdfdd, 0xd1ca, 0xdfde, 0xb0a7, 0xc6b7,
  0xdfd3, 0xbae5, 0xb6df, 0xcddb, 0xb9fe, 0xd4d5, 0xdfdf, 0xcfec,
  0xb0a5, 0xdfe7, 0xdfd1, 0xd1c6, 0xdfd5, 0xdfd8, 0xdfd9, 0xdfdc,
  0xbba9, 0xdfe0, 0xdfe1, 0xdfe2, 0xdfe6, 0xdfe8, 0xd3b4, 0xb8e7,
  0xc5b6, 0xdfea, 0xc9da, 0xc1a8, 0xc4c4, 0xbfde, 0xcff8, 0xd5dc,
  0xdfee, 0xb2b8, 0xbadf, 0xdfec, 0xdbc1, 0xd1e4, 0xcbf4, 0xb4bd,
  0xb0a6, 0xdff1, 0xccc6, 0xdff2, 0xdfed, 0xdfe9, 0xdfeb, 0xdfef,
  0xdff0, 0xbbbd, 0xdff3, 0xdff4, 0xbba3, 0xcadb, 0xcea8, 0xe0a7,
  0xb3aa, 0xe0a6, 0xe0a1, 0xdffe, 0xcdd9, 0xdffc, 0xdffa, 0xbfd0,
  0xd7c4, 0xc9cc, 0xdff8, 0xb0a1, 0xdffd, 0xdffb, 0xe0a2, 0xe0a8,
  0xb7c8, 0xc6a1, 0xc9b6, 0xc0b2, 0xdff5, 0xc5be, 0xd8c4, 0xdff9,
  0xc4f6, 0xe0a3, 0xe0a4, 0xe0a5, 0xd0a5, 0xe0b4, 0xcce4, 0xe0b1,
  0xbfa6, 0xe0af, 0xceb9, 0xe0ab, 0xc9c6, 0xc0ae, 0xe0ae, 0xbaed,
  0xbab0, 0xe0a9, 0xdff6, 0xe0b3, 0xe0b8, 0xb4ad, 0xe0b9, 0xcfb2,
  0xbac8, 0xe0b0, 0xd0fa, 0xe0ac, 0xd4fb, 0xdff7, 0xc5e7, 0xe0ad,
  0xd3f7, 0xe0b6, 0xe0b7, 0xe0c4, 0xd0e1, 0xe0bc, 0xe0c9, 0xe0ca,
  0xe0be, 0xe0aa, 0xc9a4, 0xe0c1, 0xe0b2, 0xcac8, 0xe0c3, 0xe0b5,
  0xcecb, 0xcbc3, 0xe0cd, 0xe0c6, 0xe0c2, 0xe0cb, 0xe0ba, 0xe0bf,
  0xe0c0, 0xe0c5, 0xe0c7, 0xe0c8, 0xe0cc, 0xe0bb, 0xcbd4, 0xe0d5,
  0xe0d6, 0xe0d2, 0xe0d0, 0xbcce, 0xe0d1, 0xb8c2, 0xd8c5, 0xd0ea,
  0xc2ef, 0xe0cf, 0xe0bd, 0xe0d4, 0xe0d3, 0xe0d7, 0xe0dc, 0xe0d8,
  0xd6f6, 0xb3b0, 0xd7ec, 0xcbbb, 0xe0da, 0xcefb, 0xbad9, 0xe0e1,
  0xe0dd, 0xd2ad, 0xe0e2, 0xe0db, 0xe0d9, 0xe0df, 0xe0e0, 0xe0de,
  0xe0e4, 0xc6f7, 0xd8ac, 0xd4eb, 0xe0e6, 0xcac9, 0xe0e5, 0xb8c1,
  0xe0e7, 0xe0e8, 0xe0e9, 0xe0e3, 0xbabf, 0xcce7, 0xe0ea, 0xcff9,
  0xe0eb, 0xc8c2, 0xbdc0, 0xc4d2, 0xe0ec, 0xe0ed, 0xc7f4, 0xcbc4,
  0xe0ee, 0xbbd8, 0xd8b6, 0xd2f2, 0xe0ef, 0xcdc5, 0xb6da, 0xe0f1,
  0xd4b0, 0xc0a7, 0xb4d1, 0xcea7, 0xe0f0, 0xe0f2, 0xb9cc, 0xb9fa,
  0xcdbc, 0xe0f3, 0xc6d4, 0xe0f4, 0xd4b2, 0xc8a6, 0xe0f6, 0xe0f5,
  0xe0f7, 0xcdc1, 0xcaa5, 0xd4da, 0xdbd7, 0xdbd9, 0xdbd8, 0xb9e7,
  0xdbdc, 0xdbdd, 0xb5d8, 0xdbda, 0xdbdb, 0xb3a1, 0xdbdf, 0xbbf8,
  0xd6b7, 0xdbe0, 0xbef9, 0xb7bb, 0xdbd0, 0xccae, 0xbfb2, 0xbbb5,
  0xd7f8, 0xbfd3, 0xbfe9, 0xbce1, 0xccb3, 0xdbde, 0xb0d3, 0xceeb,
  0xb7d8, 0xd7b9, 0xc6c2, 0xc0a4, 0xccb9, 0xdbe7, 0xdbe1, 0xc6ba,
  0xdbe3, 0xdbe8, 0xc5f7, 0xdbea, 0xdbe9, 0xbfc0, 0xdbe6, 0xdbe5,
  0xb4b9, 0xc0ac, 0xc2a2, 0xdbe2, 0xdbe4, 0xd0cd, 0xdbed, 0xc0dd,
  0xdbf2, 0xb6e2, 0xdbf3, 0xdbd2, 0xb9b8, 0xd4ab, 0xdbec, 0xbfd1,
  0xdbf0, 0xdbd1, 0xb5e6, 0xdbeb, 0xbfe5, 0xdbee, 0xdbf1, 0xdbf9,
  0xb9a1, 0xb0a3, 0xc2f1, 0xb3c7, 0xdbef, 0xdbf8, 0xc6d2, 0xdbf4,
  0xdbf5, 0xdbf7, 0xdbf6, 0xdbfe, 0xd3f2, 0xb2ba, 0xdbfd, 0xdca4,
  0xdbfb, 0xdbfa, 0xdbfc, 0xc5e0, 0xbbf9, 0xdca3, 0xdca5, 0xccc3,
  0xb6d1, 0xddc0, 0xdca1, 0xdca2, 0xc7b5, 0xb6e9, 0xdca7, 0xdca6,
  0xdca9, 0xb1a4, 0xb5cc, 0xbfb0, 0xd1df, 0xb6c2, 0xdca8, 0xcbfa,
  0xebf3, 0xcbdc, 0xcbfe, 0xccc1, 0xc8fb, 0xdcaa, 0xccee, 0xdcab,
  0xdbd3, 0xdcaf, 0xdcac, 0xbeb3, 0xcafb, 0xdcad, 0xc9ca, 0xc4b9,
  0xc7bd, 0xdcae, 0xd4f6, 0xd0e6, 0xc4ab, 0xb6d5, 0xdbd4, 0xb1da,
  0xdbd5, 0xdbd6, 0xbabe, 0xc8c0, 0xcabf, 0xc8c9, 0xd7b3, 0xc9f9,
  0xbfc7, 0xbaf8, 0xd2bc, 0xe2ba, 0xb4a6, 0xb1b8, 0xb8b4, 0xcfc4,
  0xd9e7, 0xcfa6, 0xcde2, 0xd9ed, 0xb6e0, 0xd2b9, 0xb9bb, 0xe2b9,
  0xe2b7, 0xb4f3, 0xccec, 0xccab, 0xb7f2, 0xd8b2, 0xd1eb, 0xbabb,
  0xcaa7, 0xcdb7, 0xd2c4, 0xbfe4, 0xbcd0, 0xb6e1, 0xdec5, 0xdec6,
  0xdbbc, 0xd1d9, 0xc6e6, 0xc4ce, 0xb7ee, 0xb7dc, 0xbffc, 0xd7e0,
  0xc6f5, 0xb1bc, 0xdec8, 0xbdb1, 0xccd7, 0xdeca, 0xdec9, 0xb5ec,
  0xc9dd, 0xb0c2, 0xc5ae, 0xc5ab, 0xc4cc, 0xbce9, 0xcbfd, 0xbac3,
  0xe5f9, 0xc8e7, 0xe5fa, 0xcdfd, 0xd7b1, 0xb8be, 0xc2e8, 0xc8d1,
  0xe5fb, 0xb6ca, 0xbccb, 0xd1fd, 0xe6a1, 0xc3ee, 0xe6a4, 0xe5fe,
  0xe6a5, 0xcdd7, 0xb7c1, 0xe5fc, 0xe5fd, 0xe6a3, 0xc4dd, 0xe6a8,
  0xe6a7, 0xc3c3, 0xc6de, 0xe6aa, 0xc4b7, 0xe6a2, 0xcabc, 0xbde3,
  0xb9c3, 0xe6a6, 0xd0d5, 0xceaf, 0xe6a9, 0xe6b0, 0xd2a6, 0xbdaa,
  0xe6ad, 0xe6af, 0xc0d1, 0xd2cc, 0xbca7, 0xe6b1, 0xd2f6, 0xd7cb,
  0xcdfe, 0xcdde, 0xc2a6, 0xe6ab, 0xe6ac, 0xbdbf, 0xe6ae, 0xe6b3,
  0xe6b2, 0xe6b6, 0xe6b8, 0xc4ef, 0xc4c8, 0xbeea, 0xc9ef, 0xe6b7,
  0xb6f0, 0xc3e4, 0xd3e9, 0xe6b4, 0xe6b5, 0xc8a2, 0xe6bd, 0xe6b9,
  0xc6c5, 0xcdf1, 0xe6bb, 0xe6bc, 0xbbe9, 0xe6be, 0xe6ba, 0xc0b7,
  0xd3a4, 0xe6bf, 0xc9f4, 0xe6c3, 0xe6c4, 0xd0f6, 0xc3bd, 0xc3c4,
  0xe6c2, 0xe6c1, 0xe6c7, 0xcfb1, 0xebf4, 0xe6ca, 0xe6c5, 0xbcde,
  0xc9a9, 0xbcb5, 0xcfd3, 0xe6c8, 0xe6c9, 0xe6ce, 0xe6d0, 0xe6d1,
  0xe6cb, 0xb5d5, 0xe6cc, 0xe6cf, 0xc4db, 0xe6c6, 0xe6cd, 0xe6d2,
  0xe6d4, 0xe6d3, 0xe6d5, 0xd9f8, 0xe6d6, 0xe6d7, 0xd7d3, 0xe6dd,
  0xe6de, 0xbfd7, 0xd4d0, 0xd7d6, 0xb4e6, 0xcbef, 0xe6da, 0xd8c3,
  0xd7ce, 0xd0a2, 0xc3cf, 0xe6df, 0xbcbe, 0xb9c2, 0xe6db, 0xd1a7,
  0xbaa2, 0xc2cf, 0xd8ab, 0xcaeb, 0xe5ee, 0xe6dc, 0xb7f5, 0xc8e6,
  0xc4f5, 0xe5b2, 0xc4fe, 0xcbfc, 0xe5b3, 0xd5ac, 0xd3ee, 0xcad8,
  0xb0b2, 0xcbce, 0xcdea, 0xbaea, 0xe5b5, 0xe5b4, 0xd7da, 0xb9d9,
  0xd6e6, 0xb6a8, 0xcdf0, 0xd2cb, 0xb1a6, 0xcab5, 0xb3e8, 0xc9f3,
  0xbfcd, 0xd0fb, 0xcad2, 0xe5b6, 0xbbc2, 0xcfdc, 0xb9ac, 0xd4d7,
  0xbaa6, 0xd1e7, 0xcffc, 0xbcd2, 0xe5b7, 0xc8dd, 0xbfed, 0xb1f6,
  0xcbde, 0xbcc5, 0xbcc4, 0xd2fa, 0xc3dc, 0xbfdc, 0xb8bb, 0xc3c2,
  0xbaae, 0xd4a2, 0xc7de, 0xc4af, 0xb2ec, 0xb9d1, 0xe5bb, 0xc1c8,
  0xd5af, 0xe5bc, 0xe5be, 0xb4e7, 0xb6d4, 0xcbc2, 0xd1b0, 0xb5bc,
  0xcad9, 0xb7e2, 0xc9e4, 0xbdab, 0xcebe, 0xd7f0, 0xd0a1, 0xc9d9,
  0xb6fb, 0xe6d8, 0xbce2, 0xb3be, 0xc9d0, 0xe6d9, 0xb3a2, 0xdecc,
  0xd3c8, 0xdecd, 0xd2a2, 0xdece, 0xbecd, 0xdecf, 0xcaac, 0xd2fc,
  0xb3df, 0xe5ea, 0xc4e1, 0xbea1, 0xceb2, 0xc4f2, 0xbed6, 0xc6a8,
  0xb2e3, 0xbed3, 0xc7fc, 0xcceb, 0xbdec, 0xcedd, 0xcaba, 0xc6c1,
  0xe5ec, 0xd0bc, 0xd5b9, 0xe5ed, 0xcaf4, 0xcdc0, 0xc2c5, 0xe5ef,
  0xc2c4, 0xe5f0, 0xe5f8, 0xcdcd, 0xc9bd, 0xd2d9, 0xe1a8, 0xd3ec,
  0xcbea, 0xc6f1, 0xe1ac, 0xe1a7, 0xe1a9, 0xe1aa, 0xe1af, 0xb2ed,
  0xe1ab, 0xb8da, 0xe1ad, 0xe1ae, 0xe1b0, 0xb5ba, 0xe1b1, 0xe1b3,
  0xe1b8, 0xd1d2, 0xe1b6, 0xe1b5, 0xc1eb, 0xe1b7, 0xd4c0, 0xe1b2,
  0xe1ba, 0xb0b6, 0xe1b4, 0xbff9, 0xe1b9, 0xe1bb, 0xe1be, 0xe1bc,
  0xd6c5, 0xcfbf, 0xe1bd, 0xe1bf, 0xc2cd, 0xb6eb, 0xd3f8, 0xc7cd,
  0xb7e5, 0xbefe, 0xe1c0, 0xe1c1, 0xe1c7, 0xb3e7, 0xc6e9, 0xb4de,
  0xd1c2, 0xe1c8, 0xe1c6, 0xe1c5, 0xe1c3, 0xe1c2, 0xb1c0, 0xd5b8,
  0xe1c4, 0xe1cb, 0xe1cc, 0xe1ca, 0xeffa, 0xe1d3, 0xe1d2, 0xc7b6,
  0xe1c9, 0xe1ce, 0xe1d0, 0xe1d4, 0xe1d1, 0xe1cd, 0xe1cf, 0xe1d5,
  0xe1d6, 0xe1d7, 0xe1d8, 0xe1da, 0xe1db, 0xcea1, 0xe7dd, 0xb4a8,
  0xd6dd, 0xd1b2, 0xb3b2, 0xb9a4, 0xd7f3, 0xc7c9, 0xbede, 0xb9ae,
  0xced7, 0xb2ee, 0xdbcf, 0xbcba, 0xd2d1, 0xcbc8, 0xb0cd, 0xcfef,
  0xd9e3, 0xbded, 0xb1d2, 0xcad0, 0xb2bc, 0xcba7, 0xb7ab, 0xcaa6,
  0xcfa3, 0xe0f8, 0xd5ca, 0xe0fb, 0xe0fa, 0xc5c1, 0xccfb, 0xc1b1,
  0xe0f9, 0xd6e3, 0xb2af, 0xd6c4, 0xb5db, 0xb4f8, 0xd6a1, 0xcfaf,
  0xb0ef, 0xe0fc, 0xe1a1, 0xb3a3, 0xe0fd, 0xe0fe, 0xc3b1, 0xc3dd,
  0xe1a2, 0xb7f9, 0xbbcf, 0xe1a3, 0xc4bb, 0xe1a4, 0xe1a5, 0xe1a6,
  0xb4b1, 0xb8c9, 0xc6bd, 0xc4ea, 0xb2a2, 0xd0d2, 0xe7db, 0xbbc3,
  0xd3d7, 0xd3c4, 0xb9e3, 0xe2cf, 0xd7af, 0xc7ec, 0xb1d3, 0xb4b2,
  0xe2d1, 0xd0f2, 0xc2ae, 0xe2d0, 0xbfe2, 0xd3a6, 0xb5d7, 0xe2d2,
  0xb5ea, 0xc3ed, 0xb8fd, 0xb8ae, 0xc5d3, 0xb7cf, 0xe2d4, 0xe2d3,
  0xb6c8, 0xd7f9, 0xcda5, 0xe2d8, 0xe2d6, 0xcafc, 0xbfb5, 0xd3b9,
  0xe2d5, 0xe2d7, 0xc1ae, 0xc0c8, 0xe2db, 0xe2da, 0xc0aa, 0xc1ce,
  0xe2dc, 0xe2dd, 0xe2de, 0xdbc8, 0xd1d3, 0xcda2, 0xbda8, 0xdec3,
  0xd8a5, 0xbfaa, 0xdbcd, 0xd2ec, 0xc6fa, 0xc5aa, 0xdec4, 0xb1d7,
  0xdfae, 0xcabd, 0xdfb1, 0xb9ad, 0xd2fd, 0xb8a5, 0xbaeb, 0xb3da,
  0xb5dc, 0xd5c5, 0xc3d6, 0xcfd2, 0xbba1, 0xe5f3, 0xe5f2, 0xe5f4,
  0xcde4, 0xc8f5, 0xb5af, 0xc7bf, 0xe5f6, 0xecb0, 0xe5e6, 0xb9e9,
  0xb5b1, 0xc2bc, 0xe5e8, 0xe5e7, 0xe5e9, 0xd2cd, 0xe1ea, 0xd0ce,
  0xcdae, 0xd1e5, 0xb2ca, 0xb1eb, 0xb1f2, 0xc5ed, 0xd5c3, 0xd3b0,
  0xe1dc, 0xe1dd, 0xd2db, 0xb3b9, 0xb1cb, 0xcdf9, 0xd5f7, 0xe1de,
  0xbeb6, 0xb4fd, 0xe1df, 0xbadc, 0xe1e0, 0xbbb2, 0xc2c9, 0xe1e1,
  0xd0ec, 0xcdbd, 0xe1e2, 0xb5c3, 0xc5c7, 0xe1e3, 0xe1e4, 0xd3f9,
  0xe1e5, 0xd1ad, 0xe1e6, 0xcea2, 0xe1e7, 0xb5c2, 0xe1e8, 0xbbd5,
  0xd0c4, 0xe2e0, 0xb1d8, 0xd2e4, 0xe2e1, 0xbcc9, 0xc8cc, 0xe2e3,
  0xecfe, 0xecfd, 0xdfaf, 0xe2e2, 0xd6be, 0xcdfc, 0xc3a6, 0xe3c3,
  0xd6d2, 0xe2e7, 0xe2e8, 0xd3c7, 0xe2ec, 0xbfec, 0xe2ed, 0xe2e5,
  0xb3c0, 0xc4ee, 0xe2ee, 0xd0c3, 0xbaf6, 0xe2e9, 0xb7de, 0xbbb3,
  0xccac, 0xcbcb, 0xe2e4, 0xe2e6, 0xe2ea, 0xe2eb, 0xe2f7, 0xe2f4,
  0xd4f5, 0xe2f3, 0xc5ad, 0xd5fa, 0xc5c2, 0xb2c0, 0xe2ef, 0xe2f2,
  0xc1af, 0xcbbc, 0xb5a1, 0xe2f9, 0xbcb1, 0xe2f1, 0xd0d4, 0xd4b9,
  0xe2f5, 0xb9d6, 0xe2f6, 0xc7d3, 0xe2f0, 0xd7dc, 0xeda1, 0xe2f8,
  0xeda5, 0xe2fe, 0xcad1, 0xc1b5, 0xbbd0, 0xbfd6, 0xbae3, 0xcba1,
  0xeda6, 0xeda3, 0xeda2, 0xbbd6, 0xeda7, 0xd0f4, 0xeda4, 0xbade,
  0xb6f7, 0xe3a1, 0xb6b2, 0xccf1, 0xb9a7, 0xcfa2, 0xc7a1, 0xbfd2,
  0xb6f1, 0xe2fa, 0xe2fb, 0xe2fd, 0xe2fc, 0xc4d5, 0xe3a2, 0xd3c1,
  0xe3a7, 0xc7c4, 0xcfa4, 0xe3a9, 0xbab7, 0xe3a8, 0xbbda, 0xe3a3,
  0xe3a4, 0xe3aa, 0xe3a6, 0xcef2, 0xd3c6, 0xbbbc, 0xd4c3, 0xc4fa,
  0xeda8, 0xd0fc, 0xe3a5, 0xc3f5, 0xe3ad, 0xb1af, 0xe3b2, 0xbcc2,
  0xe3ac, 0xb5bf, 0xc7e9, 0xe3b0, 0xbeaa, 0xcdef, 0xbbf3, 0xcce8,
  0xe3af, 0xe3b1, 0xcfa7, 0xe3ae, 0xcea9, 0xbbdd, 0xb5eb, 0xbee5,
  0xb2d2, 0xb3cd, 0xb1b9, 0xe3ab, 0xb2d1, 0xb5ac, 0xb9df, 0xb6e8,
  0xcfeb, 0xe3b7, 0xbbcc, 0xc8c7, 0xd0ca, 0xe3b8, 0xb3ee, 0xeda9,
  0xd3fa, 0xd3e4, 0xedaa, 0xe3b9, 0xd2e2, 0xe3b5, 0xd3de, 0xb8d0,
  0xe3b3, 0xe3b6, 0xb7df, 0xe3b4, 0xc0a2, 0xe3ba, 0xd4b8, 0xb4c8,
  0xe3bb, 0xbbc5, 0xc9f7, 0xc9e5, 0xc4bd, 0xedab, 0xc2fd, 0xbbdb,
  0xbfae, 0xcebf, 0xe3bc, 0xbfb6, 0xb1ef, 0xd4f7, 0xe3be, 0xedad,
  0xe3bf, 0xbaa9, 0xedac, 0xe3bd, 0xe3c0, 0xbab6, 0xb6ae, 0xd0b8,
  0xb0c3, 0xedae, 0xedaf, 0xc0c1, 0xe3c1, 0xc5b3, 0xe3c2, 0xdcb2,
  0xedb0, 0xb8ea, 0xceec, 0xeaa7, 0xd0e7, 0xcaf9, 0xc8d6, 0xcfb7,
  0xb3c9, 0xced2, 0xbde4, 0xe3de, 0xbbf2, 0xeaa8, 0xd5bd, 0xc6dd,
  0xeaa9, 0xeaaa, 0xeaac, 0xeaab, 0xeaae, 0xeaad, 0xbdd8, 0xeaaf,
  0xc2be, 0xb4c1, 0xb4f7, 0xbba7, 0xece6, 0xece5, 0xb7bf, 0xcbf9,
  0xb1e2, 0xece7, 0xc9c8, 0xece8, 0xece9, 0xcad6, 0xded0, 0xb2c5,
  0xd4fa, 0xc6cb, 0xb0c7, 0xb4f2, 0xc8d3, 0xcdd0, 0xbfb8, 0xbfdb,
  0xc7a4, 0xd6b4, 0xc0a9, 0xded1, 0xc9a8, 0xd1ef, 0xc5a4, 0xb0e7,
  0xb3b6, 0xc8c5, 0xb0e2, 0xb7f6, 0xc5fa, 0xb6f3, 0xd5d2, 0xb3d0,
  0xbcbc, 0xb3ad, 0xbef1, 0xb0d1, 0xd2d6, 0xcae3, 0xd7a5, 0xcdb6,
  0xb6b6, 0xbfb9, 0xd5db, 0xb8a7, 0xc5d7, 0xded2, 0xbfd9, 0xc2d5,
  0xc7c0, 0xbba4, 0xb1a8, 0xc5ea, 0xc5fb, 0xcca7, 0xb1a7, 0xb5d6,
  0xc4a8, 0xded3, 0xd1ba, 0xb3e9, 0xc3f2, 0xb7f7, 0xd6f4, 0xb5a3,
  0xb2f0, 0xc4b4, 0xc4e9, 0xc0ad, 0xded4, 0xb0e8, 0xc5c4, 0xc1e0,
  0xb9d5, 0xbedc, 0xcdd8, 0xb0ce, 0xcdcf, 0xded6, 0xbed0, 0xd7be,
  0xded5, 0xd5d0, 0xb0dd, 0xc4e2, 0xc2a3, 0xbcf0, 0xd3b5, 0xc0b9,
  0xc5a1, 0xb2a6, 0xd4f1, 0xc0a8, 0xcac3, 0xded7, 0xd5fc, 0xb9b0,
  0xc8ad, 0xcba9, 0xded9, 0xbfbd, 0xc6b4, 0xd7a7, 0xcab0, 0xc4c3,
  0xb3d6, 0xb9d2, 0xd6b8, 0xeafc, 0xb0b4, 0xbfe6, 0xccf4, 0xcdda,
  0xd6bf, 0xc2ce, 0xcece, 0xcca2, 0xd0ae, 0xc4d3, 0xb5b2, 0xded8,
  0xd5f5, 0xbcb7, 0xbbd3, 0xb0a4, 0xc5b2, 0xb4ec, 0xd5f1, 0xeafd,
  0xdeda, 0xcda6, 0xcdec, 0xcee6, 0xdedc, 0xcdb1, 0xc0a6, 0xd7bd,
  0xdedb, 0xb0c6, 0xbab4, 0xc9d3, 0xc4f3, 0xbee8, 0xb2b6, 0xc0cc,
  0xcbf0, 0xbcf1, 0xbbbb, 0xb5b7, 0xc5f5, 0xdee6, 0xdee3, 0xbedd,
  0xdedf, 0xb4b7, 0xbddd, 0xdee0, 0xc4ed, 0xcfc6, 0xb5e0, 0xb6de,
  0xcada, 0xb5f4, 0xdee5, 0xd5c6, 0xdee1, 0xcccd, 0xc6fe, 0xc5c5,
  0xd2b4, 0xbef2, 0xc2d3, 0xccbd, 0xb3b8, 0xbdd3, 0xbfd8, 0xcdc6,
  0xd1da, 0xb4eb, 0xdee4, 0xdedd, 0xdee7, 0xeafe, 0xc2b0, 0xdee2,
  0xd6c0, 0xb5a7, 0xb2f4, 0xdee8, 0xdef2, 0xdeed, 0xdef1, 0xc8e0,
  0xd7e1, 0xdeef, 0xc3e8, 0xcce1, 0xb2e5, 0xd2be, 0xdeee, 0xdeeb,
  0xced5, 0xb4a7, 0xbfab, 0xbebe, 0xbdd2, 0xdee9, 0xd4ae, 0xdede,
  0xdeea, 0xc0bf, 0xdeec, 0xb2f3, 0xb8e9, 0xc2a7, 0xbdc1, 0xdef5,
  0xdef8, 0xb2ab, 0xb4a4, 0xb4ea, 0xc9a6, 0xdef6, 0xcbd1, 0xb8e3,
  0xdef7, 0xdefa, 0xdef9, 0xccc2, 0xb0e1, 0xb4ee, 0xe5ba, 0xd0af,
  0xb2eb, 0xeba1, 0xdef4, 0xc9e3, 0xdef3, 0xb0da, 0xd2a1, 0xb1f7,
  0xccaf, 0xdef0, 0xcba4, 0xd5aa, 0xdefb, 0xb4dd, 0xc4a6, 0xdefd,
  0xc3fe, 0xc4a1, 0xdfa1, 0xc1cc, 0xdefc, 0xbeef, 0xc6b2, 0xb3c5,
  0xc8f6, 0xcbba, 0xdefe, 0xdfa4, 0xd7b2, 0xb3b7, 0xc1c3, 0xc7cb,
  0xb2a5, 0xb4e9, 0xd7ab, 0xc4ec, 0xdfa2, 0xdfa3, 0xdfa5, 0xbab3,
  0xdfa6, 0xc0de, 0xc9c3, 0xb2d9, 0xc7e6, 0xdfa7, 0xc7dc, 0xdfa8,
  0xeba2, 0xcbd3, 0xdfaa, 0xdfa9, 0xb2c1, 0xc5ca, 0xdfab, 0xd4dc,
  0xc8c1, 0xdfac, 0xbef0, 0xdfad, 0xd6a7, 0xeab7, 0xebb6, 0xcad5,
  0xd8fc, 0xb8c4, 0xb9a5, 0xb7c5, 0xd5fe, 0xb9ca, 0xd0a7, 0xf4cd,
  0xb5d0, 0xc3f4, 0xbec8, 0xebb7, 0xb0bd, 0xbdcc, 0xc1b2, 0xb1d6,
  0xb3a8, 0xb8d2, 0xc9a2, 0xb6d8, 0xebb8, 0xbeb4, 0xcafd, 0xc7c3,
  0xd5fb, 0xb7f3, 0xcec4, 0xd5ab, 0xb1f3, 0xecb3, 0xb0df, 0xecb5,
  0xb6b7, 0xc1cf, 0xf5fa, 0xd0b1, 0xd5e5, 0xced3, 0xbdef, 0xb3e2,
  0xb8ab, 0xd5b6, 0xedbd, 0xb6cf, 0xcbb9, 0xd0c2, 0xb7bd, 0xecb6,
  0xcaa9, 0xc5d4, 0xecb9, 0xecb8, 0xc2c3, 0xecb7, 0xd0fd, 0xecba,
  0xecbb, 0xd7e5, 0xecbc, 0xecbd, 0xc6ec, 0xcede, 0xbcc8, 0xc8d5,
  0xb5a9, 0xbec9, 0xd6bc, 0xd4e7, 0xd1ae, 0xd0f1, 0xeab8, 0xeab9,
  0xeaba, 0xbab5, 0xcab1, 0xbff5, 0xcdfa, 0xeac0, 0xb0ba, 0xeabe,
  0xc0a5, 0xeabb, 0xb2fd, 0xc3f7, 0xbbe8, 0xd2d7, 0xcef4, 0xeabf,
  0xeabc, 0xeac3, 0xd0c7, 0xd3b3, 0xb4ba, 0xc3c1, 0xd7f2, 0xd5d1,
  0xcac7, 0xeac5, 0xeac4, 0xeac7, 0xeac6, 0xd6e7, 0xcfd4, 0xeacb,
  0xbbce, 0xbdfa, 0xc9ce, 0xeacc, 0xc9b9, 0xcffe, 0xeaca, 0xd4ce,
  0xeacd, 0xeacf, 0xcded, 0xeac9, 0xeace, 0xceee, 0xbbde, 0xb3bf,
  0xc6d5, 0xbeb0, 0xcefa, 0xc7e7, 0xbea7, 0xead0, 0xd6c7, 0xc1c0,
  0xd4dd, 0xead1, 0xcfbe, 0xead2, 0xcaee, 0xc5af, 0xb0b5, 0xead4,
  0xead3, 0xf4df, 0xc4ba, 0xb1a9, 0xe5df, 0xead5, 0xcaef, 0xead6,
  0xead7, 0xc6d8, 0xead8, 0xead9, 0xd4bb, 0xc7fa, 0xd2b7, 0xb8fc,
  0xeac2, 0xb2dc, 0xc2fc, 0xd4f8, 0xcce6, 0xd7ee, 0xd4c2, 0xd3d0,
  0xebc3, 0xc5f3, 0xb7fe, 0xebd4, 0xcbb7, 0xebde, 0xc0ca, 0xcdfb,
  0xb3af, 0xc6da, 0xebfc, 0xc4be, 0xceb4, 0xc4a9, 0xb1be, 0xd4fd,
  0xcaf5, 0xd6ec, 0xc6d3, 0xb6e4, 0xbbfa, 0xd0e0, 0xc9b1, 0xd4d3,
  0xc8a8, 0xb8cb, 0xe8be, 0xc9bc, 0xe8bb, 0xc0ee, 0xd0d3, 0xb2c4,
  0xb4e5, 0xe8bc, 0xd5c8, 0xb6c5, 0xe8bd, 0xcaf8, 0xb8dc, 0xccf5,
  0xc0b4, 0xd1ee, 0xe8bf, 0xe8c2, 0xbabc, 0xb1ad, 0xbddc, 0xeabd,
  0xe8c3, 0xe8c6, 0xe8cb, 0xe8cc, 0xcbc9, 0xb0e5, 0xbcab, 0xb9b9,
  0xe8c1, 0xcdf7, 0xe8ca, 0xcef6, 0xd5ed, 0xc1d6, 0xe8c4, 0xc3b6,
  0xb9fb, 0xd6a6, 0xe8c8, 0xcae0, 0xd4e6, 0xe8c0, 0xe8c5, 0xe8c7,
  0xc7b9, 0xb7e3, 0xe8c9, 0xbfdd, 0xe8d2, 0xe8d7, 0xe8d5, 0xbcdc,
  0xbccf, 0xe8db, 0xe8de, 0xe8da, 0xb1fa, 0xb0d8, 0xc4b3, 0xb8cc,
  0xc6e2, 0xc8be, 0xc8e1, 0xe8cf, 0xe8d4, 0xe8d6, 0xb9f1, 0xe8d8,
  0xd7f5, 0xc4fb, 0xe8dc, 0xb2e9, 0xe8d1, 0xbced, 0xbfc2, 0xe8cd,
  0xd6f9, 0xc1f8, 0xb2f1, 0xe8df, 0xcac1, 0xe8d9, 0xd5a4, 0xb1ea,
  0xd5bb, 0xe8ce, 0xe8d0, 0xb6b0, 0xe8d3, 0xe8dd, 0xc0b8, 0xcaf7,
  0xcba8, 0xc6dc, 0xc0f5, 0xe8e9, 0xd0a3, 0xe8f2, 0xd6ea, 0xe8e0,
  0xe8e1, 0xd1f9, 0xbacb, 0xb8f9, 0xb8f1, 0xd4d4, 0xe8ef, 0xe8ee,
  0xe8ec, 0xb9f0, 0xccd2, 0xe8e6, 0xcea6, 0xbff2, 0xb0b8, 0xe8f1,
  0xe8f0, 0xd7c0, 0xe8e4, 0xcda9, 0xc9a3, 0xbbb8, 0xbddb, 0xe8ea,
  0xe8e2, 0xe8e3, 0xe8e5, 0xb5b5, 0xe8e7, 0xc7c5, 0xe8eb, 0xe8ed,
  0xbdb0, 0xd7ae, 0xe8f8, 0xe8f5, 0xcdb0, 0xe8f6, 0xc1ba, 0xe8e8,
  0xc3b7, 0xb0f0, 0xe8f4, 0xe8f7, 0xb9a3, 0xc9d2, 0xc3ce, 0xcee0,
  0xc0e6, 0xcbf3, 0xccdd, 0xd0b5, 0xcae1, 0xe8f3, 0xbcec, 0xe8f9,
  0xc3de, 0xc6e5, 0xb9f7, 0xb0f4, 0xd7d8, 0xbcac, 0xc5ef, 0xccc4,
  0xe9a6, 0xc9ad, 0xe9a2, 0xc0e2, 0xbfc3, 0xe8fe, 0xb9d7, 0xe8fb,
  0xe9a4, 0xd2ce, 0xe9a3, 0xd6b2, 0xd7b5, 0xe9a7, 0xbdb7, 0xe8fc,
  0xe8fd, 0xe9a1, 0xcdd6, 0xd2ac, 0xe9b2, 0xe9a9, 0xb4aa, 0xb4bb,
  0xe9ab, 0xd0a8, 0xe9a5, 0xb3fe, 0xe9ac, 0xc0e3, 0xe9aa, 0xe9b9,
  0xe9b8, 0xe9ae, 0xe8fa, 0xe9a8, 0xbfac, 0xe9b1, 0xe9ba, 0xc2a5,
  0xe9af, 0xb8c5, 0xe9ad, 0xd3dc, 0xe9b4, 0xe9b5, 0xe9b7, 0xe9c7,
  0xc0c6, 0xe9c5, 0xe9b0, 0xe9bb, 0xb0f1, 0xe9bc, 0xd5a5, 0xe9be,
  0xe9bf, 0xe9c1, 0xc1f1, 0xc8b6, 0xe9bd, 0xe9c2, 0xe9c3, 0xe9b3,
  0xe9b6, 0xbbb1, 0xe9c0, 0xbcf7, 0xe9c4, 0xe9c6, 0xe9ca, 0xe9ce,
  0xb2db, 0xe9c8, 0xb7ae, 0xe9cb, 0xe9cc, 0xd5c1, 0xc4a3, 0xe9d8,
  0xbae1, 0xe9c9, 0xd3a3, 0xe9d4, 0xe9d7, 0xe9d0, 0xe9cf, 0xc7c1,
  0xe9d2, 0xe9d9, 0xb3c8, 0xe9d3, 0xcff0, 0xe9cd, 0xb3f7, 0xe9d6,
  0xe9da, 0xccb4, 0xcfad, 0xe9d5, 0xe9dc, 0xe9db, 0xe9de, 0xe9d1,
  0xe9dd, 0xe9df, 0xc3ca, 0xc7b7, 0xb4ce, 0xbbb6, 0xd0c0, 0xeca3,
  0xc5b7, 0xd3fb, 0xeca4, 0xeca5, 0xc6db, 0xbfee, 0xeca6, 0xeca7,
  0xd0aa, 0xc7b8, 0xb8e8, 0xeca8, 0xd6b9, 0xd5fd, 0xb4cb, 0xb2bd,
  0xcee4, 0xc6e7, 0xcde1, 0xb4f5, 0xcbc0, 0xbcdf, 0xe9e2, 0xe9e3,
  0xd1ea, 0xe9e5, 0xb4f9, 0xe9e4, 0xd1b3, 0xcae2, 0xb2d0, 0xe9e8,
  0xe9e6, 0xe9e7, 0xd6b3, 0xe9e9, 0xe9ea, 0xe9eb, 0xe9ec, 0xecaf,
  0xc5b9, 0xb6ce, 0xd2f3, 0xb5ee, 0xbbd9, 0xecb1, 0xd2e3, 0xcee3,
  0xc4b8, 0xc3bf, 0xb6be, 0xd8b9, 0xb1c8, 0xb1cf, 0xb1d1, 0xc5fe,
  0xb1d0, 0xc3ab, 0xd5b1, 0xeba4, 0xbac1, 0xccba, 0xeba5, 0xeba7,
  0xeba8, 0xeba6, 0xeba9, 0xebab, 0xebaa, 0xebac, 0xcacf, 0xd8b5,
  0xc3f1, 0xc3a5, 0xc6f8, 0xebad, 0xc4ca, 0xebae, 0xebaf, 0xebb0,
  0xb7d5, 0xb7fa, 0xebb1, 0xc7e2, 0xebb3, 0xbaa4, 0xd1f5, 0xb0b1,
  0xebb2, 0xebb4, 0xb5aa, 0xc2c8, 0xc7e8, 0xebb5, 0xcbae, 0xe3df,
  0xd3c0, 0xd9db, 0xcda1, 0xd6ad, 0xc7f3, 0xd9e0, 0xbbe3, 0xbaba,
  0xe3e2, 0xcfab, 0xe3e0, 0xc9c7, 0xbab9, 0xd1b4, 0xe3e1, 0xc8ea,
  0xb9af, 0xbdad, 0xb3d8, 0xcedb, 0xccc0, 0xe3e8, 0xe3e9, 0xcdf4,
  0xccad, 0xbcb3, 0xe3ea, 0xe3eb, 0xd0da, 0xc6fb, 0xb7da, 0xc7df,
  0xd2ca, 0xced6, 0xe3e4, 0xe3ec, 0xc9f2, 0xb3c1, 0xe3e7, 0xc6e3,
  0xe3e5, 0xedb3, 0xe3e6, 0xc9b3, 0xc5e6, 0xb9b5, 0xc3bb, 0xe3e3,
  0xc5bd, 0xc1a4, 0xc2d9, 0xb2d7, 0xe3ed, 0xbba6, 0xc4ad, 0xe3f0,
  0xbeda, 0xe3fb, 0xe3f5, 0xbad3, 0xb7d0, 0xd3cd, 0xd6ce, 0xd5d3,
  0xb9c1, 0xd5b4, 0xd1d8, 0xd0b9, 0xc7f6, 0xc8aa, 0xb2b4, 0xc3da,
  0xe3ee, 0xe3fc, 0xe3ef, 0xb7a8, 0xe3f7, 0xe3f4, 0xb7ba, 0xc5a2,
  0xe3f6, 0xc5dd, 0xb2a8, 0xc6fc, 0xc4e0, 0xd7a2, 0xc0e1, 0xe3f9,
  0xe3fa, 0xe3fd, 0xcca9, 0xe3f3, 0xd3be, 0xb1c3, 0xedb4, 0xe3f1,
  0xe3f2, 0xe3f8, 0xd0ba, 0xc6c3, 0xd4f3, 0xe3fe, 0xbde0, 0xe4a7,
  0xe4a6, 0xd1f3, 0xe4a3, 0xe4a9, 0xc8f7, 0xcfb4, 0xe4a8, 0xe4ae,
  0xc2e5, 0xb6b4, 0xbdf2, 0xe4a2, 0xbae9, 0xe4aa, 0xe4ac, 0xb6fd,
  0xd6de, 0xe4b2, 0xe4ad, 0xe4a1, 0xbbee, 0xcddd, 0xc7a2, 0xc5c9,
  0xc1f7, 0xe4a4, 0xc7b3, 0xbdac, 0xbdbd, 0xe4a5, 0xd7c7, 0xb2e2,
  0xe4ab, 0xbcc3, 0xe4af, 0xbbeb, 0xe4b0, 0xc5a8, 0xe4b1, 0xd5e3,
  0xbfa3, 0xe4ba, 0xe4b7, 0xe4bb, 0xe4bd, 0xc6d6, 0xbac6, 0xc0cb,
  0xb8a1, 0xe4b4, 0xd4a1, 0xbaa3, 0xbdfe, 0xe4bc, 0xcdbf, 0xc4f9,
  0xcffb, 0xc9e6, 0xd3bf, 0xcfd1, 0xe4b3, 0xe4b8, 0xe4b9, 0xcce9,
  0xccce, 0xc0d4, 0xe4b5, 0xc1b0, 0xe4b6, 0xced0, 0xbbc1, 0xb5d3,
  0xc8f3, 0xbda7, 0xd5c7, 0xc9ac, 0xb8a2, 0xe4ca, 0xe4cc, 0xd1c4,
  0xd2ba, 0xbaad, 0xbad4, 0xe4c3, 0xb5ed, 0xd7cd, 0xe4c0, 0xcffd,
  0xe4bf, 0xc1dc, 0xccca, 0xcae7, 0xc4d7, 0xccd4, 0xe4c8, 0xe4c7,
  0xe4c1, 0xe4c4, 0xb5ad, 0xd3d9, 0xe4c6, 0xd2f9, 0xb4e3, 0xbbb4,
  0xc9ee, 0xb4be, 0xbbec, 0xd1cd, 0xcced, 0xedb5, 0xc7e5, 0xd4a8,
  0xe4cb, 0xd7d5, 0xe4c2, 0xbda5, 0xe4c5, 0xd3e6, 0xe4c9, 0xc9f8,
  0xe4be, 0xd3e5, 0xc7fe, 0xb6c9, 0xd4fc, 0xb2b3, 0xe4d7, 0xcec2,
  0xe4cd, 0xcebc, 0xb8db, 0xe4d6, 0xbfca, 0xd3ce, 0xc3ec, 0xc5c8,
  0xe4d8, 0xcdc4, 0xe4cf, 0xe4d4, 0xe4d5, 0xbafe, 0xcfe6, 0xd5bf,
  0xe4d2, 0xe4d0, 0xe4ce, 0xcde5, 0xcaaa, 0xc0a3, 0xbda6, 0xe4d3,
  0xb8c8, 0xe4e7, 0xd4b4, 0xe4db, 0xc1ef, 0xe4e9, 0xd2e7, 0xe4df,
  0xe4e0, 0xcfaa, 0xcbdd, 0xe4da, 0xe4d1, 0xe4e5, 0xc8dc, 0xe4e3,
  0xc4e7, 0xe4e2, 0xe4e1, 0xb3fc, 0xe4e8, 0xb5e1, 0xd7cc, 0xe4e6,
  0xbbac, 0xd7d2, 0xcccf, 0xebf8, 0xe4e4, 0xb9f6, 0xd6cd, 0xe4d9,
  0xe4dc, 0xc2fa, 0xe4de, 0xc2cb, 0xc0c4, 0xc2d0, 0xb1f5, 0xccb2,
  0xb5ce, 0xe4ef, 0xc6af, 0xc6e1, 0xe4f5, 0xc2a9, 0xc0ec, 0xd1dd,
  0xe4ee, 0xc4ae, 0xe4ed, 0xe4f6, 0xe4f4, 0xc2fe, 0xe4dd, 0xe4f0,
  0xcafe, 0xd5c4, 0xe4f1, 0xd1fa, 0xe4eb, 0xe4ec, 0xe4f2, 0xceab,
  0xc5cb, 0xc7b1, 0xc2ba, 0xe4ea, 0xc1ca, 0xccb6, 0xb3b1, 0xe4fb,
  0xe4f3, 0xe4fa, 0xe4fd, 0xe4fc, 0xb3ce, 0xb3ba, 0xe4f7, 0xe4f9,
  0xe4f8, 0xc5ec, 0xc0bd, 0xd4e8, 0xe5a2, 0xb0c4, 0xe5a4, 0xe5a3,
  0xbca4, 0xe5a5, 0xe5a1, 0xe4fe, 0xb1f4, 0xe5a8, 0xe5a9, 0xe5a6,
  0xe5a7, 0xe5aa, 0xc6d9, 0xe5ab, 0xe5ad, 0xe5ac, 0xe5af, 0xe5ae,
  0xb9e0, 0xe5b0, 0xe5b1, 0xbbf0, 0xece1, 0xc3f0, 0xb5c6, 0xbbd2,
  0xc1e9, 0xd4ee, 0xbec4, 0xd7c6, 0xd4d6, 0xb2d3, 0xecbe, 0xeac1,
  0xc2af, 0xb4b6, 0xd1d7, 0xb3b4, 0xc8b2, 0xbfbb, 0xecc0, 0xd6cb,
  0xecbf, 0xecc1, 0xecc5, 0xbee6, 0xccbf, 0xc5da, 0xbebc, 0xecc6,
  0xb1fe, 0xecc4, 0xd5a8, 0xb5e3, 0xecc2, 0xc1b6, 0xb3e3, 0xecc3,
  0xcbb8, 0xc0c3, 0xccfe, 0xc1d2, 0xecc8, 0xbae6, 0xc0d3, 0xd6f2,
  0xd1cc, 0xbfbe, 0xb7b3, 0xc9d5, 0xecc7, 0xbbe2, 0xcccc, 0xbdfd,
  0xc8c8, 0xcfa9, 0xcde9, 0xc5eb, 0xb7e9, 0xd1c9, 0xbab8, 0xecc9,
  0xecca, 0xbbc0, 0xeccb, 0xece2, 0xb1ba, 0xb7d9, 0xbdb9, 0xeccc,
  0xd1e6, 0xeccd, 0xc8bb, 0xecd1, 0xecd3, 0xbbcd, 0xbce5, 0xeccf,
  0xc9b7, 0xc3ba, 0xece3, 0xd5d5, 0xecd0, 0xd6f3, 0xecd2, 0xecce,
  0xecd4, 0xecd5, 0xc9bf, 0xcfa8, 0xd0dc, 0xd1ac, 0xc8db, 0xecd6,
  0xcef5, 0xcaec, 0xecda, 0xecd9, 0xb0be, 0xecd7, 0xecd8, 0xece4,
  0xc8bc, 0xc1c7, 0xecdc, 0xd1e0, 0xecdb, 0xd4ef, 0xecdd, 0xdbc6,
  0xecde, 0xb1ac, 0xecdf, 0xece0, 0xd7a6, 0xc5c0, 0xebbc, 0xb0ae,
  0xbef4, 0xb8b8, 0xd2af, 0xb0d6, 0xb5f9, 0xd8b3, 0xcbac, 0xe3dd,
  0xc6ac, 0xb0e6, 0xc5c6, 0xebb9, 0xebba, 0xebbb, 0xd1c0, 0xc5a3,
  0xeaf2, 0xc4b2, 0xc4b5, 0xc0ce, 0xeaf3, 0xc4c1, 0xceef, 0xeaf0,
  0xeaf4, 0xc9fc, 0xc7a3, 0xccd8, 0xcefe, 0xeaf5, 0xeaf6, 0xcfac,
  0xc0e7, 0xeaf7, 0xb6bf, 0xeaf8, 0xeaf9, 0xeafa, 0xeafb, 0xeaf1,
  0xc8ae, 0xe1eb, 0xb7b8, 0xe1ec, 0xe1ed, 0xd7b4, 0xe1ee, 0xe1ef,
  0xd3cc, 0xe1f1, 0xbff1, 0xe1f0, 0xb5d2, 0xb1b7, 0xe1f3, 0xe1f2,
  0xbafc, 0xe1f4, 0xb9b7, 0xbed1, 0xc4fc, 0xbadd, 0xbdc6, 0xe1f5,
  0xe1f7, 0xb6c0, 0xcfc1, 0xcaa8, 0xe1f6, 0xd5f8, 0xd3fc, 0xe1f8,
  0xe1fc, 0xe1f9, 0xe1fa, 0xc0ea, 0xe1fe, 0xe2a1, 0xc0c7, 0xe1fb,
  0xe1fd, 0xe2a5, 0xc1d4, 0xe2a3, 0xe2a8, 0xb2fe, 0xe2a2, 0xc3cd,
  0xb2c2, 0xe2a7, 0xe2a6, 0xe2a4, 0xe2a9, 0xe2ab, 0xd0c9, 0xd6ed,
  0xc3a8, 0xe2ac, 0xcfd7, 0xe2ae, 0xbaef, 0xe9e0, 0xe2ad, 0xe2aa,
  0xbbab, 0xd4b3, 0xe2b0, 0xe2af, 0xe9e1, 0xe2b1, 0xe2b2, 0xe2b3,
  0xcca1, 0xe2b4, 0xe2b5, 0xd0fe, 0xc2ca, 0xd3f1, 0xcdf5, 0xe7e0,
  0xe7e1, 0xbec1, 0xc2ea, 0xe7e4, 0xe7e3, 0xcde6, 0xc3b5, 0xe7e2,
  0xbbb7, 0xcfd6, 0xc1e1, 0xe7e9, 0xe7e8, 0xe7f4, 0xb2a3, 0xe7ea,
  0xe7e6, 0xe7ec, 0xe7eb, 0xc9ba, 0xd5e4, 0xe7e5, 0xb7a9, 0xe7e7,
  0xe7ee, 0xe7f3, 0xd6e9, 0xe7ed, 0xe7f2, 0xe7f1, 0xb0e0, 0xe7f5,
  0xc7f2, 0xc0c5, 0xc0ed, 0xc1f0, 0xe7f0, 0xe7f6, 0xcbf6, 0xe8a2,
  0xe8a1, 0xd7c1, 0xe7fa, 0xe7f9, 0xe7fb, 0xe7f7, 0xe7fe, 0xe7fd,
  0xe7fc, 0xc1d5, 0xc7d9, 0xc5fd, 0xc5c3, 0xc7ed, 0xe8a3, 0xe8a6,
  0xe8a5, 0xe8a7, 0xbaf7, 0xe7f8, 0xe8a4, 0xc8f0, 0xc9aa, 0xe8a9,
  0xb9e5, 0xd1fe, 0xe8a8, 0xe8aa, 0xe8ad, 0xe8ae, 0xc1a7, 0xe8af,
  0xe8b0, 0xe8ac, 0xe8b4, 0xe8ab, 0xe8b1, 0xe8b5, 0xe8b2, 0xe8b3,
  0xe8b7, 0xe8b6, 0xb9cf, 0xf0ac, 0xf0ad, 0xc6b0, 0xb0ea, 0xc8bf,
  0xcddf, 0xcecd, 0xeab1, 0xeab2, 0xc6bf, 0xb4c9, 0xeab3, 0xd5e7,
  0xddf9, 0xeab4, 0xeab5, 0xeab6, 0xb8ca, 0xdfb0, 0xc9f5, 0xccf0,
  0xc9fa, 0xc9fb, 0xd3c3, 0xcba6, 0xb8a6, 0xf0ae, 0xb1c2, 0xe5b8,
  0xccef, 0xd3c9, 0xbcd7, 0xc9ea, 0xb5e7, 0xc4d0, 0xb5e9, 0xeeae,
  0xbbad, 0xe7de, 0xeeaf, 0xb3a9, 0xeeb2, 0xeeb1, 0xbde7, 0xeeb0,
  0xceb7, 0xc5cf, 0xc1f4, 0xdbce, 0xeeb3, 0xd0f3, 0xc2d4, 0xc6e8,
  0xb7ac, 0xeeb4, 0xb3eb, 0xbbfb, 0xeeb5, 0xe7dc, 0xeeb6, 0xbdae,
  0xf1e2, 0xcae8, 0xd2c9, 0xf0da, 0xf0db, 0xf0dc, 0xc1c6, 0xb8ed,
  0xbece, 0xf0de, 0xc5b1, 0xf0dd, 0xd1f1, 0xf0e0, 0xb0cc, 0xbdea,
  0xd2df, 0xf0df, 0xb4af, 0xb7e8, 0xf0e6, 0xf0e5, 0xc6a3, 0xf0e1,
  0xf0e2, 0xb4c3, 0xf0e3, 0xd5ee, 0xccdb, 0xbed2, 0xbcb2, 0xf0e8,
  0xf0e7, 0xf0e4, 0xb2a1, 0xd6a2, 0xd3b8, 0xbeb7, 0xc8ac, 0xf0ea,
  0xd1f7, 0xd6cc, 0xbadb, 0xf0e9, 0xb6bb, 0xcdb4, 0xc6a6, 0xc1a1,
  0xf0eb, 0xf0ee, 0xf0ed, 0xf0f0, 0xf0ec, 0xbbbe, 0xf0ef, 0xccb5,
  0xf0f2, 0xb3d5, 0xb1d4, 0xf0f3, 0xf0f4, 0xf0f6, 0xb4e1, 0xf0f1,
  0xf0f7, 0xf0fa, 0xf0f8, 0xf0f5, 0xf0fd, 0xf0f9, 0xf0fc, 0xf0fe,
  0xf1a1, 0xcec1, 0xf1a4, 0xf1a3, 0xc1f6, 0xf0fb, 0xcadd, 0xb4f1,
  0xb1f1, 0xccb1, 0xf1a6, 0xf1a7, 0xf1ac, 0xd5ce, 0xf1a9, 0xc8b3,
  0xf1a2, 0xf1ab, 0xf1a8, 0xf1a5, 0xf1aa, 0xb0a9, 0xf1ad, 0xf1af,
  0xf1b1, 0xf1b0, 0xf1ae, 0xd1a2, 0xf1b2, 0xf1b3, 0xb9ef, 0xb5c7,
  0xb0d7, 0xb0d9, 0xd4ed, 0xb5c4, 0xbdd4, 0xbbca, 0xf0a7, 0xb8de,
  0xf0a8, 0xb0a8, 0xf0a9, 0xcdee, 0xf0aa, 0xf0ab, 0xc6a4, 0xd6e5,
  0xf1e4, 0xf1e5, 0xc3f3, 0xd3db, 0xd6d1, 0xc5e8, 0xd3af, 0xd2e6,
  0xeec1, 0xb0bb, 0xd5b5, 0xd1ce, 0xbce0, 0xbad0, 0xbff8, 0xb8c7,
  0xb5c1, 0xc5cc, 0xcaa2, 0xc3cb, 0xeec2, 0xc4bf, 0xb6a2, 0xedec,
  0xc3a4, 0xd6b1, 0xcfe0, 0xedef, 0xc5ce, 0xb6dc, 0xcaa1, 0xeded,
  0xedf0, 0xedf1, 0xc3bc, 0xbfb4, 0xedee, 0xedf4, 0xedf2, 0xd5e6,
  0xc3df, 0xedf3, 0xedf6, 0xd5a3, 0xd1a3, 0xedf5, 0xc3d0, 0xedf7,
  0xbff4, 0xbeec, 0xedf8, 0xccf7, 0xd1db, 0xd7c5, 0xd5f6, 0xedfc,
  0xedfb, 0xedf9, 0xedfa, 0xedfd, 0xbea6, 0xcbaf, 0xeea1, 0xb6bd,
  0xeea2, 0xc4c0, 0xedfe, 0xbdde, 0xb2c7, 0xb6c3, 0xeea5, 0xd8ba,
  0xeea3, 0xeea6, 0xc3e9, 0xb3f2, 0xeea7, 0xeea4, 0xcfb9, 0xeea8,
  0xc2f7, 0xeea9, 0xeeaa, 0xdeab, 0xc6b3, 0xc7c6, 0xd6f5, 0xb5c9,
  0xcbb2, 0xeeab, 0xcdab, 0xeeac, 0xd5b0, 0xeead, 0xf6c4, 0xdbc7,
  0xb4a3, 0xc3ac, 0xf1e6, 0xcab8, 0xd2d3, 0xd6aa, 0xeff2, 0xbed8,
  0xbdc3, 0xeff3, 0xb6cc, 0xb0ab, 0xcaaf, 0xedb6, 0xedb7, 0xcef9,
  0xb7af, 0xbff3, 0xedb8, 0xc2eb, 0xc9b0, 0xedb9, 0xc6f6, 0xbfb3,
  0xedbc, 0xc5f8, 0xd1d0, 0xd7a9, 0xedba, 0xedbb, 0xd1e2, 0xedbf,
  0xedc0, 0xedc4, 0xedc8, 0xedc6, 0xedce, 0xd5e8, 0xedc9, 0xedc7,
  0xedbe, 0xc5e9, 0xc6c6, 0xc9e9, 0xd4d2, 0xedc1, 0xedc2, 0xedc3,
  0xedc5, 0xc0f9, 0xb4a1, 0xb9e8, 0xedd0, 0xedd1, 0xedca, 0xedcf,
  0xcef8, 0xcbb6, 0xedcc, 0xedcd, 0xcff5, 0xedd2, 0xc1f2, 0xd3b2,
  0xedcb, 0xc8b7, 0xbcef, 0xc5f0, 0xedd6, 0xb5ef, 0xc2b5, 0xb0ad,
  0xcbe9, 0xb1ae, 0xedd4, 0xcdeb, 0xb5e2, 0xedd5, 0xedd3, 0xedd7,
  0xb5fa, 0xedd8, 0xedd9, 0xeddc, 0xb1cc, 0xc5f6, 0xbcee, 0xedda,
  0xccbc, 0xb2ea, 0xeddb, 0xc4eb, 0xb4c5, 0xb0f5, 0xeddf, 0xc0da,
  0xb4e8, 0xc5cd, 0xeddd, 0xbfc4, 0xedde, 0xc4a5, 0xede0, 0xede1,
  0xede3, 0xc1d7, 0xbbc7, 0xbdb8, 0xede2, 0xede4, 0xede6, 0xede5,
  0xede7, 0xcabe, 0xecea, 0xc0f1, 0xc9e7, 0xeceb, 0xc6ee, 0xecec,
  0xc6ed, 0xeced, 0xecf0, 0xd7e6, 0xecf3, 0xecf1, 0xecee, 0xecef,
  0xd7a3, 0xc9f1, 0xcbee, 0xecf4, 0xecf2, 0xcfe9, 0xecf6, 0xc6b1,
  0xbcc0, 0xecf5, 0xb5bb, 0xbbf6, 0xecf7, 0xd9f7, 0xbdfb, 0xc2bb,
  0xecf8, 0xecf9, 0xb8a3, 0xecfa, 0xecfb, 0xecfc, 0xd3ed, 0xd8ae,
  0xc0eb, 0xc7dd, 0xbacc, 0xd0e3, 0xcbbd, 0xcdba, 0xb8d1, 0xb1fc,
  0xc7ef, 0xd6d6, 0xbfc6, 0xc3eb, 0xeff5, 0xc3d8, 0xd7e2, 0xeff7,
  0xb3d3, 0xc7d8, 0xd1ed, 0xd6c8, 0xeff8, 0xeff6, 0xbbfd, 0xb3c6,
  0xbdd5, 0xd2c6, 0xbbe0, 0xcfa1, 0xeffc, 0xeffb, 0xeff9, 0xb3cc,
  0xc9d4, 0xcbb0, 0xeffe, 0xb0de, 0xd6c9, 0xeffd, 0xb3ed, 0xf6d5,
  0xcec8, 0xf0a2, 0xf0a1, 0xb5be, 0xbcda, 0xbbfc, 0xb8e5, 0xc4c2,
  0xf0a3, 0xcbeb, 0xf0a6, 0xd1a8, 0xbebf, 0xc7ee, 0xf1b6, 0xf1b7,
  0xbfd5, 0xb4a9, 0xf1b8, 0xcdbb, 0xc7d4, 0xd5ad, 0xf1b9, 0xf1ba,
  0xc7cf, 0xd2a4, 0xd6cf, 0xf1bb, 0xbdd1, 0xb4b0, 0xbebd, 0xb4dc,
  0xced1, 0xbfdf, 0xf1bd, 0xbffa, 0xf1bc, 0xf1bf, 0xf1be, 0xf1c0,
  0xf1c1, 0xc1fe, 0xc1a2, 0xcafa, 0xd5be, 0xbeba, 0xbeb9, 0xd5c2,
  0xbfa2, 0xcdaf, 0xf1b5, 0xbddf, 0xb6cb, 0xd6f1, 0xf3c3, 0xf3c4,
  0xb8cd, 0xf3c6, 0xf3c7, 0xb0ca, 0xf3c5, 0xf3c9, 0xcbf1, 0xf3cb,
  0xd0a6, 0xb1ca, 0xf3c8, 0xf3cf, 0xb5d1, 0xf3d7, 0xf3d2, 0xf3d4,
  0xf3d3, 0xb7fb, 0xb1bf, 0xf3ce, 0xf3ca, 0xb5da, 0xf3d0, 0xf3d1,
  0xf3d5, 0xf3cd, 0xbce3, 0xc1fd, 0xf3d6, 0xf3da, 0xf3cc, 0xb5c8,
  0xbdee, 0xf3dc, 0xb7a4, 0xbff0, 0xd6fe, 0xcdb2, 0xb4f0, 0xb2df,
  0xf3d8, 0xf3d9, 0xc9b8, 0xf3dd, 0xf3de, 0xf3e1, 0xf3df, 0xf3e3,
  0xf3e2, 0xf3db, 0xbfea, 0xb3ef, 0xf3e0, 0xc7a9, 0xbcf2, 0xf3eb,
  0xb9bf, 0xf3e4, 0xb2ad, 0xbbfe, 0xcbe3, 0xf3ed, 0xf3e9, 0xb9dc,
  0xf3ee, 0xf3e5, 0xf3e6, 0xf3ea, 0xc2e1, 0xf3ec, 0xf3ef, 0xf3e8,
  0xbcfd, 0xcfe4, 0xf3f0, 0xf3e7, 0xf3f2, 0xd7ad, 0xc6aa, 0xf3f3,
  0xf3f1, 0xc2a8, 0xb8dd, 0xf3f5, 0xf3f4, 0xb4db, 0xf3f6, 0xf3f7,
  0xf3f8, 0xc0ba, 0xc0e9, 0xc5f1, 0xf3fb, 0xf3fa, 0xb4d8, 0xf3fe,
  0xf3f9, 0xf3fc, 0xf3fd, 0xf4a1, 0xf4a3, 0xbbc9, 0xf4a2, 0xf4a4,
  0xb2be, 0xf4a6, 0xf4a5, 0xbcae, 0xc3d7, 0xd9e1, 0xc0e0, 0xf4cc,
  0xd7d1, 0xb7db, 0xf4ce, 0xc1a3, 0xc6c9, 0xb4d6, 0xd5b3, 0xf4d0,
  0xf4cf, 0xf4d1, 0xcbda, 0xf4d2, 0xd4c1, 0xd6e0, 0xb7e0, 0xc1b8,
  0xc1bb, 0xf4d3, 0xbeac, 0xb4e2, 0xf4d4, 0xf4d5, 0xbeab, 0xf4d6,
  0xf4db, 0xf4d7, 0xf4da, 0xbafd, 0xf4d8, 0xf4d9, 0xb8e2, 0xccc7,
  0xf4dc, 0xb2da, 0xc3d3, 0xd4e3, 0xbfb7, 0xf4dd, 0xc5b4, 0xf4e9,
  0xcfb5, 0xcec9, 0xcbd8, 0xcbf7, 0xbdf4, 0xd7cf, 0xc0db, 0xd0f5,
  0xf4ea, 0xf4eb, 0xf4ec, 0xf7e3, 0xb7b1, 0xf4ed, 0xd7eb, 0xf4ee,
  0xe6f9, 0xbec0, 0xe6fa, 0xbaec, 0xe6fb, 0xcfcb, 0xe6fc, 0xd4bc,
  0xbcb6, 0xe6fd, 0xe6fe, 0xbccd, 0xc8d2, 0xceb3, 0xe7a1, 0xb4bf,
  0xe7a2, 0xc9b4, 0xb8d9, 0xc4c9, 0xd7dd, 0xc2da, 0xb7d7, 0xd6bd,
  0xcec6, 0xb7c4, 0xc5a6, 0xe7a3, 0xcfdf, 0xe7a4, 0xe7a5, 0xe7a6,
  0xc1b7, 0xd7e9, 0xc9f0, 0xcfb8, 0xd6af, 0xd6d5, 0xe7a7, 0xb0ed,
  0xe7a8, 0xe7a9, 0xc9dc, 0xd2ef, 0xbead, 0xe7aa, 0xb0f3, 0xc8de,
  0xbde1, 0xe7ab, 0xc8c6, 0xe7ac, 0xbbe6, 0xb8f8, 0xd1a4, 0xe7ad,
  0xc2e7, 0xbef8, 0xbdca, 0xcdb3, 0xe7ae, 0xe7af, 0xbeee, 0xd0e5,
  0xcbe7, 0xccd0, 0xbccc, 0xe7b0, 0xbca8, 0xd0f7, 0xe7b1, 0xd0f8,
  0xe7b2, 0xe7b3, 0xb4c2, 0xe7b4, 0xe7b5, 0xc9fe, 0xceac, 0xc3e0,
  0xe7b7, 0xb1c1, 0xb3f1, 0xe7b8, 0xe7b9, 0xd7db, 0xd5c0, 0xe7ba,
  0xc2cc, 0xd7ba, 0xe7bb, 0xe7bc, 0xe7bd, 0xbcea, 0xc3e5, 0xc0c2,
  0xe7be, 0xe7bf, 0xbca9, 0xe7c0, 0xe7c1, 0xe7b6, 0xb6d0, 0xe7c2,
  0xe7c3, 0xe7c4, 0xbbba, 0xb5de, 0xc2c6, 0xb1e0, 0xe7c5, 0xd4b5,
  0xe7c6, 0xb8bf, 0xe7c8, 0xe7c7, 0xb7ec, 0xe7c9, 0xb2f8, 0xe7ca,
  0xe7cb, 0xe7cc, 0xe7cd, 0xe7ce, 0xe7cf, 0xe7d0, 0xd3a7, 0xcbf5,
  0xe7d1, 0xe7d2, 0xe7d3, 0xe7d4, 0xc9c9, 0xe7d5, 0xe7d6, 0xe7d7,
  0xe7d8, 0xe7d9, 0xbdc9, 0xe7da, 0xf3be, 0xb8d7, 0xc8b1, 0xf3bf,
  0xf3c0, 0xf3c1, 0xb9de, 0xcdf8, 0xd8e8, 0xbab1, 0xc2de, 0xeeb7,
  0xb7a3, 0xeeb9, 0xeeb8, 0xb0d5, 0xeebb, 0xd5d6, 0xd7ef, 0xd6c3,
  0xeebd, 0xcaf0, 0xeebc, 0xeebe, 0xeec0, 0xeebf, 0xd1f2, 0xc7bc,
  0xc3c0, 0xb8e1, 0xc1e7, 0xf4c6, 0xd0df, 0xf4c7, 0xcfdb, 0xc8ba,
  0xf4c8, 0xf4c9, 0xf4ca, 0xf4cb, 0xd9fa, 0xb8fe, 0xe5f1, 0xd3f0,
  0xf4e0, 0xcecc, 0xb3e1, 0xf1b4, 0xd2ee, 0xf4e1, 0xcfe8, 0xf4e2,
  0xc7cc, 0xb5d4, 0xb4e4, 0xf4e4, 0xf4e3, 0xf4e5, 0xf4e6, 0xf4e7,
  0xbab2, 0xb0bf, 0xf4e8, 0xb7ad, 0xd2ed, 0xd2ab, 0xc0cf, 0xbfbc,
  0xeba3, 0xd5df, 0xeac8, 0xf1f3, 0xb6f8, 0xcba3, 0xc4cd, 0xf1e7,
  0xf1e8, 0xb8fb, 0xf1e9, 0xbac4, 0xd4c5, 0xb0d2, 0xf1ea, 0xf1eb,
  0xf1ec, 0xf1ed, 0xf1ee, 0xf1ef, 0xf1f1, 0xf1f0, 0xc5d5, 0xf1f2,
  0xb6fa, 0xf1f4, 0xd2ae, 0xdec7, 0xcbca, 0xb3dc, 0xb5a2, 0xb9a2,
  0xc4f4, 0xf1f5, 0xf1f6, 0xc1c4, 0xc1fb, 0xd6b0, 0xf1f7, 0xf1f8,
  0xc1aa, 0xc6b8, 0xbedb, 0xf1f9, 0xb4cf, 0xf1fa, 0xedb2, 0xedb1,
  0xcbe0, 0xd2de, 0xcbc1, 0xd5d8, 0xc8e2, 0xc0df, 0xbca1, 0xebc1,
  0xd0a4, 0xd6e2, 0xb6c7, 0xb8d8, 0xebc0, 0xb8ce, 0xebbf, 0xb3a6,
  0xb9c9, 0xd6ab, 0xb7f4, 0xb7ca, 0xbce7, 0xb7be, 0xebc6, 0xebc7,
  0xb0b9, 0xbfcf, 0xebc5, 0xd3fd, 0xebc8, 0xebc9, 0xb7ce, 0xebc2,
  0xebc4, 0xc9f6, 0xd6d7, 0xd5cd, 0xd0b2, 0xebcf, 0xceb8, 0xebd0,
  0xb5a8, 0xb1b3, 0xebd2, 0xcca5, 0xc5d6, 0xebd3, 0xebd1, 0xc5df,
  0xebce, 0xcaa4, 0xebd5, 0xb0fb, 0xbafa, 0xd8b7, 0xf1e3, 0xebca,
  0xebcb, 0xebcc, 0xebcd, 0xebd6, 0xe6c0, 0xebd9, 0xbfe8, 0xd2c8,
  0xebd7, 0xebdc, 0xb8ec, 0xebd8, 0xbdba, 0xd0d8, 0xb0b7, 0xebdd,
  0xc4dc, 0xd6ac, 0xb4e0, 0xc2f6, 0xbcb9, 0xebda, 0xebdb, 0xd4e0,
  0xc6ea, 0xc4d4, 0xebdf, 0xc5a7, 0xd9f5, 0xb2b1, 0xebe4, 0xbdc5,
  0xebe2, 0xebe3, 0xb8ac, 0xcdd1, 0xebe5, 0xebe1, 0xc1b3, 0xc6a2,
  0xccf3, 0xebe6, 0xc0b0, 0xd2b8, 0xebe7, 0xb8af, 0xb8ad, 0xebe8,
  0xc7bb, 0xcdf3, 0xebea, 0xebeb, 0xebed, 0xd0c8, 0xebf2, 0xebee,
  0xebf1, 0xc8f9, 0xd1fc, 0xebec, 0xebe9, 0xb8b9, 0xcfd9, 0xc4e5,
  0xebef, 0xebf0, 0xccda, 0xcdc8, 0xb0f2, 0xebf6, 0xebf5, 0xb2b2,
  0xb8e0, 0xebf7, 0xb1ec, 0xccc5, 0xc4a4, 0xcfa5, 0xebf9, 0xeca2,
  0xc5f2, 0xebfa, 0xc9c5, 0xe2df, 0xebfe, 0xcdce, 0xeca1, 0xb1db,
  0xd3b7, 0xd2dc, 0xebfd, 0xebfb, 0xb3bc, 0xeab0, 0xd7d4, 0xf4ab,
  0xb3f4, 0xd6c1, 0xd6c2, 0xd5e9, 0xbeca, 0xf4a7, 0xd2a8, 0xf4a8,
  0xf4a9, 0xf4aa, 0xbecb, 0xd3df, 0xc9e0, 0xc9e1, 0xf3c2, 0xcae6,
  0xccf2, 0xe2b6, 0xcbb4, 0xcee8, 0xd6db, 0xf4ad, 0xf4ae, 0xf4af,
  0xf4b2, 0xbabd, 0xf4b3, 0xb0e3, 0xf4b0, 0xf4b1, 0xbda2, 0xb2d5,
  0xf4b6, 0xf4b7, 0xb6e6, 0xb2b0, 0xcfcf, 0xf4b4, 0xb4ac, 0xf4b5,
  0xf4b8, 0xf4b9, 0xcda7, 0xf4ba, 0xf4bb, 0xf4bc, 0xcbd2, 0xf4bd,
  0xf4be, 0xf4bf, 0xf4de, 0xc1bc, 0xbce8, 0xc9ab, 0xd1de, 0xe5f5,
  0xdcb3, 0xd2d5, 0xdcb4, 0xb0ac, 0xdcb5, 0xbdda, 0xdcb9, 0xd8c2,
  0xdcb7, 0xd3f3, 0xc9d6, 0xdcba, 0xdcb6, 0xdcbb, 0xc3a2, 0xdcbc,
  0xdcc5, 0xdcbd, 0xcedf, 0xd6a5, 0xdccf, 0xdccd, 0xdcd2, 0xbde6,
  0xc2ab, 0xdcb8, 0xdccb, 0xdcce, 0xdcbe, 0xb7d2, 0xb0c5, 0xdcc7,
  0xd0be, 0xdcc1, 0xbba8, 0xb7bc, 0xdccc, 0xdcc6, 0xdcbf, 0xc7db,
  0xd1bf, 0xdcc0, 0xdcca, 0xdcd0, 0xcead, 0xdcc2, 0xdcc3, 0xdcc8,
  0xdcc9, 0xb2d4, 0xdcd1, 0xcbd5, 0xd4b7, 0xdcdb, 0xdcdf, 0xcca6,
  0xdce6, 0xc3e7, 0xdcdc, 0xbfc1, 0xdcd9, 0xb0fa, 0xb9b6, 0xdce5,
  0xdcd3, 0xdcc4, 0xdcd6, 0xc8f4, 0xbfe0, 0xc9bb, 0xb1bd, 0xd3a2,
  0xdcda, 0xdcd5, 0xc6bb, 0xdcde, 0xd7c2, 0xc3af, 0xb7b6, 0xc7d1,
  0xc3a9, 0xdce2, 0xdcd8, 0xdceb, 0xdcd4, 0xdcdd, 0xbea5, 0xdcd7,
  0xdce0, 0xdce3, 0xdce4, 0xdcf8, 0xdce1, 0xdda2, 0xdce7, 0xbceb,
  0xb4c4, 0xc3a3, 0xb2e7, 0xdcfa, 0xdcf2, 0xdcef, 0xdcfc, 0xdcee,
  0xd2f0, 0xb2e8, 0xc8d7, 0xc8e3, 0xdcfb, 0xdced, 0xdcf7, 0xdcf5,
  0xbea3, 0xdcf4, 0xb2dd, 0xdcf3, 0xbcf6, 0xdce8, 0xbbc4, 0xc0f3,
  0xbcd4, 0xdce9, 0xdcea, 0xdcf1, 0xdcf6, 0xdcf9, 0xb5b4, 0xc8d9,
  0xbbe7, 0xdcfe, 0xdcfd, 0xd3ab, 0xdda1, 0xdda3, 0xdda5, 0xd2f1,
  0xdda4, 0xdda6, 0xdda7, 0xd2a9, 0xbac9, 0xdda9, 0xddb6, 0xddb1,
  0xddb4, 0xddb0, 0xc6ce, 0xc0f2, 0xc9af, 0xdcec, 0xddae, 0xddb7,
  0xdcf0, 0xddaf, 0xddb8, 0xddac, 0xddb9, 0xddb3, 0xddad, 0xc4aa,
  0xdda8, 0xc0b3, 0xc1ab, 0xddaa, 0xddab, 0xddb2, 0xbbf1, 0xddb5,
  0xd3a8, 0xddba, 0xddbb, 0xc3a7, 0xddd2, 0xddbc, 0xddd1, 0xb9bd,
  0xbed5, 0xbefa, 0xbaca, 0xddca, 0xddc5, 0xddbf, 0xb2cb, 0xddc3,
  0xddcb, 0xb2a4, 0xddd5, 0xddbe, 0xc6d0, 0xddd0, 0xddd4, 0xc1e2,
  0xb7c6, 0xddce, 0xddcf, 0xddc4, 0xddbd, 0xddcd, 0xccd1, 0xddc9,
  0xddc2, 0xc3c8, 0xc6bc, 0xceae, 0xddcc, 0xddc8, 0xddc1, 0xddc6,
  0xc2dc, 0xd3a9, 0xd3aa, 0xddd3, 0xcff4, 0xc8f8, 0xdde6, 0xddc7,
  0xdde0, 0xc2e4, 0xdde1, 0xddd7, 0xd6f8, 0xddd9, 0xddd8, 0xb8f0,
  0xddd6, 0xc6cf, 0xb6ad, 0xdde2, 0xbaf9, 0xd4e1, 0xdde7, 0xb4d0,
  0xddda, 0xbffb, 0xdde3, 0xdddf, 0xdddd, 0xb5d9, 0xdddb, 0xdddc,
  0xddde, 0xbdaf, 0xdde4, 0xdde5, 0xddf5, 0xc3c9, 0xcbe2, 0xddf2,
  0xd8e1, 0xc6d1, 0xddf4, 0xd5f4, 0xddf3, 0xddf0, 0xddec, 0xddef,
  0xdde8, 0xd0ee, 0xc8d8, 0xddee, 0xdde9, 0xddea, 0xcbf2, 0xdded,
  0xb1cd, 0xc0b6, 0xbcbb, 0xddf1, 0xddf7, 0xddf6, 0xddeb, 0xc5ee,
  0xddfb, 0xdea4, 0xdea3, 0xddf8, 0xc3ef, 0xc2fb, 0xd5e1, 0xceb5,
  0xddfd, 0xb2cc, 0xc4e8, 0xcadf, 0xc7be, 0xddfa, 0xddfc, 0xddfe,
  0xdea2, 0xb0aa, 0xb1ce, 0xdeac, 0xdea6, 0xbdb6, 0xc8ef, 0xdea1,
  0xdea5, 0xdea9, 0xdea8, 0xdea7, 0xdead, 0xd4cc, 0xdeb3, 0xdeaa,
  0xdeae, 0xc0d9, 0xb1a1, 0xdeb6, 0xdeb1, 0xdeb2, 0xd1a6, 0xdeb5,
  0xdeaf, 0xdeb0, 0xd0bd, 0xdeb4, 0xcaed, 0xdeb9, 0xdeb8, 0xdeb7,
  0xdebb, 0xbde5, 0xb2d8, 0xc3ea, 0xdeba, 0xc5ba, 0xdebc, 0xccd9,
  0xb7aa, 0xd4e5, 0xdebd, 0xdebf, 0xc4a2, 0xdec1, 0xdebe, 0xdec0,
  0xd5ba, 0xdec2, 0xf2ae, 0xbba2, 0xc2b2, 0xc5b0, 0xc2c7, 0xf2af,
  0xd0e9, 0xd3dd, 0xebbd, 0xb3e6, 0xf2b0, 0xf2b1, 0xcaad, 0xbae7,
  0xf2b3, 0xf2b5, 0xf2b4, 0xcbe4, 0xcfba, 0xf2b2, 0xcab4, 0xd2cf,
  0xc2ec, 0xcec3, 0xf2b8, 0xb0f6, 0xf2b7, 0xf2be, 0xb2cf, 0xd1c1,
  0xf2ba, 0xf2bc, 0xd4e9, 0xf2bb, 0xf2b6, 0xf2bf, 0xf2bd, 0xf2b9,
  0xf2c7, 0xf2c4, 0xf2c6, 0xf2ca, 0xf2c2, 0xf2c0, 0xf2c5, 0xd6fb,
  0xf2c1, 0xc7f9, 0xc9df, 0xf2c8, 0xb9c6, 0xb5b0, 0xf2c3, 0xf2c9,
  0xf2d0, 0xf2d6, 0xbbd7, 0xf2d5, 0xcddc, 0xd6eb, 0xf2d2, 0xf2d4,
  0xb8f2, 0xf2cb, 0xf2ce, 0xc2f9, 0xd5dd, 0xf2cc, 0xf2cd, 0xf2cf,
  0xf2d3, 0xf2d9, 0xd3bc, 0xb6ea, 0xcaf1, 0xb7e4, 0xf2d7, 0xf2d8,
  0xf2da, 0xf2dd, 0xf2db, 0xf2dc, 0xd1d1, 0xf2d1, 0xcdc9, 0xcecf,
  0xd6a9, 0xf2e3, 0xc3db, 0xf2e0, 0xc0af, 0xf2ec, 0xf2de, 0xf2e1,
  0xf2e8, 0xf2e2, 0xf2e7, 0xf2e6, 0xf2e9, 0xf2df, 0xf2e4, 0xf2ea,
  0xd3ac, 0xf2e5, 0xb2f5, 0xf2f2, 0xd0ab, 0xf2f5, 0xbbc8, 0xf2f9,
  0xf2f0, 0xf2f6, 0xf2f8, 0xf2fa, 0xf2f3, 0xf2f1, 0xbafb, 0xb5fb,
  0xf2ef, 0xf2f7, 0xf2ed, 0xf2ee, 0xf2eb, 0xf3a6, 0xf3a3, 0xf3a2,
  0xf2f4, 0xc8da, 0xf2fb, 0xf3a5, 0xc3f8, 0xf2fd, 0xf3a7, 0xf3a9,
  0xf3a4, 0xf2fc, 0xf3ab, 0xf3aa, 0xc2dd, 0xf3ae, 0xf3b0, 0xf3a1,
  0xf3b1, 0xf3ac, 0xf3af, 0xf2fe, 0xf3ad, 0xf3b2, 0xf3b4, 0xf3a8,
  0xf3b3, 0xf3b5, 0xd0b7, 0xf3b8, 0xd9f9, 0xf3b9, 0xf3b7, 0xc8e4,
  0xf3b6, 0xf3ba, 0xf3bb, 0xb4c0, 0xeec3, 0xf3bc, 0xf3bd, 0xd1aa,
  0xf4ac, 0xd0c6, 0xd0d0, 0xd1dc, 0xcfce, 0xbdd6, 0xd1c3, 0xbae2,
  0xe1e9, 0xd2c2, 0xf1c2, 0xb2b9, 0xb1ed, 0xf1c3, 0xc9c0, 0xb3c4,
  0xd9f2, 0xcba5, 0xf1c4, 0xd6d4, 0xf1c5, 0xf4c0, 0xf1c6, 0xd4ac,
  0xf1c7, 0xb0c0, 0xf4c1, 0xf4c2, 0xb4fc, 0xc5db, 0xccbb, 0xd0e4,
  0xcde0, 0xf1c8, 0xd9f3, 0xb1bb, 0xcfae, 0xb8a4, 0xf1ca, 0xf1cb,
  0xb2c3, 0xc1d1, 0xd7b0, 0xf1c9, 0xf1cc, 0xf1ce, 0xd9f6, 0xd2e1,
  0xd4a3, 0xf4c3, 0xc8b9, 0xf4c4, 0xf1cd, 0xf1cf, 0xbfe3, 0xf1d0,
  0xf1d4, 0xf1d6, 0xf1d1, 0xc9d1, 0xc5e1, 0xc2e3, 0xb9fc, 0xf1d3,
  0xf1d5, 0xb9d3, 0xf1db, 0xbad6, 0xb0fd, 0xf1d9, 0xf1d8, 0xf1d2,
  0xf1da, 0xf1d7, 0xc8ec, 0xcdca, 0xf1dd, 0xe5bd, 0xf1dc, 0xf1de,
  0xf1df, 0xcfe5, 0xf4c5, 0xbdf3, 0xf1e0, 0xf1e1, 0xcef7, 0xd2aa,
  0xf1fb, 0xb8b2, 0xbcfb, 0xb9db, 0xb9e6, 0xc3d9, 0xcad3, 0xeae8,
  0xc0c0, 0xbef5, 0xeae9, 0xeaea, 0xeaeb, 0xeaec, 0xeaed, 0xeaee,
  0xeaef, 0xbdc7, 0xf5fb, 0xf5fd, 0xf5fe, 0xf5fc, 0xbde2, 0xf6a1,
  0xb4a5, 0xf6a2, 0xf6a3, 0xecb2, 0xd1d4, 0xd9ea, 0xf6a4, 0xeeba,
  0xd5b2, 0xd3fe, 0xccdc, 0xcac4, 0xe5c0, 0xf6a5, 0xbeaf, 0xc6a9,
  0xdaa5, 0xbcc6, 0xb6a9, 0xb8bc, 0xc8cf, 0xbca5, 0xdaa6, 0xdaa7,
  0xccd6, 0xc8c3, 0xdaa8, 0xc6fd, 0xd1b5, 0xd2e9, 0xd1b6, 0xbcc7,
  0xbdb2, 0xbbe4, 0xdaa9, 0xdaaa, 0xd1c8, 0xdaab, 0xd0ed, 0xb6ef,
  0xc2db, 0xcbcf, 0xb7ed, 0xc9e8, 0xb7c3, 0xbef7, 0xd6a4, 0xdaac,
  0xdaad, 0xc6c0, 0xd7e7, 0xcab6, 0xd5a9, 0xcbdf, 0xd5ef, 0xdaae,
  0xd6df, 0xb4ca, 0xdab0, 0xdaaf, 0xd2eb, 0xdab1, 0xdab2, 0xdab3,
  0xcad4, 0xdab4, 0xcaab, 0xdab5, 0xdab6, 0xb3cf, 0xd6ef, 0xdab7,
  0xbbb0, 0xb5ae, 0xdab8, 0xdab9, 0xb9ee, 0xd1af, 0xd2e8, 0xdaba,
  0xb8c3, 0xcfea, 0xb2ef, 0xdabb, 0xdabc, 0xbdeb, 0xcedc, 0xd3ef,
  0xdabd, 0xcef3, 0xdabe, 0xd3d5, 0xbbe5, 0xdabf, 0xcbb5, 0xcbd0,
  0xdac0, 0xc7eb, 0xd6ee, 0xdac1, 0xc5b5, 0xb6c1, 0xdac2, 0xb7cc,
  0xbfce, 0xdac3, 0xdac4, 0xcbad, 0xdac5, 0xb5f7, 0xdac6, 0xc1c2,
  0xd7bb, 0xdac7, 0xccb8, 0xd2ea, 0xc4b1, 0xdac8, 0xb5fd, 0xbbd1,
  0xdac9, 0xd0b3, 0xdaca, 0xdacb, 0xcebd, 0xdacc, 0xdacd, 0xdace,
  0xb2f7, 0xdad1, 0xdacf, 0xd1e8, 0xdad0, 0xc3d5, 0xdad2, 0xdad3,
  0xdad4, 0xdad5, 0xd0bb, 0xd2a5, 0xb0f9, 0xdad6, 0xc7ab, 0xdad7,
  0xbdf7, 0xc3a1, 0xdad8, 0xdad9, 0xc3fd, 0xccb7, 0xdada, 0xdadb,
  0xc0be, 0xc6d7, 0xdadc, 0xdadd, 0xc7b4, 0xdade, 0xdadf, 0xb9c8,
  0xbbed, 0xb6b9, 0xf4f8, 0xf4f9, 0xcde3, 0xf5b9, 0xebe0, 0xcff3,
  0xbbbf, 0xbac0, 0xd4a5, 0xe1d9, 0xf5f4, 0xb1aa, 0xb2f2, 0xf5f5,
  0xf5f7, 0xbad1, 0xf5f6, 0xc3b2, 0xf5f9, 0xf5f8, 0xb1b4, 0xd5ea,
  0xb8ba, 0xb9b1, 0xb2c6, 0xd4f0, 0xcfcd, 0xb0dc, 0xd5cb, 0xbbf5,
  0xd6ca, 0xb7b7, 0xccb0, 0xc6b6, 0xb1e1, 0xb9ba, 0xd6fc, 0xb9e1,
  0xb7a1, 0xbcfa, 0xeada, 0xeadb, 0xccf9, 0xb9f3, 0xeadc, 0xb4fb,
  0xc3b3, 0xb7d1, 0xbad8, 0xeadd, 0xd4f4, 0xeade, 0xbcd6, 0xbbdf,
  0xeadf, 0xc1de, 0xc2b8, 0xd4df, 0xd7ca, 0xeae0, 0xeae1, 0xeae4,
  0xeae2, 0xeae3, 0xc9de, 0xb8b3, 0xb6c4, 0xeae5, 0xcaea, 0xc9cd,
  0xb4cd, 0xe2d9, 0xc5e2, 0xeae6, 0xc0b5, 0xd7b8, 0xeae7, 0xd7ac,
  0xc8fc, 0xd8d3, 0xd8cd, 0xd4de, 0xd4f9, 0xc9c4, 0xd3ae, 0xb8d3,
  0xb3e0, 0xc9e2, 0xf4f6, 0xbad5, 0xf4f7, 0xd7df, 0xf4f1, 0xb8b0,
  0xd5d4, 0xb8cf, 0xc6f0, 0xb3c3, 0xf4f2, 0xb3ac, 0xd4bd, 0xc7f7,
  0xf4f4, 0xf4f3, 0xcccb, 0xc8a4, 0xf4f5, 0xd7e3, 0xc5bf, 0xf5c0,
  0xf5bb, 0xf5c3, 0xf5c2, 0xd6ba, 0xf5c1, 0xd4be, 0xf5c4, 0xf5cc,
  0xb0cf, 0xb5f8, 0xf5c9, 0xf5ca, 0xc5dc, 0xf5c5, 0xf5c6, 0xf5c7,
  0xf5cb, 0xbee0, 0xf5c8, 0xb8fa, 0xf5d0, 0xf5d3, 0xbfe7, 0xb9f2,
  0xf5bc, 0xf5cd, 0xc2b7, 0xccf8, 0xbcf9, 0xf5ce, 0xf5cf, 0xf5d1,
  0xb6e5, 0xf5d2, 0xf5d5, 0xf5bd, 0xf5d4, 0xd3bb, 0xb3ec, 0xcca4,
  0xf5d6, 0xf5d7, 0xbee1, 0xf5d8, 0xccdf, 0xf5db, 0xb2c8, 0xd7d9,
  0xf5d9, 0xf5da, 0xf5dc, 0xf5e2, 0xf5e0, 0xf5df, 0xf5dd, 0xf5e1,
  0xf5de, 0xf5e4, 0xf5e5, 0xcce3, 0xe5bf, 0xb5b8, 0xf5e3, 0xf5e8,
  0xcca3, 0xf5e6, 0xf5e7, 0xf5be, 0xb1c4, 0xf5bf, 0xb5c5, 0xb2e4,
  0xf5ec, 0xf5e9, 0xb6d7, 0xf5ed, 0xf5ea, 0xf5eb, 0xb4da, 0xd4ea,
  0xf5ee, 0xb3f9, 0xf5ef, 0xf5f1, 0xf5f0, 0xf5f2, 0xf5f3, 0xc9ed,
  0xb9aa, 0xc7fb, 0xb6e3, 0xccc9, 0xeaa6, 0xb3b5, 0xd4fe, 0xb9ec,
  0xd0f9, 0xe9ed, 0xd7aa, 0xe9ee, 0xc2d6, 0xc8ed, 0xbae4, 0xe9ef,
  0xe9f0, 0xe9f1, 0xd6e1, 0xe9f2, 0xe9f3, 0xe9f5, 0xe9f4, 0xe9f6,
  0xe9f7, 0xc7e1, 0xe9f8, 0xd4d8, 0xe9f9, 0xbdce, 0xe9fa, 0xe9fb,
  0xbdcf, 0xe9fc, 0xb8a8, 0xc1be, 0xe9fd, 0xb1b2, 0xbbd4, 0xb9f5,
  0xe9fe, 0xeaa1, 0xeaa2, 0xeaa3, 0xb7f8, 0xbcad, 0xcae4, 0xe0ce,
  0xd4af, 0xcfbd, 0xd5b7, 0xeaa4, 0xd5de, 0xeaa5, 0xd0c1, 0xb9bc,
  0xb4c7, 0xb1d9, 0xc0b1, 0xb1e6, 0xb1e7, 0xb1e8, 0xb3bd, 0xc8e8,
  0xe5c1, 0xb1df, 0xc1c9, 0xb4ef, 0xc7a8, 0xd3d8, 0xc6f9, 0xd1b8,
  0xb9fd, 0xc2f5, 0xd3ad, 0xd4cb, 0xbdfc, 0xe5c2, 0xb7b5, 0xe5c3,
  0xbbb9, 0xd5e2, 0xbdf8, 0xd4b6, 0xcea5, 0xc1ac, 0xb3d9, 0xccf6,
  0xe5c6, 0xe5c4, 0xe5c8, 0xe5ca, 0xe5c7, 0xb5cf, 0xc6c8, 0xb5fc,
  0xe5c5, 0xcaf6, 0xe5c9, 0xc3d4, 0xb1c5, 0xbca3, 0xd7b7, 0xcdcb,
  0xcbcd, 0xcaca, 0xccd3, 0xe5cc, 0xe5cb, 0xc4e6, 0xd1a1, 0xd1b7,
  0xe5cd, 0xe5d0, 0xcdb8, 0xd6f0, 0xe5cf, 0xb5dd, 0xcdbe, 0xe5d1,
  0xb6ba, 0xcda8, 0xb9e4, 0xcac5, 0xb3d1, 0xcbd9, 0xd4ec, 0xe5d2,
  0xb7ea, 0xe5ce, 0xe5d5, 0xb4fe, 0xe5d6, 0xe5d3, 0xe5d4, 0xd2dd,
  0xc2df, 0xb1c6, 0xd3e2, 0xb6dd, 0xcbec, 0xe5d7, 0xd3f6, 0xb1e9,
  0xb6f4, 0xe5da, 0xe5d8, 0xe5d9, 0xb5c0, 0xd2c5, 0xe5dc, 0xe5de,
  0xe5dd, 0xc7b2, 0xd2a3, 0xe5db, 0xd4e2, 0xd5da, 0xe5e0, 0xd7f1,
  0xe5e1, 0xb1dc, 0xd1fb, 0xe5e2, 0xe5e4, 0xe5e3, 0xe5e5, 0xd2d8,
  0xb5cb, 0xe7df, 0xdaf5, 0xdaf8, 0xdaf6, 0xdaf7, 0xdafa, 0xd0cf,
  0xc4c7, 0xb0ee, 0xd0b0, 0xdaf9, 0xd3ca, 0xbaaa, 0xdba2, 0xc7f1,
  0xdafc, 0xdafb, 0xc9db, 0xdafd, 0xdba1, 0xd7de, 0xdafe, 0xc1da,
  0xdba5, 0xd3f4, 0xdba7, 0xdba4, 0xdba8, 0xbdbc, 0xc0c9, 0xdba3,
  0xdba6, 0xd6a3, 0xdba9, 0xdbad, 0xdbae, 0xdbac, 0xbac2, 0xbfa4,
  0xdbab, 0xdbaa, 0xd4c7, 0xb2bf, 0xdbaf, 0xb9f9, 0xdbb0, 0xb3bb,
  0xb5a6, 0xb6bc, 0xdbb1, 0xb6f5, 0xdbb2, 0xb1c9, 0xdbb4, 0xdbb3,
  0xdbb5, 0xdbb7, 0xdbb6, 0xdbb8, 0xdbb9, 0xdbba, 0xd3cf, 0xf4fa,
  0xc7f5, 0xd7c3, 0xc5e4, 0xf4fc, 0xf4fd, 0xf4fb, 0xbec6, 0xd0ef,
  0xb7d3, 0xd4cd, 0xccaa, 0xf5a2, 0xf5a1, 0xbaa8, 0xf4fe, 0xcbd6,
  0xf5a4, 0xc0d2, 0xb3ea, 0xcdaa, 0xf5a5, 0xf5a3, 0xbdb4, 0xf5a8,
  0xf5a9, 0xbdcd, 0xc3b8, 0xbfe1, 0xcbe1, 0xf5aa, 0xf5a6, 0xf5a7,
  0xc4f0, 0xf5ac, 0xb4bc, 0xd7ed, 0xb4d7, 0xf5ab, 0xf5ae, 0xf5ad,
  0xf5af, 0xd0d1, 0xc3d1, 0xc8a9, 0xf5b0, 0xf5b1, 0xf5b2, 0xf5b3,
  0xf5b4, 0xf5b5, 0xf5b7, 0xf5b6, 0xf5b8, 0xb2c9, 0xd3d4, 0xcacd,
  0xc0ef, 0xd6d8, 0xd2b0, 0xc1bf, 0xbdf0, 0xb8aa, 0xbcf8, 0xf6c6,
  0xf6c7, 0xf6c8, 0xf6c9, 0xf6ca, 0xf6cc, 0xf6cb, 0xf7e9, 0xf6cd,
  0xf6ce, 0xeec4, 0xeec5, 0xeec6, 0xd5eb, 0xb6a4, 0xeec8, 0xeec7,
  0xeec9, 0xeeca, 0xc7a5, 0xeecb, 0xeecc, 0xb7b0, 0xb5f6, 0xeecd,
  0xeecf, 0xeece, 0xb8c6, 0xeed0, 0xeed1, 0xeed2, 0xb6db, 0xb3ae,
  0xd6d3, 0xc4c6, 0xb1b5, 0xb8d6, 0xeed3, 0xeed4, 0xd4bf, 0xc7d5,
  0xbefb, 0xced9, 0xb9b3, 0xeed6, 0xeed5, 0xeed8, 0xeed7, 0xc5a5,
  0xeed9, 0xeeda, 0xc7ae, 0xeedb, 0xc7af, 0xeedc, 0xb2a7, 0xeedd,
  0xeede, 0xeedf, 0xeee0, 0xeee1, 0xd7ea, 0xeee2, 0xeee3, 0xbcd8,
  0xeee4, 0xd3cb, 0xccfa, 0xb2ac, 0xc1e5, 0xeee5, 0xc7a6, 0xc3ad,
  0xeee6, 0xeee7, 0xeee8, 0xeee9, 0xeeea, 0xeeeb, 0xeeec, 0xeeed,
  0xeeee, 0xeeef, 0xeef0, 0xeef1, 0xeef2, 0xeef4, 0xeef3, 0xeef5,
  0xcdad, 0xc2c1, 0xeef6, 0xeef7, 0xeef8, 0xd5a1, 0xeef9, 0xcfb3,
  0xeefa, 0xeefb, 0xeefc, 0xeefd, 0xefa1, 0xeefe, 0xefa2, 0xb8f5,
  0xc3fa, 0xefa3, 0xefa4, 0xbdc2, 0xd2bf, 0xb2f9, 0xefa5, 0xefa6,
  0xefa7, 0xd2f8, 0xefa8, 0xd6fd, 0xefa9, 0xc6cc, 0xefaa, 0xefab,
  0xc1b4, 0xefac, 0xcffa, 0xcbf8, 0xefae, 0xefad, 0xb3fa, 0xb9f8,
  0xefaf, 0xefb0, 0xd0e2, 0xefb1, 0xefb2, 0xb7e6, 0xd0bf, 0xefb3,
  0xefb4, 0xefb5, 0xc8f1, 0xcce0, 0xefb6, 0xefb7, 0xefb8, 0xefb9,
  0xefba, 0xd5e0, 0xefbb, 0xb4ed, 0xc3aa, 0xefbc, 0xefbd, 0xefbe,
  0xefbf, 0xcefd, 0xefc0, 0xc2e0, 0xb4b8, 0xd7b6, 0xbdf5, 0xcfc7,
  0xefc3, 0xefc1, 0xefc2, 0xefc4, 0xb6a7, 0xbcfc, 0xbee2, 0xc3cc,
  0xefc5, 0xefc6, 0xefc7, 0xefcf, 0xefc8, 0xefc9, 0xefca, 0xc7c2,
  0xeff1, 0xb6cd, 0xefcb, 0xefcc, 0xefcd, 0xb6c6, 0xc3be, 0xefce,
  0xefd0, 0xefd1, 0xefd2, 0xd5f2, 0xefd3, 0xc4f7, 0xefd4, 0xc4f8,
  0xefd5, 0xefd6, 0xb8e4, 0xb0f7, 0xefd7, 0xefd8, 0xefd9, 0xefda,
  0xefdb, 0xefdc, 0xefdd, 0xefde, 0xbeb5, 0xefe1, 0xefdf, 0xefe0,
  0xefe2, 0xefe3, 0xc1cd, 0xefe4, 0xefe5, 0xefe6, 0xefe7, 0xefe8,
  0xefe9, 0xefea, 0xefeb, 0xefec, 0xc0d8, 0xefed, 0xc1ad, 0xefee,
  0xefef, 0xeff0, 0xcfe2, 0xb3a4, 0xc3c5, 0xe3c5, 0xc9c1, 0xe3c6,
  0xb1d5, 0xceca, 0xb4b3, 0xc8f2, 0xe3c7, 0xcfd0, 0xe3c8, 0xbce4,
  0xe3c9, 0xe3ca, 0xc3c6, 0xd5a2, 0xc4d6, 0xb9eb, 0xcec5, 0xe3cb,
  0xc3f6, 0xe3cc, 0xb7a7, 0xb8f3, 0xbad2, 0xe3cd, 0xe3ce, 0xd4c4,
  0xe3cf, 0xe3d0, 0xd1cb, 0xe3d1, 0xe3d2, 0xe3d3, 0xe3d4, 0xd1d6,
  0xe3d5, 0xb2fb, 0xc0bb, 0xe3d6, 0xc0ab, 0xe3d7, 0xe3d8, 0xe3d9,
  0xe3da, 0xe3db, 0xb8b7, 0xdae2, 0xb6d3, 0xdae4, 0xdae3, 0xdae6,
  0xc8ee, 0xdae5, 0xb7c0, 0xd1f4, 0xd2f5, 0xd5f3, 0xbdd7, 0xd7e8,
  0xdae8, 0xdae7, 0xb0a2, 0xcdd3, 0xdae9, 0xb8bd, 0xbcca, 0xc2bd,
  0xc2a4, 0xb3c2, 0xdaea, 0xc2aa, 0xc4b0, 0xbdb5, 0xcfde, 0xdaeb,
  0xc9c2, 0xb1dd, 0xdaec, 0xb6b8, 0xd4ba, 0xb3fd, 0xdaed, 0xd4c9,
  0xcfd5, 0xc5e3, 0xdaee, 0xdaef, 0xdaf0, 0xc1ea, 0xccd5, 0xcfdd,
  0xd3e7, 0xc2a1, 0xdaf1, 0xcbe5, 0xdaf2, 0xcbe6, 0xd2fe, 0xb8f4,
  0xdaf3, 0xb0af, 0xcfb6, 0xd5cf, 0xcbed, 0xdaf4, 0xe3c4, 0xc1a5,
  0xf6bf, 0xf6c0, 0xf6c1, 0xc4d1, 0xc8b8, 0xd1e3, 0xd0db, 0xd1c5,
  0xbcaf, 0xb9cd, 0xeff4, 0xb4c6, 0xd3ba, 0xf6c2, 0xb3fb, 0xf6c3,
  0xb5f1, 0xf6c5, 0xd3ea, 0xf6a7, 0xd1a9, 0xf6a9, 0xf6a8, 0xc1e3,
  0xc0d7, 0xb1a2, 0xceed, 0xd0e8, 0xf6ab, 0xcff6, 0xf6aa, 0xd5f0,
  0xf6ac, 0xc3b9, 0xbbf4, 0xf6ae, 0xf6ad, 0xc4de, 0xc1d8, 0xcbaa,
  0xcfbc, 0xf6af, 0xf6b0, 0xf6b1, 0xc2b6, 0xb0d4, 0xc5f9, 0xf6b2,
  0xc7e0, 0xf6a6, 0xbeb8, 0xbeb2, 0xb5e5, 0xb7c7, 0xbfbf, 0xc3d2,
  0xc3e6, 0xd8cc, 0xb8ef, 0xbdf9, 0xd1a5, 0xb0d0, 0xf7b0, 0xf7b1,
  0xd0ac, 0xb0b0, 0xf7b2, 0xf7b3, 0xf7b4, 0xc7ca, 0xbecf, 0xf7b7,
  0xf7b6, 0xb1de, 0xf7b5, 0xf7b8, 0xf7b9, 0xcea4, 0xc8cd, 0xbaab,
  0xe8b8, 0xe8b9, 0xe8ba, 0xbec2, 0xd2f4, 0xd4cf, 0xc9d8, 0xd2b3,
  0xb6a5, 0xc7ea, 0xf1fc, 0xcfee, 0xcbb3, 0xd0eb, 0xe7ef, 0xcde7,
  0xb9cb, 0xb6d9, 0xf1fd, 0xb0e4, 0xcbcc, 0xf1fe, 0xd4a4, 0xc2ad,
  0xc1ec, 0xc6c4, 0xbeb1, 0xf2a1, 0xbcd5, 0xf2a2, 0xf2a3, 0xf2a4,
  0xd2c3, 0xc6b5, 0xcdc7, 0xf2a5, 0xd3b1, 0xbfc5, 0xcce2, 0xf2a6,
  0xf2a7, 0xd1d5, 0xb6ee, 0xf2a8, 0xf2a9, 0xb5df, 0xf2aa, 0xf2ab,
  0xb2fc, 0xf2ac, 0xf2ad, 0xc8a7, 0xb7e7, 0xeca9, 0xecaa, 0xecab,
  0xecac, 0xc6ae, 0xecad, 0xecae, 0xb7c9, 0xcab3, 0xe2b8, 0xf7cf,
  0xf7d0, 0xb2cd, 0xf7d1, 0xf7d3, 0xf7d2, 0xe2bb, 0xbca2, 0xe2bc,
  0xe2bd, 0xe2be, 0xe2bf, 0xe2c0, 0xe2c1, 0xb7b9, 0xd2fb, 0xbda4,
  0xcace, 0xb1a5, 0xcbc7, 0xe2c2, 0xb6fc, 0xc8c4, 0xe2c3, 0xbdc8,
  0xb1fd, 0xe2c4, 0xb6f6, 0xe2c5, 0xc4d9, 0xe2c6, 0xcfda, 0xb9dd,
  0xe2c7, 0xc0a1, 0xe2c8, 0xb2f6, 0xe2c9, 0xc1f3, 0xe2ca, 0xe2cb,
  0xc2f8, 0xe2cc, 0xe2cd, 0xe2ce, 0xcad7, 0xd8b8, 0xd9e5, 0xcfe3,
  0xf0a5, 0xdcb0, 0xc2ed, 0xd4a6, 0xcdd4, 0xd1b1, 0xb3db, 0xc7fd,
  0xb2b5, 0xc2bf, 0xe6e0, 0xcabb, 0xe6e1, 0xe6e2, 0xbed4, 0xe6e3,
  0xd7a4, 0xcdd5, 0xe6e5, 0xbcdd, 0xe6e4, 0xe6e6, 0xe6e7, 0xc2ee,
  0xbdbe, 0xe6e8, 0xc2e6, 0xbaa7, 0xe6e9, 0xe6ea, 0xb3d2, 0xd1e9,
  0xbfa5, 0xe6eb, 0xc6ef, 0xe6ec, 0xe6ed, 0xe6ee, 0xc6ad, 0xe6ef,
  0xc9a7, 0xe6f0, 0xe6f1, 0xe6f2, 0xe5b9, 0xe6f3, 0xe6f4, 0xc2e2,
  0xe6f5, 0xe6f6, 0xd6e8, 0xe6f7, 0xe6f8, 0xb9c7, 0xf7bb, 0xf7ba,
  0xf7be, 0xf7bc, 0xbaa1, 0xf7bf, 0xf7c0, 0xf7c2, 0xf7c1, 0xf7c4,
  0xf7c3, 0xf7c5, 0xf7c6, 0xf7c7, 0xcbe8, 0xb8df, 0xf7d4, 0xf7d5,
  0xf7d6, 0xf7d8, 0xf7da, 0xf7d7, 0xf7db, 0xf7d9, 0xd7d7, 0xf7dc,
  0xf7dd, 0xf7de, 0xf7df, 0xf7e0, 0xdbcb, 0xd8aa, 0xe5f7, 0xb9ed,
  0xbffd, 0xbbea, 0xf7c9, 0xc6c7, 0xf7c8, 0xf7ca, 0xf7cc, 0xf7cb,
  0xf7cd, 0xceba, 0xf7ce, 0xc4a7, 0xd3e3, 0xf6cf, 0xc2b3, 0xf6d0,
  0xf6d1, 0xf6d2, 0xf6d3, 0xf6d4, 0xf6d6, 0xb1ab, 0xf6d7, 0xf6d8,
  0xf6d9, 0xf6da, 0xf6db, 0xf6dc, 0xf6dd, 0xf6de, 0xcfca, 0xf6df,
  0xf6e0, 0xf6e1, 0xf6e2, 0xf6e3, 0xf6e4, 0xc0f0, 0xf6e5, 0xf6e6,
  0xf6e7, 0xf6e8, 0xf6e9, 0xf6ea, 0xf6eb, 0xf6ec, 0xf6ed, 0xf6ee,
  0xf6ef, 0xf6f0, 0xf6f1, 0xf6f2, 0xf6f3, 0xf6f4, 0xbea8, 0xf6f5,
  0xf6f6, 0xf6f7, 0xf6f8, 0xc8fa, 0xf6f9, 0xf6fa, 0xf6fb, 0xf6fc,
  0xf6fd, 0xf6fe, 0xf7a1, 0xf7a2, 0xf7a3, 0xf7a4, 0xf7a5, 0xf7a6,
  0xf7a7, 0xf7a8, 0xb1ee, 0xf7a9, 0xf7aa, 0xf7ab, 0xf7ac, 0xf7ad,
  0xc1db, 0xf7ae, 0xf7af, 0xc4f1, 0xf0af, 0xbca6, 0xf0b0, 0xc3f9,
  0xc5b8, 0xd1bb, 0xf0b1, 0xf0b2, 0xf0b3, 0xf0b4, 0xf0b5, 0xd1bc,
  0xd1ec, 0xf0b7, 0xf0b6, 0xd4a7, 0xcdd2, 0xf0b8, 0xf0ba, 0xf0b9,
  0xf0bb, 0xf0bc, 0xb8eb, 0xf0bd, 0xbae8, 0xf0be, 0xf0bf, 0xbee9,
  0xf0c0, 0xb6ec, 0xf0c1, 0xf0c2, 0xf0c3, 0xf0c4, 0xc8b5, 0xf0c5,
  0xf0c6, 0xf0c7, 0xc5f4, 0xf0c8, 0xf0c9, 0xf0ca, 0xf7bd, 0xf0cb,
  0xf0cc, 0xf0cd, 0xf0ce, 0xf0cf, 0xbad7, 0xf0d0, 0xf0d1, 0xf0d2,
  0xf0d3, 0xf0d4, 0xf0d5, 0xf0d6, 0xf0d8, 0xd3a5, 0xf0d7, 0xf0d9,
  0xf5ba, 0xc2b9, 0xf7e4, 0xf7e5, 0xf7e6, 0xf7e7, 0xf7e8, 0xc2b4,
  0xf7ea, 0xf7eb, 0xc2f3, 0xf4f0, 0xf4ef, 0xc2e9, 0xf7e1, 0xf7e2,
  0xbbc6, 0xd9e4, 0xcaf2, 0xc0e8, 0xf0a4, 0xbada, 0xc7ad, 0xc4ac,
  0xf7ec, 0xf7ed, 0xf7ee, 0xf7f0, 0xf7ef, 0xf7f1, 0xf7f4, 0xf7f3,
  0xf7f2, 0xf7f5, 0xf7f6, 0xede9, 0xedea, 0xedeb, 0xf6bc, 0xf6bd,
  0xf6be, 0xb6a6, 0xd8be, 0xb9c4, 0xd8bb, 0xdcb1, 0xcaf3, 0xf7f7,
  0xf7f8, 0xf7f9, 0xf7fb, 0xf7fa, 0xb1c7, 0xf7fc, 0xf7fd, 0xf7fe,
  0xc6eb, 0xecb4, 0xb3dd, 0xf6b3, 0xf6b4, 0xc1e4, 0xf6b5, 0xf6b6,
  0xf6b7, 0xf6b8, 0xf6b9, 0xf6ba, 0xc8a3, 0xf6bb, 0xc1fa, 0xb9a8,
  0xede8, 0xb9ea, 0xd9df, 0xa3a1, 0xa3a2, 0xa3a3, 0xa1e7, 0xa3a5,
  0xa3a6, 0xa3a7, 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad,
  0xa3ae, 0xa3af, 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5,
  0xa3b6, 0xa3b7, 0xa3b8, 0xa3b9, 0xa3ba, 0xa3bb, 0xa3bc, 0xa3bd,
  0xa3be, 0xa3bf, 0xa3c0, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5,
  0xa3c6, 0xa3c7, 0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd,
  0xa3ce, 0xa3cf, 0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5,
  0xa3d6, 0xa3d7, 0xa3d8, 0xa3d9, 0xa3da, 0xa3db, 0xa3dc, 0xa3dd,
  0xa3de, 0xa3df, 0xa3e0, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5,
  0xa3e6, 0xa3e7, 0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed,
  0xa3ee, 0xa3ef, 0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5,
  0xa3f6, 0xa3f7, 0xa3f8, 0xa3f9, 0xa3fa, 0xa3fb, 0xa3fc, 0xa3fd,
  0xa1ab, 0xa1e9, 0xa1ea, 0xa3fe, 0xa3a4,
};

typedef struct {
  unsigned short indx; /* index into big table */
  unsigned short used; /* bitmask of used entries */
} Summary16;

static const Summary16 gb2312_uni2indx_page00[70] = {
  /* 0x0000 */
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0190 }, {    3, 0x0003 },
  {    5, 0x0000 }, {    5, 0x0080 }, {    6, 0x3703 }, {   13, 0x168c },
  /* 0x0100 */
  {   19, 0x0002 }, {   20, 0x0808 }, {   22, 0x0800 }, {   23, 0x0000 },
  {   23, 0x2000 }, {   24, 0x0000 }, {   24, 0x0800 }, {   25, 0x0000 },
  {   25, 0x0000 }, {   25, 0x0000 }, {   25, 0x0000 }, {   25, 0x0000 },
  {   25, 0x4000 }, {   26, 0x1555 }, {   33, 0x0000 }, {   33, 0x0000 },
  /* 0x0200 */
  {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 },
  {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 },
  {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 },
  {   33, 0x0280 }, {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 },
  /* 0x0300 */
  {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 },
  {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 },
  {   35, 0x0000 }, {   35, 0xfffe }, {   50, 0x03fb }, {   59, 0xfffe },
  {   74, 0x03fb }, {   83, 0x0000 }, {   83, 0x0000 }, {   83, 0x0000 },
  /* 0x0400 */
  {   83, 0x0002 }, {   84, 0xffff }, {  100, 0xffff }, {  116, 0xffff },
  {  132, 0xffff }, {  148, 0x0002 },
};
static const Summary16 gb2312_uni2indx_page20[101] = {
  /* 0x2000 */
  {  149, 0x0000 }, {  149, 0x3360 }, {  155, 0x0040 }, {  156, 0x080d },
  {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 },
  {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 },
  {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 },
  /* 0x2100 */
  {  160, 0x0008 }, {  161, 0x0040 }, {  162, 0x0000 }, {  162, 0x0000 },
  {  162, 0x0000 }, {  162, 0x0000 }, {  162, 0x0fff }, {  174, 0x0000 },
  {  174, 0x0000 }, {  174, 0x000f }, {  178, 0x0000 }, {  178, 0x0000 },
  {  178, 0x0000 }, {  178, 0x0000 }, {  178, 0x0000 }, {  178, 0x0000 },
  /* 0x2200 */
  {  178, 0x8100 }, {  180, 0x6402 }, {  184, 0x4fa1 }, {  192, 0x20f0 },
  {  197, 0x1100 }, {  199, 0x0000 }, {  199, 0xc033 }, {  205, 0x0000 },
  {  205, 0x0000 }, {  205, 0x0200 }, {  206, 0x0020 }, {  207, 0x0000 },
  {  207, 0x0000 }, {  207, 0x0000 }, {  207, 0x0000 }, {  207, 0x0000 },
  /* 0x2300 */
  {  207, 0x0000 }, {  207, 0x0004 }, {  208, 0x0000 }, {  208, 0x0000 },
  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 },
  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 },
  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 },
  /* 0x2400 */
  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 },
  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x03ff }, {  218, 0xfff0 },
  {  230, 0xffff }, {  246, 0x0fff }, {  258, 0x0000 }, {  258, 0x0000 },
  {  258, 0x0000 }, {  258, 0x0000 }, {  258, 0x0000 }, {  258, 0x0000 },
  /* 0x2500 */
  {  258, 0xffff }, {  274, 0xffff }, {  290, 0xffff }, {  306, 0xffff },
  {  322, 0x0fff }, {  334, 0x0000 }, {  334, 0x0000 }, {  334, 0x0000 },
  {  334, 0x0000 }, {  334, 0x0000 }, {  334, 0x0003 }, {  336, 0x000c },
  {  338, 0xc8c0 }, {  343, 0x0000 }, {  343, 0x0000 }, {  343, 0x0000 },
  /* 0x2600 */
  {  343, 0x0060 }, {  345, 0x0000 }, {  345, 0x0000 }, {  345, 0x0000 },
  {  345, 0x0005 },
};
static const Summary16 gb2312_uni2indx_page30[35] = {
  /* 0x3000 */
  {  347, 0xff2f }, {  360, 0x00fb }, {  367, 0x0000 }, {  367, 0x0000 },
  {  367, 0xfffe }, {  382, 0xffff }, {  398, 0xffff }, {  414, 0xffff },
  {  430, 0xffff }, {  446, 0x000f }, {  450, 0xfffe }, {  465, 0xffff },
  {  481, 0xffff }, {  497, 0xffff }, {  513, 0xffff }, {  529, 0x087f },
  /* 0x3100 */
  {  537, 0xffe0 }, {  548, 0xffff }, {  564, 0x03ff }, {  574, 0x0000 },
  {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 },
  {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 },
  {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 },
  /* 0x3200 */
  {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x03ff },
};
static const Summary16 gb2312_uni2indx_page4e[1263] = {
  /* 0x4e00 */
  {  584, 0x7f8b }, {  595, 0x7f7b }, {  608, 0x3db4 }, {  617, 0xef55 },
  {  628, 0xfba8 }, {  638, 0xf35d }, {  649, 0x0243 }, {  653, 0x400b },
  {  657, 0xfb40 }, {  665, 0x8d3e }, {  674, 0x7bf7 }, {  687, 0x8c2c },
  {  693, 0x6eff }, {  706, 0xe3fa }, {  717, 0x1d3a }, {  725, 0xa8ed },
  /* 0x4f00 */
  {  734, 0xe602 }, {  740, 0xcf83 }, {  749, 0x8cf5 }, {  758, 0x3555 },
  {  766, 0xe048 }, {  771, 0xffab }, {  784, 0x92b9 }, {  792, 0xd859 },
  {  800, 0xab18 }, {  807, 0x2892 }, {  812, 0xd7e9 }, {  823, 0x8020 },
  {  825, 0xc438 }, {  831, 0xf583 }, {  840, 0xe74a }, {  849, 0x450a },
  /* 0x5000 */
  {  854, 0xb000 }, {  857, 0x9714 }, {  864, 0x7762 }, {  873, 0x5400 },
  {  876, 0xd188 }, {  882, 0x1420 }, {  885, 0x1020 }, {  887, 0xc8c0 },
  {  892, 0x2121 }, {  896, 0x0000 }, {  896, 0x13a8 }, {  902, 0x0c04 },
  {  905, 0x8000 }, {  906, 0x0440 }, {  908, 0x70c0 }, {  913, 0x0828 },
  /* 0x5100 */
  {  916, 0x08c0 }, {  919, 0x0004 }, {  920, 0x0002 }, {  921, 0x8000 },
  {  922, 0x2b7b }, {  932, 0x1472 }, {  938, 0x7924 }, {  945, 0x3bfb },
  {  957, 0x3327 }, {  965, 0x1ae4 }, {  972, 0x9835 }, {  979, 0x38ef },
  {  989, 0x9ad1 }, {  997, 0x2802 }, { 1000, 0xa813 }, { 1006, 0xbf69 },
  /* 0x5200 */
  { 1017, 0x65cf }, { 1027, 0x2fc6 }, { 1036, 0x6b11 }, { 1043, 0xafc9 },
  { 1053, 0x340f }, { 1060, 0x5053 }, { 1066, 0x86a2 }, { 1072, 0xa004 },
  { 1075, 0x0106 }, { 1078, 0xe809 }, { 1084, 0x3f0f }, { 1094, 0xc00e },
  { 1099, 0x0a88 }, { 1103, 0x8145 }, { 1108, 0x0010 }, { 1109, 0xc601 },
  /* 0x5300 */
  { 1114, 0xa161 }, { 1120, 0x26e1 }, { 1127, 0x444b }, { 1133, 0xce00 },
  { 1138, 0xc7aa }, { 1147, 0xd4ee }, { 1157, 0xcadf }, { 1168, 0x85bb },
  { 1177, 0x3a74 }, { 1185, 0xa520 }, { 1190, 0x436c }, { 1197, 0x8840 },
  { 1200, 0x3f06 }, { 1208, 0x8bd2 }, { 1216, 0xff79 }, { 1229, 0x3bef },
  /* 0x5400 */
  { 1241, 0xf75a }, { 1252, 0xe8ef }, { 1263, 0xfbcb }, { 1275, 0x5b36 },
  { 1284, 0x0d49 }, { 1290, 0x1bfd }, { 1301, 0x0154 }, { 1305, 0x39ee },
  { 1315, 0xd855 }, { 1323, 0x2e75 }, { 1332, 0xbfd8 }, { 1343, 0xa91a },
  { 1350, 0xf3d7 }, { 1362, 0xf6bf }, { 1375, 0x67e0 }, { 1383, 0xb40c },
  /* 0x5500 */
  { 1389, 0x82c2 }, { 1394, 0x0813 }, { 1398, 0xd49d }, { 1407, 0xd08b },
  { 1414, 0x065a }, { 1420, 0x1061 }, { 1424, 0x74f2 }, { 1433, 0x59e0 },
  { 1440, 0x8f9f }, { 1451, 0xb312 }, { 1458, 0x0080 }, { 1459, 0x6aaa },
  { 1467, 0x3230 }, { 1472, 0xb05e }, { 1480, 0x9d7a }, { 1490, 0x60ac },
  /* 0x5600 */
  { 1496, 0xd303 }, { 1503, 0xc900 }, { 1507, 0x3098 }, { 1512, 0x8a56 },
  { 1519, 0x7000 }, { 1522, 0x1390 }, { 1527, 0x1f14 }, { 1534, 0x1842 },
  { 1538, 0xc060 }, { 1542, 0x0008 }, { 1543, 0x8008 }, { 1545, 0x1080 },
  { 1547, 0x0400 }, { 1548, 0xec90 }, { 1555, 0x2817 }, { 1561, 0xe633 },
  /* 0x5700 */
  { 1570, 0x0758 }, { 1576, 0x9000 }, { 1578, 0xf708 }, { 1586, 0x4e09 },
  { 1592, 0xf485 }, { 1600, 0xfc83 }, { 1609, 0xaf53 }, { 1619, 0x18c8 },
  { 1624, 0x187c }, { 1631, 0x080c }, { 1634, 0x6adf }, { 1645, 0x0114 },
  { 1648, 0xc80c }, { 1653, 0xa734 }, { 1661, 0xa011 }, { 1665, 0x2710 },
  /* 0x5800 */
  { 1670, 0x28c5 }, { 1676, 0x4222 }, { 1680, 0x0413 }, { 1684, 0x0021 },
  { 1686, 0x3010 }, { 1689, 0x4112 }, { 1693, 0x1820 }, { 1696, 0x4000 },
  { 1697, 0x022b }, { 1702, 0xc60c }, { 1708, 0x0300 }, { 1710, 0x1000 },
  { 1711, 0x0022 }, { 1713, 0x0022 }, { 1715, 0x5810 }, { 1719, 0x0249 },
  /* 0x5900 */
  { 1723, 0xa094 }, { 1728, 0x9670 }, { 1735, 0xeeb0 }, { 1744, 0x1792 },
  { 1751, 0xcb96 }, { 1760, 0x05f2 }, { 1767, 0x0025 }, { 1770, 0x2358 },
  { 1776, 0x25de }, { 1785, 0x42cc }, { 1791, 0xcf38 }, { 1800, 0x4a04 },
  { 1804, 0x0c40 }, { 1807, 0x359f }, { 1817, 0x1128 }, { 1821, 0x8a00 },
  /* 0x5a00 */
  { 1824, 0x13fa }, { 1833, 0x910a }, { 1838, 0x0229 }, { 1842, 0x1056 },
  { 1847, 0x0641 }, { 1851, 0x0420 }, { 1853, 0x0484 }, { 1856, 0x84f0 },
  { 1862, 0x0000 }, { 1862, 0x0c04 }, { 1865, 0x0400 }, { 1866, 0x412c },
  { 1871, 0x1206 }, { 1875, 0x1154 }, { 1880, 0x0a4b }, { 1886, 0x0002 },
  /* 0x5b00 */
  { 1887, 0x0200 }, { 1888, 0x00c0 }, { 1890, 0x0000 }, { 1890, 0x0094 },
  { 1893, 0x0001 }, { 1894, 0xbfbb }, { 1907, 0x167c }, { 1915, 0x242b },
  { 1921, 0x9bbb }, { 1932, 0x7fa8 }, { 1942, 0x0c7f }, { 1951, 0xe379 },
  { 1961, 0x10f4 }, { 1967, 0xe00d }, { 1973, 0x4132 }, { 1978, 0x9f01 },
  /* 0x5c00 */
  { 1985, 0x8652 }, { 1991, 0x3572 }, { 1999, 0x10b4 }, { 2004, 0xff12 },
  { 2014, 0xcf27 }, { 2024, 0x4223 }, { 2029, 0xc06b }, { 2036, 0x8602 },
  { 2040, 0x3106 }, { 2045, 0x1fd3 }, { 2055, 0x3a0c }, { 2061, 0xa1aa },
  { 2068, 0x0812 }, { 2071, 0x0204 }, { 2073, 0x2572 }, { 2080, 0x0801 },
  /* 0x5d00 */
  { 2082, 0x40cc }, { 2087, 0x4850 }, { 2091, 0x62d0 }, { 2097, 0x6010 },
  { 2100, 0x1c80 }, { 2104, 0x2900 }, { 2107, 0x9a00 }, { 2111, 0x0010 },
  { 2112, 0x0004 }, { 2113, 0x2200 }, { 2115, 0x0000 }, { 2115, 0x0080 },
  { 2116, 0x2020 }, { 2118, 0x6800 }, { 2121, 0xcbe6 }, { 2131, 0x609e },
  /* 0x5e00 */
  { 2138, 0x916e }, { 2146, 0x3f73 }, { 2157, 0x60c0 }, { 2161, 0x3982 },
  { 2167, 0x1034 }, { 2171, 0x4830 }, { 2175, 0x0006 }, { 2177, 0xbd5c },
  { 2187, 0x8cd1 }, { 2194, 0xd6fb }, { 2206, 0x20e1 }, { 2211, 0x43e8 },
  { 2218, 0x0600 }, { 2220, 0x084e }, { 2225, 0x0500 }, { 2227, 0xc4d0 },
  /* 0x5f00 */
  { 2233, 0x8d1f }, { 2242, 0x89aa }, { 2249, 0xa6e1 }, { 2257, 0x1602 },
  { 2261, 0x0001 }, { 2262, 0x21ed }, { 2270, 0x3656 }, { 2278, 0x1a8b },
  { 2285, 0x1fb7 }, { 2296, 0x13a5 }, { 2303, 0x6502 }, { 2308, 0x30a0 },
  { 2312, 0xb278 }, { 2320, 0x23c7 }, { 2328, 0x6c93 }, { 2336, 0xe922 },
  /* 0x6000 */
  { 2343, 0xe47f }, { 2354, 0x3a74 }, { 2362, 0x8fe3 }, { 2372, 0x9820 },
  { 2376, 0x280e }, { 2381, 0x2625 }, { 2387, 0xbf9c }, { 2398, 0xbf49 },
  { 2408, 0x3218 }, { 2413, 0xac54 }, { 2420, 0xb949 }, { 2428, 0x1916 },
  { 2434, 0x0c60 }, { 2438, 0xb522 }, { 2445, 0xfbc1 }, { 2455, 0x0659 },
  /* 0x6100 */
  { 2461, 0xe343 }, { 2469, 0x8420 }, { 2472, 0x08d9 }, { 2478, 0x8000 },
  { 2479, 0x5500 }, { 2483, 0x2022 }, { 2486, 0x0184 }, { 2489, 0x00a1 },
  { 2492, 0x4800 }, { 2494, 0x2010 }, { 2496, 0x1380 }, { 2500, 0x4080 },
  { 2502, 0x0d04 }, { 2506, 0x0016 }, { 2509, 0x0040 }, { 2510, 0x8020 },
  /* 0x6200 */
  { 2512, 0xfd40 }, { 2520, 0x8de7 }, { 2530, 0x5436 }, { 2537, 0xe098 },
  { 2543, 0x7b8b }, { 2553, 0x091e }, { 2559, 0xfec8 }, { 2569, 0xd249 },
  { 2576, 0x0611 }, { 2580, 0x8dee }, { 2590, 0x1937 }, { 2598, 0xba22 },
  { 2605, 0x77f4 }, { 2616, 0x9fdd }, { 2628, 0xf3ec }, { 2639, 0xf0da },
  /* 0x6300 */
  { 2648, 0x4386 }, { 2654, 0xec42 }, { 2661, 0x8d3f }, { 2671, 0x2604 },
  { 2675, 0xfa6c }, { 2685, 0xc021 }, { 2689, 0x628e }, { 2696, 0x0cc2 },
  { 2701, 0xd785 }, { 2710, 0x0145 }, { 2714, 0x77ad }, { 2725, 0x5599 },
  { 2733, 0xe250 }, { 2739, 0x4045 }, { 2743, 0x260b }, { 2749, 0xa154 },
  /* 0x6400 */
  { 2755, 0x9827 }, { 2762, 0x5819 }, { 2768, 0x3443 }, { 2774, 0xa410 },
  { 2778, 0x05f2 }, { 2785, 0x4114 }, { 2789, 0x2280 }, { 2792, 0x0700 },
  { 2795, 0x00b4 }, { 2799, 0x4266 }, { 2805, 0x7210 }, { 2810, 0x15a1 },
  { 2816, 0x6025 }, { 2821, 0x4185 }, { 2826, 0x0054 }, { 2829, 0x0000 },
  /* 0x6500 */
  { 2829, 0x0201 }, { 2831, 0x0104 }, { 2833, 0xc820 }, { 2837, 0xcb70 },
  { 2845, 0x9320 }, { 2850, 0x6a62 }, { 2857, 0x184c }, { 2862, 0x0095 },
  { 2866, 0x1880 }, { 2869, 0x9a8b }, { 2877, 0xaab2 }, { 2885, 0x3201 },
  { 2889, 0xd87a }, { 2898, 0x00c4 }, { 2901, 0xf3e5 }, { 2912, 0x04c3 },
  /* 0x6600 */
  { 2917, 0xd44d }, { 2925, 0xa238 }, { 2931, 0xa1a1 }, { 2937, 0x5072 },
  { 2943, 0x980a }, { 2948, 0x84fc }, { 2956, 0xc152 }, { 2962, 0x44d1 },
  { 2968, 0x1094 }, { 2972, 0x20c2 }, { 2976, 0x4180 }, { 2979, 0x4210 },
  { 2982, 0x0000 }, { 2982, 0x3a00 }, { 2986, 0x0240 }, { 2988, 0xd29d },
  /* 0x6700 */
  { 2997, 0x2f01 }, { 3003, 0xa8b1 }, { 3010, 0xbd40 }, { 3017, 0x2432 },
  { 3022, 0xd34d }, { 3031, 0xd04b }, { 3038, 0xa723 }, { 3046, 0xd0ad },
  { 3054, 0x0a92 }, { 3059, 0x75a1 }, { 3067, 0xadac }, { 3076, 0x01e9 },
  { 3082, 0x801a }, { 3086, 0x771f }, { 3097, 0x9225 }, { 3103, 0xa01b },
  /* 0x6800 */
  { 3109, 0xdfa1 }, { 3119, 0x20ca }, { 3124, 0x0602 }, { 3127, 0x738c },
  { 3135, 0x577f }, { 3147, 0x003b }, { 3152, 0x0bff }, { 3163, 0x00d0 },
  { 3166, 0x806a }, { 3171, 0x0088 }, { 3173, 0xa1c4 }, { 3179, 0x0029 },
  { 3182, 0x2a05 }, { 3187, 0x0524 }, { 3191, 0x4009 }, { 3194, 0x1623 },
  /* 0x6900 */
  { 3200, 0x6822 }, { 3205, 0x8005 }, { 3208, 0x2011 }, { 3211, 0xa211 },
  { 3216, 0x0004 }, { 3217, 0x6490 }, { 3222, 0x4849 }, { 3227, 0x1382 },
  { 3232, 0x23d5 }, { 3240, 0x1930 }, { 3245, 0x2980 }, { 3249, 0x0892 },
  { 3253, 0x5402 }, { 3257, 0x8811 }, { 3261, 0x2001 }, { 3263, 0xa004 },
  /* 0x6a00 */
  { 3266, 0x0400 }, { 3267, 0x8180 }, { 3270, 0x8502 }, { 3274, 0x6022 },
  { 3278, 0x0090 }, { 3280, 0x0b01 }, { 3284, 0x0022 }, { 3286, 0x1202 },
  { 3289, 0x4011 }, { 3292, 0x0083 }, { 3295, 0x1a01 }, { 3299, 0x0000 },
  { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 },
  /* 0x6b00 */
  { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x009f }, { 3305, 0x4684 },
  { 3310, 0x12c8 }, { 3315, 0x0200 }, { 3316, 0x04fc }, { 3323, 0x1a00 },
  { 3326, 0x2ede }, { 3336, 0x0c4c }, { 3341, 0x0402 }, { 3343, 0x80b8 },
  { 3348, 0xa826 }, { 3354, 0x0afc }, { 3362, 0x8c02 }, { 3366, 0x2228 },
  /* 0x6c00 */
  { 3370, 0xa0e0 }, { 3375, 0x8f7b }, { 3386, 0xc7d6 }, { 3396, 0x2135 },
  { 3402, 0x06c7 }, { 3409, 0xf8b1 }, { 3418, 0x0713 }, { 3424, 0x6255 },
  { 3431, 0x936e }, { 3440, 0x8a19 }, { 3446, 0x6efa }, { 3457, 0xfb0e },
  { 3467, 0x1630 }, { 3472, 0x48f9 }, { 3480, 0xcd2f }, { 3490, 0x7deb },
  /* 0x6d00 */
  { 3502, 0x5892 }, { 3508, 0x4e84 }, { 3514, 0x4ca0 }, { 3519, 0x7a2e },
  { 3528, 0xedea }, { 3539, 0x561e }, { 3547, 0xc649 }, { 3554, 0x1190 },
  { 3558, 0x5324 }, { 3564, 0xe83a }, { 3572, 0xcfdb }, { 3584, 0x8124 },
  { 3588, 0x18f1 }, { 3595, 0x6342 }, { 3601, 0x5853 }, { 3608, 0x1a8a },
  /* 0x6e00 */
  { 3614, 0x7420 }, { 3619, 0x24d3 }, { 3626, 0xaa3b }, { 3635, 0x0514 },
  { 3639, 0x6018 }, { 3643, 0x8958 }, { 3649, 0x4800 }, { 3651, 0xc000 },
  { 3653, 0x8268 }, { 3658, 0x9101 }, { 3662, 0x84a4 }, { 3667, 0x2cd6 },
  { 3675, 0x8886 }, { 3680, 0xc4ba }, { 3688, 0x0377 }, { 3696, 0x0210 },
  /* 0x6f00 */
  { 3698, 0x8244 }, { 3702, 0x0038 }, { 3705, 0xae11 }, { 3712, 0x404a },
  { 3716, 0x28c0 }, { 3720, 0x5100 }, { 3723, 0x6044 }, { 3727, 0x1514 },
  { 3732, 0x7310 }, { 3738, 0x1000 }, { 3739, 0x0082 }, { 3741, 0x0248 },
  { 3744, 0x0205 }, { 3747, 0x4006 }, { 3750, 0xc003 }, { 3754, 0x0000 },
  /* 0x7000 */
  { 3754, 0x0000 }, { 3754, 0x0c02 }, { 3757, 0x0008 }, { 3758, 0x0220 },
  { 3760, 0x9000 }, { 3762, 0x4000 }, { 3763, 0xb800 }, { 3767, 0xd161 },
  { 3774, 0x4621 }, { 3779, 0x3274 }, { 3786, 0xf800 }, { 3791, 0x3b8a },
  { 3799, 0x050f }, { 3805, 0x8b00 }, { 3809, 0xbbd0 }, { 3818, 0x2280 },
  /* 0x7100 */
  { 3821, 0x0600 }, { 3823, 0x0769 }, { 3830, 0x8040 }, { 3832, 0x0043 },
  { 3835, 0x5420 }, { 3839, 0x5000 }, { 3841, 0x41d0 }, { 3846, 0x250c },
  { 3851, 0x8410 }, { 3854, 0x8310 }, { 3858, 0x1101 }, { 3861, 0x0228 },
  { 3864, 0x4008 }, { 3866, 0x0030 }, { 3868, 0x40a1 }, { 3872, 0x0200 },
  /* 0x7200 */
  { 3873, 0x0040 }, { 3874, 0x2000 }, { 3875, 0x1500 }, { 3878, 0xabe3 },
  { 3888, 0x3180 }, { 3892, 0xaa44 }, { 3898, 0xc2c6 }, { 3905, 0xc624 },
  { 3911, 0xac13 }, { 3918, 0x8004 }, { 3920, 0xb000 }, { 3923, 0x03d1 },
  { 3929, 0x611e }, { 3936, 0x4285 }, { 3941, 0xf303 }, { 3949, 0x1d9f },
  /* 0x7300 */
  { 3959, 0x440a }, { 3963, 0x78e8 }, { 3971, 0x5e26 }, { 3979, 0xc392 },
  { 3986, 0x2000 }, { 3987, 0x0085 }, { 3990, 0xb001 }, { 3994, 0x4000 },
  { 3995, 0x4a90 }, { 4000, 0x8842 }, { 4004, 0xca04 }, { 4009, 0x0c8d },
  { 4015, 0xa705 }, { 4022, 0x4203 }, { 4026, 0x22a1 }, { 4031, 0x0004 },
  /* 0x7400 */
  { 4032, 0x8668 }, { 4038, 0x0c01 }, { 4041, 0x5564 }, { 4048, 0x1079 },
  { 4054, 0x0002 }, { 4055, 0xdea0 }, { 4063, 0x2000 }, { 4064, 0x40c1 },
  { 4068, 0x488b }, { 4074, 0x5001 }, { 4077, 0x0380 }, { 4080, 0x0400 },
  { 4081, 0x0000 }, { 4081, 0x5004 }, { 4084, 0xc05d }, { 4091, 0x80d0 },
  /* 0x7500 */
  { 4095, 0xa010 }, { 4098, 0x970a }, { 4105, 0xbb20 }, { 4112, 0x4daf },
  { 4122, 0xd921 }, { 4129, 0x1e10 }, { 4134, 0x0460 }, { 4137, 0x8314 },
  { 4142, 0x8848 }, { 4146, 0xa6d6 }, { 4155, 0xd83b }, { 4164, 0x733f },
  { 4175, 0x27bc }, { 4184, 0x4974 }, { 4191, 0x0ddc }, { 4199, 0x9213 },
  /* 0x7600 */
  { 4205, 0x142b }, { 4211, 0x8ba1 }, { 4218, 0x2e75 }, { 4227, 0xd139 },
  { 4235, 0x3009 }, { 4239, 0x5050 }, { 4243, 0x8808 }, { 4246, 0x6900 },
  { 4250, 0x49d4 }, { 4257, 0x024a }, { 4261, 0x4010 }, { 4263, 0x8016 },
  { 4267, 0xe564 }, { 4275, 0x89d7 }, { 4284, 0xc020 }, { 4287, 0x5316 },
  /* 0x7700 */
  { 4294, 0x2b92 }, { 4301, 0x8600 }, { 4304, 0xa345 }, { 4311, 0x15e0 },
  { 4317, 0x008b }, { 4321, 0x0c03 }, { 4325, 0x196e }, { 4333, 0xe200 },
  { 4337, 0x7031 }, { 4343, 0x8006 }, { 4346, 0x16a5 }, { 4353, 0xa829 },
  { 4359, 0x2000 }, { 4360, 0x1880 }, { 4363, 0x7aac }, { 4372, 0xe148 },
  /* 0x7800 */
  { 4378, 0x3207 }, { 4384, 0xb5d6 }, { 4394, 0x32e8 }, { 4401, 0x5f91 },
  { 4410, 0x50a1 }, { 4415, 0x20e5 }, { 4421, 0x7c00 }, { 4426, 0x1080 },
  { 4428, 0x7280 }, { 4433, 0x9d8a }, { 4441, 0x00aa }, { 4445, 0x421f },
  { 4452, 0x0e22 }, { 4457, 0x0231 }, { 4461, 0x1100 }, { 4463, 0x0494 },
  /* 0x7900 */
  { 4467, 0x0022 }, { 4469, 0x4008 }, { 4471, 0x0010 }, { 4472, 0x5c10 },
  { 4477, 0x0343 }, { 4482, 0xfcc8 }, { 4491, 0xa1a5 }, { 4498, 0x0580 },
  { 4501, 0x8433 }, { 4507, 0x0400 }, { 4508, 0x0080 }, { 4509, 0x6e08 },
  { 4515, 0x2a4b }, { 4522, 0x8126 }, { 4527, 0xaad8 }, { 4535, 0x2901 },
  /* 0x7a00 */
  { 4539, 0x684d }, { 4546, 0x4490 }, { 4550, 0x0009 }, { 4552, 0xba88 },
  { 4559, 0x0040 }, { 4560, 0x0082 }, { 4562, 0x0000 }, { 4562, 0x87d1 },
  { 4570, 0x215b }, { 4577, 0xb1e6 }, { 4586, 0x3161 }, { 4592, 0x8008 },
  { 4594, 0x0800 }, { 4595, 0xc240 }, { 4599, 0xa069 }, { 4605, 0xa600 },
  /* 0x7b00 */
  { 4609, 0x8d58 }, { 4616, 0x4a32 }, { 4622, 0x5d71 }, { 4631, 0x550a },
  { 4637, 0x9aa0 }, { 4643, 0x2d57 }, { 4652, 0x4005 }, { 4655, 0x4aa6 },
  { 4662, 0x2021 }, { 4665, 0x30b1 }, { 4671, 0x3fc6 }, { 4681, 0x0112 },
  { 4684, 0x10c2 }, { 4688, 0x260a }, { 4693, 0x4462 }, { 4698, 0x5082 },
  /* 0x7c00 */
  { 4702, 0x9880 }, { 4706, 0x8040 }, { 4708, 0x04c0 }, { 4711, 0x8100 },
  { 4713, 0x2003 }, { 4716, 0x0000 }, { 4716, 0x0000 }, { 4716, 0x3818 },
  { 4721, 0x0200 }, { 4722, 0xf1a6 }, { 4731, 0x4434 }, { 4736, 0x720e },
  { 4743, 0x35a2 }, { 4750, 0x92e0 }, { 4756, 0x8101 }, { 4759, 0x0900 },
  /* 0x7d00 */
  { 4761, 0x0400 }, { 4762, 0x0000 }, { 4762, 0x8885 }, { 4767, 0x0000 },
  { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x4000 }, { 4768, 0x0080 },
  { 4769, 0x0000 }, { 4769, 0x0000 }, { 4769, 0x4040 }, { 4771, 0x0000 },
  { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 },
  /* 0x7e00 */
  { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0800 },
  { 4772, 0x0082 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0000 },
  { 4774, 0x0004 }, { 4775, 0x8800 }, { 4777, 0xbfff }, { 4792, 0xe7ef },
  { 4805, 0xffff }, { 4821, 0xffbf }, { 4836, 0xefef }, { 4850, 0xfdff },
  /* 0x7f00 */
  { 4865, 0xfbff }, { 4880, 0xbffe }, { 4894, 0xffff }, { 4910, 0x057f },
  { 4919, 0x0034 }, { 4922, 0x85b3 }, { 4930, 0x4706 }, { 4936, 0x4216 },
  { 4941, 0x5402 }, { 4945, 0xe410 }, { 4950, 0x8092 }, { 4954, 0xb305 },
  { 4961, 0x5422 }, { 4966, 0x8130 }, { 4970, 0x4263 }, { 4976, 0x180b },
  /* 0x8000 */
  { 4981, 0x387b }, { 4990, 0x13f5 }, { 4999, 0x07e5 }, { 5007, 0xa9ea },
  { 5016, 0x3c4c }, { 5023, 0x0514 }, { 5027, 0x0600 }, { 5029, 0x8002 },
  { 5031, 0x1ad9 }, { 5039, 0xbd48 }, { 5047, 0xee37 }, { 5058, 0xf496 },
  { 5067, 0x705f }, { 5076, 0x7ec0 }, { 5084, 0xbfb2 }, { 5095, 0x355f },
  /* 0x8100 */
  { 5105, 0xe644 }, { 5112, 0x455f }, { 5121, 0x9000 }, { 5123, 0x4146 },
  { 5128, 0x1d40 }, { 5133, 0x063b }, { 5140, 0x62a1 }, { 5146, 0xfe13 },
  { 5156, 0x8505 }, { 5161, 0x3902 }, { 5166, 0x0548 }, { 5170, 0x0c08 },
  { 5173, 0x144f }, { 5180, 0x0000 }, { 5180, 0x3488 }, { 5185, 0x5818 },
  /* 0x8200 */
  { 5190, 0x3077 }, { 5198, 0xd815 }, { 5205, 0xbd0e }, { 5214, 0x4bfb },
  { 5225, 0x8a90 }, { 5230, 0x8500 }, { 5233, 0xc100 }, { 5236, 0xe61d },
  { 5245, 0xed14 }, { 5253, 0xb386 }, { 5261, 0xff72 }, { 5273, 0x639b },
  { 5282, 0xfd92 }, { 5292, 0xd9be }, { 5303, 0x887b }, { 5311, 0x0a92 },
  /* 0x8300 */
  { 5316, 0xd3fe }, { 5328, 0x1cb2 }, { 5335, 0xb980 }, { 5341, 0x177a },
  { 5350, 0x82c9 }, { 5356, 0xdc17 }, { 5365, 0xfffb }, { 5380, 0x3980 },
  { 5385, 0x4260 }, { 5389, 0x590c }, { 5395, 0x0f01 }, { 5400, 0x37df },
  { 5412, 0x94a3 }, { 5419, 0xb150 }, { 5425, 0x0623 }, { 5430, 0x2307 },
  /* 0x8400 */
  { 5436, 0xf85a }, { 5445, 0x3102 }, { 5449, 0x01f0 }, { 5454, 0x3102 },
  { 5458, 0x0040 }, { 5459, 0x1e82 }, { 5465, 0x3a0a }, { 5471, 0x056a },
  { 5477, 0x5b84 }, { 5484, 0x1280 }, { 5487, 0x8002 }, { 5489, 0xa714 },
  { 5496, 0x2612 }, { 5501, 0xa04b }, { 5507, 0x1069 }, { 5512, 0x9001 },
  /* 0x8500 */
  { 5515, 0x1000 }, { 5516, 0x848a }, { 5521, 0x1802 }, { 5524, 0x3f80 },
  { 5531, 0x0708 }, { 5535, 0x4240 }, { 5538, 0x0110 }, { 5540, 0x4e14 },
  { 5546, 0x80b0 }, { 5550, 0x1800 }, { 5552, 0xc510 }, { 5557, 0x0281 },
  { 5560, 0x8202 }, { 5563, 0x1029 }, { 5567, 0x0210 }, { 5569, 0x8800 },
  /* 0x8600 */
  { 5571, 0x0020 }, { 5572, 0x0042 }, { 5574, 0x0280 }, { 5576, 0x1100 },
  { 5578, 0xe000 }, { 5581, 0x4413 }, { 5586, 0x5804 }, { 5590, 0xfe02 },
  { 5598, 0x3c07 }, { 5605, 0x3028 }, { 5609, 0x9798 }, { 5617, 0x0473 },
  { 5623, 0xced1 }, { 5632, 0xcb13 }, { 5640, 0x6210 }, { 5644, 0x431f },
  /* 0x8700 */
  { 5652, 0x278d }, { 5660, 0x55ac }, { 5668, 0x422e }, { 5674, 0xc892 },
  { 5680, 0x5380 }, { 5685, 0x0288 }, { 5688, 0x4039 }, { 5693, 0x7851 },
  { 5700, 0x292c }, { 5706, 0x8088 }, { 5709, 0xb900 }, { 5714, 0x2428 },
  { 5718, 0x0c41 }, { 5722, 0x080e }, { 5726, 0x4421 }, { 5730, 0x4200 },
  /* 0x8800 */
  { 5732, 0x0408 }, { 5734, 0x0868 }, { 5738, 0x0006 }, { 5740, 0x1204 },
  { 5743, 0x3031 }, { 5748, 0x0290 }, { 5751, 0x5b3e }, { 5761, 0xe085 },
  { 5767, 0x2936 }, { 5774, 0x1044 }, { 5777, 0x2814 }, { 5781, 0x1082 },
  { 5784, 0x4266 }, { 5790, 0x8334 }, { 5796, 0x013c }, { 5801, 0x531b },
  /* 0x8900 */
  { 5809, 0x0404 }, { 5811, 0x0e0d }, { 5817, 0x0c22 }, { 5821, 0x0051 },
  { 5824, 0x0012 }, { 5826, 0xc000 }, { 5828, 0x0040 }, { 5829, 0x8800 },
  { 5831, 0x004a }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0x0000 },
  { 5834, 0xdff6 }, { 5847, 0x5447 }, { 5854, 0x8868 }, { 5859, 0x0008 },
  /* 0x8a00 */
  { 5860, 0x0081 }, { 5862, 0x0000 }, { 5862, 0x0000 }, { 5862, 0x4000 },
  { 5863, 0x0100 }, { 5864, 0x0000 }, { 5864, 0x0000 }, { 5864, 0x0200 },
  { 5865, 0x0600 }, { 5867, 0x0008 }, { 5868, 0x0000 }, { 5868, 0x0000 },
  { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 },
  /* 0x8b00 */
  { 5868, 0x0080 }, { 5869, 0x0000 }, { 5869, 0x0040 }, { 5870, 0x0000 },
  { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x1040 }, { 5872, 0x0000 },
  { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0xefff }, { 5887, 0xf7fd },
  { 5901, 0xff7f }, { 5916, 0xfffe }, { 5931, 0xfbff }, { 5946, 0xffff },
  /* 0x8c00 */
  { 5962, 0xfdff }, { 5977, 0xbfff }, { 5992, 0xffff }, { 6008, 0x00ff },
  { 6016, 0x12c2 }, { 6021, 0x0420 }, { 6023, 0x0c06 }, { 6027, 0x0708 },
  { 6031, 0x1624 }, { 6036, 0x0110 }, { 6038, 0x0000 }, { 6038, 0x0000 },
  { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 },
  /* 0x8d00 */
  { 6038, 0x0000 }, { 6038, 0xe000 }, { 6041, 0xfffe }, { 6056, 0xffff },
  { 6072, 0xffff }, { 6088, 0x7f79 }, { 6100, 0x28df }, { 6109, 0x00f9 },
  { 6115, 0x0c32 }, { 6120, 0x8012 }, { 6123, 0x0008 }, { 6124, 0xd53a },
  { 6133, 0xd858 }, { 6140, 0xecc2 }, { 6148, 0x9d18 }, { 6155, 0x2fa8 },
  /* 0x8e00 */
  { 6163, 0x9620 }, { 6168, 0xe010 }, { 6172, 0xd60c }, { 6179, 0x2622 },
  { 6184, 0x0f97 }, { 6193, 0x0206 }, { 6196, 0xb240 }, { 6201, 0x9055 },
  { 6207, 0x80a2 }, { 6211, 0x5011 }, { 6215, 0x9800 }, { 6218, 0x0404 },
  { 6220, 0x4000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 },
  /* 0x8f00 */
  { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 },
  { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0xfbc0 }, { 6230, 0xffff },
  { 6246, 0xeffe }, { 6260, 0xdffb }, { 6274, 0x0b08 }, { 6278, 0x6243 },
  { 6284, 0x41b6 }, { 6291, 0xfb3b }, { 6303, 0x6f74 }, { 6313, 0x2389 },
  /* 0x9000 */
  { 6319, 0xae7f }, { 6331, 0xecd7 }, { 6342, 0xe047 }, { 6349, 0x5960 },
  { 6355, 0xa096 }, { 6361, 0x098f }, { 6368, 0x612c }, { 6374, 0xa030 },
  { 6378, 0x090d }, { 6383, 0x2aaa }, { 6390, 0xd44e }, { 6398, 0x4f7b },
  { 6409, 0xc4b2 }, { 6416, 0x388b }, { 6423, 0xa9c6 }, { 6431, 0x6110 },
  /* 0x9100 */
  { 6435, 0x0014 }, { 6437, 0x4200 }, { 6439, 0x800c }, { 6442, 0x0202 },
  { 6444, 0xfe48 }, { 6453, 0x6485 }, { 6459, 0xd63e }, { 6469, 0xe3f7 },
  { 6481, 0x3aa0 }, { 6487, 0x0c07 }, { 6492, 0xe40c }, { 6498, 0x0430 },
  { 6501, 0xf680 }, { 6508, 0x1002 }, { 6510, 0x0000 }, { 6510, 0x0000 },
  /* 0x9200 */
  { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 },
  { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0010 },
  { 6511, 0x4000 }, { 6512, 0x0000 }, { 6512, 0x4000 }, { 6513, 0x0000 },
  { 6513, 0x0100 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 },
  /* 0x9300 */
  { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x4000 },
  { 6515, 0x0000 }, { 6515, 0x0000 }, { 6515, 0x0400 }, { 6516, 0x0000 },
  { 6516, 0x8000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0000 },
  { 6517, 0x0400 }, { 6518, 0x0040 }, { 6519, 0x0000 }, { 6519, 0x0000 },
  /* 0x9400 */
  { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x4000 },
  { 6520, 0x0000 }, { 6520, 0x0000 }, { 6520, 0x0800 }, { 6521, 0x0000 },
  { 6521, 0xffe0 }, { 6532, 0xfebd }, { 6545, 0xffff }, { 6561, 0xffff },
  { 6577, 0x7f7f }, { 6591, 0xfbe7 }, { 6604, 0xffbf }, { 6619, 0xf7ff },
  /* 0x9500 */
  { 6634, 0xffff }, { 6650, 0xefff }, { 6665, 0xff7e }, { 6679, 0xdff7 },
  { 6693, 0xf6f7 }, { 6706, 0xfbdf }, { 6720, 0xbffe }, { 6734, 0x804f },
  { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 },
  { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0xef00 }, { 6747, 0x7fff },
  /* 0x9600 */
  { 6762, 0xff7f }, { 6777, 0xb6f7 }, { 6789, 0x4406 }, { 6793, 0xb87e },
  { 6803, 0x3bf5 }, { 6814, 0x8831 }, { 6819, 0x1796 }, { 6827, 0x00f4 },
  { 6832, 0xa960 }, { 6838, 0x1391 }, { 6844, 0x0080 }, { 6845, 0x7249 },
  { 6852, 0xf2f3 }, { 6863, 0x0024 }, { 6865, 0x8701 }, { 6870, 0x42c8 },
  /* 0x9700 */
  { 6875, 0xe3d3 }, { 6885, 0x5048 }, { 6889, 0x2400 }, { 6891, 0x4305 },
  { 6896, 0x0000 }, { 6896, 0x4a4c }, { 6902, 0x0227 }, { 6907, 0x1058 },
  { 6911, 0x2820 }, { 6914, 0x0116 }, { 6918, 0xa809 }, { 6923, 0x0014 },
  { 6925, 0x0000 }, { 6925, 0x0000 }, { 6925, 0x3ec0 }, { 6932, 0x0068 },
  /* 0x9800 */
  { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 },
  { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0xffe0 },
  { 6946, 0xb7ff }, { 6960, 0xfddb }, { 6973, 0x00f7 }, { 6980, 0x0000 },
  { 6980, 0x4000 }, { 6981, 0xc72e }, { 6990, 0x0180 }, { 6992, 0x0000 },
  /* 0x9900 */
  { 6992, 0x2000 }, { 6993, 0x0001 }, { 6994, 0x4000 }, { 6995, 0x0000 },
  { 6995, 0x0000 }, { 6995, 0x0030 }, { 6997, 0xffa8 }, { 7008, 0xb4f7 },
  { 7019, 0xadf3 }, { 7030, 0x03ff }, { 7040, 0x0120 }, { 7042, 0x0000 },
  { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 },
  /* 0x9a00 */
  { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 },
  { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0xf000 }, { 7046, 0xfffb },
  { 7061, 0x9df7 }, { 7073, 0xfdcf }, { 7086, 0x01bf }, { 7094, 0x15c3 },
  { 7101, 0x1827 }, { 7107, 0x810a }, { 7111, 0xa842 }, { 7116, 0x0a00 },
  /* 0x9b00 */
  { 7118, 0x8108 }, { 7121, 0x8008 }, { 7123, 0x8008 }, { 7125, 0x1804 },
  { 7128, 0xa3be }, { 7138, 0x0012 }, { 7140, 0x0000 }, { 7140, 0x0000 },
  { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 },
  { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 },
  /* 0x9c00 */
  { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 },
  { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x9000 },
  { 7142, 0x69e6 }, { 7151, 0xdc37 }, { 7161, 0x6bff }, { 7174, 0x3dff },
  { 7187, 0xfcf8 }, { 7198, 0xf3f9 }, { 7210, 0x0004 },
};
static const Summary16 gb2312_uni2indx_page9e[27] = {
  /* 0x9e00 */
  { 7211, 0x0000 }, { 7211, 0x8000 }, { 7212, 0xbf6f }, { 7225, 0xe7ee },
  { 7237, 0xdffe }, { 7251, 0x5da2 }, { 7259, 0x3fd8 }, { 7269, 0xc00b },
  { 7274, 0x0984 }, { 7278, 0xa00c }, { 7282, 0x0040 }, { 7283, 0x6910 },
  { 7288, 0xe210 }, { 7293, 0xb912 }, { 7300, 0x86a5 }, { 7307, 0x5a00 },
  /* 0x9f00 */
  { 7311, 0x6800 }, { 7314, 0x0289 }, { 7318, 0x9005 }, { 7322, 0x6a80 },
  { 7327, 0x0010 }, { 7328, 0x0003 }, { 7330, 0x0000 }, { 7330, 0x8000 },
  { 7331, 0x1ff9 }, { 7342, 0x8e00 }, { 7346, 0x0001 },
};
static const Summary16 gb2312_uni2indx_pageff[15] = {
  /* 0xff00 */
  { 7347, 0xfffe }, { 7362, 0xffff }, { 7378, 0xffff }, { 7394, 0xffff },
  { 7410, 0xffff }, { 7426, 0x7fff }, { 7441, 0x0000 }, { 7441, 0x0000 },
  { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 },
  { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x002b },
};

INTERNAL int gb2312_wctomb_zint(unsigned int* r, unsigned int wc) {
    const Summary16 *summary = NULL;
    if (wc >= 0x0000 && wc < 0x0460) {
        if (wc == 0x00b7) { /* ZINT: Patched to duplicate map to 0xA1A4 */
            *r = 0xA1A4;
            return 2;
        }
        summary = &gb2312_uni2indx_page00[(wc>>4)];
    } else if (wc >= 0x2000 && wc < 0x2650) {
        if (wc == 0x2014) { /* ZINT: Patched to duplicate map to 0xA1AA */
            *r = 0xA1AA;
            return 2;
        }
        summary = &gb2312_uni2indx_page20[(wc>>4)-0x200];
    } else if (wc >= 0x3000 && wc < 0x3230) {
        summary = &gb2312_uni2indx_page30[(wc>>4)-0x300];
    } else if (wc >= 0x4e00 && wc < 0x9cf0) {
        summary = &gb2312_uni2indx_page4e[(wc>>4)-0x4e0];
    } else if (wc >= 0x9e00 && wc < 0x9fb0) {
        summary = &gb2312_uni2indx_page9e[(wc>>4)-0x9e0];
    } else if (wc >= 0xff00 && wc < 0xfff0) {
        summary = &gb2312_uni2indx_pageff[(wc>>4)-0xff0];
    }
    if (summary) {
        unsigned short used = summary->used;
        unsigned int i = wc & 0x0f;
        if (used & ((unsigned short) 1 << i)) {
            /* Keep in 'used' only the bits 0..i-1. */
            used &= ((unsigned short) 1 << i) - 1;
            /* Add 'summary->indx' and the number of bits set in 'used'. */
            used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
            used = (used & 0x3333) + ((used & 0xcccc) >> 2);
            used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
            used = (used & 0x00ff) + (used >> 8);
            *r = gb2312_2charset[summary->indx + used];
            return 2;
        }
    }
    return 0;
}

/* Convert UTF-8 string to GB 2312 (EUC-CN) and place in array of ints */
INTERNAL int gb2312_utf8tomb(struct zint_symbol *symbol, const unsigned char source[], size_t* p_length, unsigned int* gbdata) {
    int i, error_number;
    unsigned int length;
#ifndef _MSC_VER
    unsigned int utfdata[*p_length + 1];
#else
    unsigned int* utfdata = (unsigned int*) _alloca((*p_length + 1) * sizeof(unsigned int));
#endif

    error_number = utf8_to_unicode(symbol, source, utfdata, p_length, 1 /*disallow_4byte*/);
    if (error_number != 0) {
        return error_number;
    }

    for (i = 0, length = *p_length; i < length; i++) {
        if (utfdata[i] < 0x80) {
            gbdata[i] = utfdata[i];
        } else {
            if (!gb2312_wctomb_zint(gbdata + i, utfdata[i])) {
                strcpy(symbol->errtxt, "810: Invalid character in input data");
                return ZINT_ERROR_INVALID_DATA;
            }
        }
    }

    return 0;
}

/* Convert UTF-8 string to single byte ECI and place in array of ints */
INTERNAL int gb2312_utf8tosb(int eci, const unsigned char source[], size_t* p_length, unsigned int* gbdata) {
    int error_number;
#ifndef _MSC_VER
    unsigned char single_byte[*p_length + 1];
#else
    unsigned char* single_byte = (unsigned char*) _alloca(*p_length + 1);
#endif

    error_number = utf_to_eci(eci, source, single_byte, p_length);
    if (error_number != 0) {
        /* Note not setting `symbol->errtxt`, up to caller */
        return error_number;
    }

    gb2312_cpy(single_byte, p_length, gbdata);

    return 0;
}

/* Copy byte input stream to array of ints, putting double-bytes that match GRIDMATRIX Chinese mode in single entry */
INTERNAL void gb2312_cpy(const unsigned char source[], size_t* p_length, unsigned int* gbdata) {
    int i, j;
    unsigned int length;
    unsigned char c1, c2;
    for (i = 0, j = 0, length = *p_length; i < length; i++, j++) {
        if (length - i >= 2) {
            c1 = source[i];
            c2 = source[i + 1];
            if (((c1 >= 0xA1 && c1 <= 0xA9) || (c1 >= 0xB0 && c1 <= 0xF7)) && c2 >= 0xA1 && c2 <= 0xFE) {
                /* This may or may not be valid GB 2312 (EUC-CN), but don't care as long as it can be encoded in GRIDMATRIX Chinese mode */
                gbdata[j] = (c1 << 8) | c2;
                i++;
            } else {
                gbdata[j] = c1;
            }
        } else {
            gbdata[j] = source[i];
        }
    }
    *p_length = j;
}
Changes to jni/zint/backend/gb2312.h.
1
2
3
4
5
6
7
8
/*  gb2312.h - Unicode to GB 2312-1980 lookup table

    libzint - the open source barcode library
    Copyright (C) 2009-2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
|







1
2
3
4
5
6
7
8
/*  gb2312.h - Unicode to GB 2312-1980 (EUC-CN)

    libzint - the open source barcode library
    Copyright (C) 2009-2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317

6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479

    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

static const unsigned short int gb2312_lookup[] = {
    0x00A4, 0xA1E8,
    0x00A7, 0xA1EC,
    0x00A8, 0xA1A7,
    0x00B0, 0xA1E3,
    0x00B1, 0xA1C0,
    0x00B7, 0xA1A4,
    0x00D7, 0xA1C1,
    0x00E0, 0xA8A4,
    0x00E1, 0xA8A2,
    0x00E8, 0xA8A8,
    0x00E9, 0xA8A6,
    0x00EA, 0xA8BA,
    0x00EC, 0xA8AC,
    0x00ED, 0xA8AA,
    0x00F2, 0xA8B0,
    0x00F3, 0xA8AE,
    0x00F7, 0xA1C2,
    0x00F9, 0xA8B4,
    0x00FA, 0xA8B2,
    0x00FC, 0xA8B9,
    0x0101, 0xA8A1,
    0x0113, 0xA8A5,
    0x011B, 0xA8A7,
    0x012B, 0xA8A9,
    0x014D, 0xA8AD,
    0x016B, 0xA8B1,
    0x01CE, 0xA8A3,
    0x01D0, 0xA8AB,
    0x01D2, 0xA8AF,
    0x01D4, 0xA8B3,
    0x01D6, 0xA8B5,
    0x01D8, 0xA8B6,
    0x01DA, 0xA8B7,
    0x01DC, 0xA8B8,
    0x02C7, 0xA1A6,
    0x02C9, 0xA1A5,
    0x0391, 0xA6A1,
    0x0392, 0xA6A2,
    0x0393, 0xA6A3,
    0x0394, 0xA6A4,
    0x0395, 0xA6A5,
    0x0396, 0xA6A6,
    0x0397, 0xA6A7,
    0x0398, 0xA6A8,
    0x0399, 0xA6A9,
    0x039A, 0xA6AA,
    0x039B, 0xA6AB,
    0x039C, 0xA6AC,
    0x039D, 0xA6AD,
    0x039E, 0xA6AE,
    0x039F, 0xA6AF,
    0x03A0, 0xA6B0,
    0x03A1, 0xA6B1,
    0x03A3, 0xA6B2,
    0x03A4, 0xA6B3,
    0x03A5, 0xA6B4,
    0x03A6, 0xA6B5,
    0x03A7, 0xA6B6,
    0x03A8, 0xA6B7,
    0x03A9, 0xA6B8,
    0x03B1, 0xA6C1,
    0x03B2, 0xA6C2,
    0x03B3, 0xA6C3,
    0x03B4, 0xA6C4,
    0x03B5, 0xA6C5,
    0x03B6, 0xA6C6,
    0x03B7, 0xA6C7,
    0x03B8, 0xA6C8,
    0x03B9, 0xA6C9,
    0x03BA, 0xA6CA,
    0x03BB, 0xA6CB,
    0x03BC, 0xA6CC,
    0x03BD, 0xA6CD,
    0x03BE, 0xA6CE,
    0x03BF, 0xA6CF,
    0x03C0, 0xA6D0,
    0x03C1, 0xA6D1,
    0x03C3, 0xA6D2,
    0x03C4, 0xA6D3,
    0x03C5, 0xA6D4,
    0x03C6, 0xA6D5,
    0x03C7, 0xA6D6,
    0x03C8, 0xA6D7,
    0x03C9, 0xA6D8,
    0x0401, 0xA7A7,
    0x0410, 0xA7A1,
    0x0411, 0xA7A2,
    0x0412, 0xA7A3,
    0x0413, 0xA7A4,
    0x0414, 0xA7A5,
    0x0415, 0xA7A6,
    0x0416, 0xA7A8,
    0x0417, 0xA7A9,
    0x0418, 0xA7AA,
    0x0419, 0xA7AB,
    0x041A, 0xA7AC,
    0x041B, 0xA7AD,
    0x041C, 0xA7AE,
    0x041D, 0xA7AF,
    0x041E, 0xA7B0,
    0x041F, 0xA7B1,
    0x0420, 0xA7B2,
    0x0421, 0xA7B3,
    0x0422, 0xA7B4,
    0x0423, 0xA7B5,
    0x0424, 0xA7B6,
    0x0425, 0xA7B7,
    0x0426, 0xA7B8,
    0x0427, 0xA7B9,
    0x0428, 0xA7BA,
    0x0429, 0xA7BB,
    0x042A, 0xA7BC,
    0x042B, 0xA7BD,
    0x042C, 0xA7BE,
    0x042D, 0xA7BF,
    0x042E, 0xA7C0,
    0x042F, 0xA7C1,
    0x0430, 0xA7D1,
    0x0431, 0xA7D2,
    0x0432, 0xA7D3,
    0x0433, 0xA7D4,
    0x0434, 0xA7D5,
    0x0435, 0xA7D6,
    0x0436, 0xA7D8,
    0x0437, 0xA7D9,
    0x0438, 0xA7DA,
    0x0439, 0xA7DB,
    0x043A, 0xA7DC,
    0x043B, 0xA7DD,
    0x043C, 0xA7DE,
    0x043D, 0xA7DF,
    0x043E, 0xA7E0,
    0x043F, 0xA7E1,
    0x0440, 0xA7E2,
    0x0441, 0xA7E3,
    0x0442, 0xA7E4,
    0x0443, 0xA7E5,
    0x0444, 0xA7E6,
    0x0445, 0xA7E7,
    0x0446, 0xA7E8,
    0x0447, 0xA7E9,
    0x0448, 0xA7EA,
    0x0449, 0xA7EB,
    0x044A, 0xA7EC,
    0x044B, 0xA7ED,
    0x044C, 0xA7EE,
    0x044D, 0xA7EF,
    0x044E, 0xA7F0,
    0x044F, 0xA7F1,
    0x0451, 0xA7D7,
    0x2014, 0xA1AA,
    0x2016, 0xA1AC,
    0x2018, 0xA1AE,
    0x2019, 0xA1AF,
    0x201C, 0xA1B0,
    0x201D, 0xA1B1,
    0x2026, 0xA1AD,
    0x2030, 0xA1EB,
    0x2032, 0xA1E4,
    0x2033, 0xA1E5,
    0x203B, 0xA1F9,
    0x2103, 0xA1E6,
    0x2116, 0xA1ED,
    0x2160, 0xA2F1,
    0x2161, 0xA2F2,
    0x2162, 0xA2F3,
    0x2163, 0xA2F4,
    0x2164, 0xA2F5,
    0x2165, 0xA2F6,
    0x2166, 0xA2F7,
    0x2167, 0xA2F8,
    0x2168, 0xA2F9,
    0x2169, 0xA2FA,
    0x216A, 0xA2FB,
    0x216B, 0xA2FC,
    0x2190, 0xA1FB,
    0x2191, 0xA1FC,
    0x2192, 0xA1FA,
    0x2193, 0xA1FD,
    0x2208, 0xA1CA,
    0x220F, 0xA1C7,
    0x2211, 0xA1C6,
    0x221A, 0xA1CC,
    0x221D, 0xA1D8,
    0x221E, 0xA1DE,
    0x2220, 0xA1CF,
    0x2225, 0xA1CE,
    0x2227, 0xA1C4,
    0x2228, 0xA1C5,
    0x2229, 0xA1C9,
    0x222A, 0xA1C8,
    0x222B, 0xA1D2,
    0x222E, 0xA1D3,
    0x2234, 0xA1E0,
    0x2235, 0xA1DF,
    0x2236, 0xA1C3,
    0x2237, 0xA1CB,
    0x223D, 0xA1D7,
    0x2248, 0xA1D6,
    0x224C, 0xA1D5,
    0x2260, 0xA1D9,
    0x2261, 0xA1D4,
    0x2264, 0xA1DC,
    0x2265, 0xA1DD,
    0x226E, 0xA1DA,
    0x226F, 0xA1DB,
    0x2299, 0xA1D1,
    0x22A5, 0xA1CD,
    0x2312, 0xA1D0,
    0x2460, 0xA2D9,
    0x2461, 0xA2DA,
    0x2462, 0xA2DB,
    0x2463, 0xA2DC,
    0x2464, 0xA2DD,
    0x2465, 0xA2DE,
    0x2466, 0xA2DF,
    0x2467, 0xA2E0,
    0x2468, 0xA2E1,
    0x2469, 0xA2E2,
    0x2474, 0xA2C5,
    0x2475, 0xA2C6,
    0x2476, 0xA2C7,
    0x2477, 0xA2C8,
    0x2478, 0xA2C9,
    0x2479, 0xA2CA,
    0x247A, 0xA2CB,
    0x247B, 0xA2CC,
    0x247C, 0xA2CD,
    0x247D, 0xA2CE,
    0x247E, 0xA2CF,
    0x247F, 0xA2D0,
    0x2480, 0xA2D1,
    0x2481, 0xA2D2,
    0x2482, 0xA2D3,
    0x2483, 0xA2D4,
    0x2484, 0xA2D5,
    0x2485, 0xA2D6,
    0x2486, 0xA2D7,
    0x2487, 0xA2D8,
    0x2488, 0xA2B1,
    0x2489, 0xA2B2,
    0x248A, 0xA2B3,
    0x248B, 0xA2B4,
    0x248C, 0xA2B5,
    0x248D, 0xA2B6,
    0x248E, 0xA2B7,
    0x248F, 0xA2B8,
    0x2490, 0xA2B9,
    0x2491, 0xA2BA,
    0x2492, 0xA2BB,
    0x2493, 0xA2BC,
    0x2494, 0xA2BD,
    0x2495, 0xA2BE,
    0x2496, 0xA2BF,
    0x2497, 0xA2C0,
    0x2498, 0xA2C1,
    0x2499, 0xA2C2,
    0x249A, 0xA2C3,
    0x249B, 0xA2C4,
    0x2500, 0xA9A4,
    0x2501, 0xA9A5,
    0x2502, 0xA9A6,
    0x2503, 0xA9A7,
    0x2504, 0xA9A8,
    0x2505, 0xA9A9,
    0x2506, 0xA9AA,
    0x2507, 0xA9AB,
    0x2508, 0xA9AC,
    0x2509, 0xA9AD,
    0x250A, 0xA9AE,
    0x250B, 0xA9AF,
    0x250C, 0xA9B0,
    0x250D, 0xA9B1,
    0x250E, 0xA9B2,
    0x250F, 0xA9B3,
    0x2510, 0xA9B4,
    0x2511, 0xA9B5,
    0x2512, 0xA9B6,
    0x2513, 0xA9B7,
    0x2514, 0xA9B8,
    0x2515, 0xA9B9,
    0x2516, 0xA9BA,
    0x2517, 0xA9BB,
    0x2518, 0xA9BC,
    0x2519, 0xA9BD,
    0x251A, 0xA9BE,
    0x251B, 0xA9BF,
    0x251C, 0xA9C0,
    0x251D, 0xA9C1,
    0x251E, 0xA9C2,
    0x251F, 0xA9C3,
    0x2520, 0xA9C4,
    0x2521, 0xA9C5,
    0x2522, 0xA9C6,
    0x2523, 0xA9C7,
    0x2524, 0xA9C8,
    0x2525, 0xA9C9,
    0x2526, 0xA9CA,
    0x2527, 0xA9CB,
    0x2528, 0xA9CC,
    0x2529, 0xA9CD,
    0x252A, 0xA9CE,
    0x252B, 0xA9CF,
    0x252C, 0xA9D0,
    0x252D, 0xA9D1,
    0x252E, 0xA9D2,
    0x252F, 0xA9D3,
    0x2530, 0xA9D4,
    0x2531, 0xA9D5,
    0x2532, 0xA9D6,
    0x2533, 0xA9D7,
    0x2534, 0xA9D8,
    0x2535, 0xA9D9,
    0x2536, 0xA9DA,
    0x2537, 0xA9DB,
    0x2538, 0xA9DC,
    0x2539, 0xA9DD,
    0x253A, 0xA9DE,
    0x253B, 0xA9DF,
    0x253C, 0xA9E0,
    0x253D, 0xA9E1,
    0x253E, 0xA9E2,
    0x253F, 0xA9E3,
    0x2540, 0xA9E4,
    0x2541, 0xA9E5,
    0x2542, 0xA9E6,
    0x2543, 0xA9E7,
    0x2544, 0xA9E8,
    0x2545, 0xA9E9,
    0x2546, 0xA9EA,
    0x2547, 0xA9EB,
    0x2548, 0xA9EC,
    0x2549, 0xA9ED,
    0x254A, 0xA9EE,
    0x254B, 0xA9EF,
    0x25A0, 0xA1F6,
    0x25A1, 0xA1F5,
    0x25B2, 0xA1F8,
    0x25B3, 0xA1F7,
    0x25C6, 0xA1F4,
    0x25C7, 0xA1F3,
    0x25CB, 0xA1F0,
    0x25CE, 0xA1F2,
    0x25CF, 0xA1F1,
    0x2605, 0xA1EF,
    0x2606, 0xA1EE,
    0x2640, 0xA1E2,
    0x2642, 0xA1E1,
    0x3000, 0xA1A1,
    0x3001, 0xA1A2,
    0x3002, 0xA1A3,
    0x3003, 0xA1A8,
    0x3005, 0xA1A9,
    0x3008, 0xA1B4,
    0x3009, 0xA1B5,
    0x300A, 0xA1B6,
    0x300B, 0xA1B7,
    0x300C, 0xA1B8,
    0x300D, 0xA1B9,
    0x300E, 0xA1BA,
    0x300F, 0xA1BB,
    0x3010, 0xA1BE,
    0x3011, 0xA1BF,
    0x3013, 0xA1FE,
    0x3014, 0xA1B2,
    0x3015, 0xA1B3,
    0x3016, 0xA1BC,
    0x3017, 0xA1BD,
    0x3041, 0xA4A1,
    0x3042, 0xA4A2,
    0x3043, 0xA4A3,
    0x3044, 0xA4A4,
    0x3045, 0xA4A5,
    0x3046, 0xA4A6,
    0x3047, 0xA4A7,
    0x3048, 0xA4A8,
    0x3049, 0xA4A9,
    0x304A, 0xA4AA,
    0x304B, 0xA4AB,
    0x304C, 0xA4AC,
    0x304D, 0xA4AD,
    0x304E, 0xA4AE,
    0x304F, 0xA4AF,
    0x3050, 0xA4B0,
    0x3051, 0xA4B1,
    0x3052, 0xA4B2,
    0x3053, 0xA4B3,
    0x3054, 0xA4B4,
    0x3055, 0xA4B5,
    0x3056, 0xA4B6,
    0x3057, 0xA4B7,
    0x3058, 0xA4B8,
    0x3059, 0xA4B9,
    0x305A, 0xA4BA,
    0x305B, 0xA4BB,
    0x305C, 0xA4BC,
    0x305D, 0xA4BD,
    0x305E, 0xA4BE,
    0x305F, 0xA4BF,
    0x3060, 0xA4C0,
    0x3061, 0xA4C1,
    0x3062, 0xA4C2,
    0x3063, 0xA4C3,
    0x3064, 0xA4C4,
    0x3065, 0xA4C5,
    0x3066, 0xA4C6,
    0x3067, 0xA4C7,
    0x3068, 0xA4C8,
    0x3069, 0xA4C9,
    0x306A, 0xA4CA,
    0x306B, 0xA4CB,
    0x306C, 0xA4CC,
    0x306D, 0xA4CD,
    0x306E, 0xA4CE,
    0x306F, 0xA4CF,
    0x3070, 0xA4D0,
    0x3071, 0xA4D1,
    0x3072, 0xA4D2,
    0x3073, 0xA4D3,
    0x3074, 0xA4D4,
    0x3075, 0xA4D5,
    0x3076, 0xA4D6,
    0x3077, 0xA4D7,
    0x3078, 0xA4D8,
    0x3079, 0xA4D9,
    0x307A, 0xA4DA,
    0x307B, 0xA4DB,
    0x307C, 0xA4DC,
    0x307D, 0xA4DD,
    0x307E, 0xA4DE,
    0x307F, 0xA4DF,
    0x3080, 0xA4E0,
    0x3081, 0xA4E1,
    0x3082, 0xA4E2,
    0x3083, 0xA4E3,
    0x3084, 0xA4E4,
    0x3085, 0xA4E5,
    0x3086, 0xA4E6,
    0x3087, 0xA4E7,
    0x3088, 0xA4E8,
    0x3089, 0xA4E9,
    0x308A, 0xA4EA,
    0x308B, 0xA4EB,
    0x308C, 0xA4EC,
    0x308D, 0xA4ED,
    0x308E, 0xA4EE,
    0x308F, 0xA4EF,
    0x3090, 0xA4F0,
    0x3091, 0xA4F1,
    0x3092, 0xA4F2,
    0x3093, 0xA4F3,
    0x30A1, 0xA5A1,
    0x30A2, 0xA5A2,
    0x30A3, 0xA5A3,
    0x30A4, 0xA5A4,
    0x30A5, 0xA5A5,
    0x30A6, 0xA5A6,
    0x30A7, 0xA5A7,
    0x30A8, 0xA5A8,
    0x30A9, 0xA5A9,
    0x30AA, 0xA5AA,
    0x30AB, 0xA5AB,
    0x30AC, 0xA5AC,
    0x30AD, 0xA5AD,
    0x30AE, 0xA5AE,
    0x30AF, 0xA5AF,
    0x30B0, 0xA5B0,
    0x30B1, 0xA5B1,
    0x30B2, 0xA5B2,
    0x30B3, 0xA5B3,
    0x30B4, 0xA5B4,
    0x30B5, 0xA5B5,
    0x30B6, 0xA5B6,
    0x30B7, 0xA5B7,
    0x30B8, 0xA5B8,
    0x30B9, 0xA5B9,
    0x30BA, 0xA5BA,
    0x30BB, 0xA5BB,
    0x30BC, 0xA5BC,
    0x30BD, 0xA5BD,
    0x30BE, 0xA5BE,
    0x30BF, 0xA5BF,
    0x30C0, 0xA5C0,
    0x30C1, 0xA5C1,
    0x30C2, 0xA5C2,
    0x30C3, 0xA5C3,
    0x30C4, 0xA5C4,
    0x30C5, 0xA5C5,
    0x30C6, 0xA5C6,
    0x30C7, 0xA5C7,
    0x30C8, 0xA5C8,
    0x30C9, 0xA5C9,
    0x30CA, 0xA5CA,
    0x30CB, 0xA5CB,
    0x30CC, 0xA5CC,
    0x30CD, 0xA5CD,
    0x30CE, 0xA5CE,
    0x30CF, 0xA5CF,
    0x30D0, 0xA5D0,
    0x30D1, 0xA5D1,
    0x30D2, 0xA5D2,
    0x30D3, 0xA5D3,
    0x30D4, 0xA5D4,
    0x30D5, 0xA5D5,
    0x30D6, 0xA5D6,
    0x30D7, 0xA5D7,
    0x30D8, 0xA5D8,
    0x30D9, 0xA5D9,
    0x30DA, 0xA5DA,
    0x30DB, 0xA5DB,
    0x30DC, 0xA5DC,
    0x30DD, 0xA5DD,
    0x30DE, 0xA5DE,
    0x30DF, 0xA5DF,
    0x30E0, 0xA5E0,
    0x30E1, 0xA5E1,
    0x30E2, 0xA5E2,
    0x30E3, 0xA5E3,
    0x30E4, 0xA5E4,
    0x30E5, 0xA5E5,
    0x30E6, 0xA5E6,
    0x30E7, 0xA5E7,
    0x30E8, 0xA5E8,
    0x30E9, 0xA5E9,
    0x30EA, 0xA5EA,
    0x30EB, 0xA5EB,
    0x30EC, 0xA5EC,
    0x30ED, 0xA5ED,
    0x30EE, 0xA5EE,
    0x30EF, 0xA5EF,
    0x30F0, 0xA5F0,
    0x30F1, 0xA5F1,
    0x30F2, 0xA5F2,
    0x30F3, 0xA5F3,
    0x30F4, 0xA5F4,
    0x30F5, 0xA5F5,
    0x30F6, 0xA5F6,
    0x3105, 0xA8C5,
    0x3106, 0xA8C6,
    0x3107, 0xA8C7,
    0x3108, 0xA8C8,
    0x3109, 0xA8C9,
    0x310A, 0xA8CA,
    0x310B, 0xA8CB,
    0x310C, 0xA8CC,
    0x310D, 0xA8CD,
    0x310E, 0xA8CE,
    0x310F, 0xA8CF,
    0x3110, 0xA8D0,
    0x3111, 0xA8D1,
    0x3112, 0xA8D2,
    0x3113, 0xA8D3,
    0x3114, 0xA8D4,
    0x3115, 0xA8D5,
    0x3116, 0xA8D6,
    0x3117, 0xA8D7,
    0x3118, 0xA8D8,
    0x3119, 0xA8D9,
    0x311A, 0xA8DA,
    0x311B, 0xA8DB,
    0x311C, 0xA8DC,
    0x311D, 0xA8DD,
    0x311E, 0xA8DE,
    0x311F, 0xA8DF,
    0x3120, 0xA8E0,
    0x3121, 0xA8E1,
    0x3122, 0xA8E2,
    0x3123, 0xA8E3,
    0x3124, 0xA8E4,
    0x3125, 0xA8E5,
    0x3126, 0xA8E6,
    0x3127, 0xA8E7,
    0x3128, 0xA8E8,
    0x3129, 0xA8E9,
    0x3220, 0xA2E5,
    0x3221, 0xA2E6,
    0x3222, 0xA2E7,
    0x3223, 0xA2E8,
    0x3224, 0xA2E9,
    0x3225, 0xA2EA,
    0x3226, 0xA2EB,
    0x3227, 0xA2EC,
    0x3228, 0xA2ED,
    0x3229, 0xA2EE,
    0x4E00, 0xD2BB,
    0x4E01, 0xB6A1,
    0x4E03, 0xC6DF,
    0x4E07, 0xCDF2,
    0x4E08, 0xD5C9,
    0x4E09, 0xC8FD,
    0x4E0A, 0xC9CF,
    0x4E0B, 0xCFC2,
    0x4E0C, 0xD8A2,
    0x4E0D, 0xB2BB,
    0x4E0E, 0xD3EB,
    0x4E10, 0xD8A4,
    0x4E11, 0xB3F3,
    0x4E13, 0xD7A8,
    0x4E14, 0xC7D2,
    0x4E15, 0xD8A7,
    0x4E16, 0xCAC0,
    0x4E18, 0xC7F0,
    0x4E19, 0xB1FB,
    0x4E1A, 0xD2B5,
    0x4E1B, 0xB4D4,
    0x4E1C, 0xB6AB,
    0x4E1D, 0xCBBF,
    0x4E1E, 0xD8A9,
    0x4E22, 0xB6AA,
    0x4E24, 0xC1BD,
    0x4E25, 0xD1CF,
    0x4E27, 0xC9A5,
    0x4E28, 0xD8AD,
    0x4E2A, 0xB8F6,
    0x4E2B, 0xD1BE,
    0x4E2C, 0xE3DC,
    0x4E2D, 0xD6D0,
    0x4E30, 0xB7E1,
    0x4E32, 0xB4AE,
    0x4E34, 0xC1D9,
    0x4E36, 0xD8BC,
    0x4E38, 0xCDE8,
    0x4E39, 0xB5A4,
    0x4E3A, 0xCEAA,
    0x4E3B, 0xD6F7,
    0x4E3D, 0xC0F6,
    0x4E3E, 0xBED9,
    0x4E3F, 0xD8AF,
    0x4E43, 0xC4CB,
    0x4E45, 0xBEC3,
    0x4E47, 0xD8B1,
    0x4E48, 0xC3B4,
    0x4E49, 0xD2E5,
    0x4E4B, 0xD6AE,
    0x4E4C, 0xCEDA,
    0x4E4D, 0xD5A7,
    0x4E4E, 0xBAF5,
    0x4E4F, 0xB7A6,
    0x4E50, 0xC0D6,
    0x4E52, 0xC6B9,
    0x4E53, 0xC5D2,
    0x4E54, 0xC7C7,
    0x4E56, 0xB9D4,
    0x4E58, 0xB3CB,
    0x4E59, 0xD2D2,
    0x4E5C, 0xD8BF,
    0x4E5D, 0xBEC5,
    0x4E5E, 0xC6F2,
    0x4E5F, 0xD2B2,
    0x4E60, 0xCFB0,
    0x4E61, 0xCFE7,
    0x4E66, 0xCAE9,
    0x4E69, 0xD8C0,
    0x4E70, 0xC2F2,
    0x4E71, 0xC2D2,
    0x4E73, 0xC8E9,
    0x4E7E, 0xC7AC,
    0x4E86, 0xC1CB,
    0x4E88, 0xD3E8,
    0x4E89, 0xD5F9,
    0x4E8B, 0xCAC2,
    0x4E8C, 0xB6FE,
    0x4E8D, 0xD8A1,
    0x4E8E, 0xD3DA,
    0x4E8F, 0xBFF7,
    0x4E91, 0xD4C6,
    0x4E92, 0xBBA5,
    0x4E93, 0xD8C1,
    0x4E94, 0xCEE5,
    0x4E95, 0xBEAE,
    0x4E98, 0xD8A8,
    0x4E9A, 0xD1C7,
    0x4E9B, 0xD0A9,
    0x4E9F, 0xD8BD,
    0x4EA0, 0xD9EF,
    0x4EA1, 0xCDF6,
    0x4EA2, 0xBFBA,
    0x4EA4, 0xBDBB,
    0x4EA5, 0xBAA5,
    0x4EA6, 0xD2E0,
    0x4EA7, 0xB2FA,
    0x4EA8, 0xBAE0,
    0x4EA9, 0xC4B6,
    0x4EAB, 0xCFED,
    0x4EAC, 0xBEA9,
    0x4EAD, 0xCDA4,
    0x4EAE, 0xC1C1,
    0x4EB2, 0xC7D7,
    0x4EB3, 0xD9F1,
    0x4EB5, 0xD9F4,
    0x4EBA, 0xC8CB,
    0x4EBB, 0xD8E9,
    0x4EBF, 0xD2DA,
    0x4EC0, 0xCAB2,
    0x4EC1, 0xC8CA,
    0x4EC2, 0xD8EC,
    0x4EC3, 0xD8EA,
    0x4EC4, 0xD8C6,
    0x4EC5, 0xBDF6,
    0x4EC6, 0xC6CD,
    0x4EC7, 0xB3F0,
    0x4EC9, 0xD8EB,
    0x4ECA, 0xBDF1,
    0x4ECB, 0xBDE9,
    0x4ECD, 0xC8D4,
    0x4ECE, 0xB4D3,
    0x4ED1, 0xC2D8,
    0x4ED3, 0xB2D6,
    0x4ED4, 0xD7D0,
    0x4ED5, 0xCACB,
    0x4ED6, 0xCBFB,
    0x4ED7, 0xD5CC,
    0x4ED8, 0xB8B6,
    0x4ED9, 0xCFC9,
    0x4EDD, 0xD9DA,
    0x4EDE, 0xD8F0,
    0x4EDF, 0xC7AA,
    0x4EE1, 0xD8EE,
    0x4EE3, 0xB4FA,
    0x4EE4, 0xC1EE,
    0x4EE5, 0xD2D4,
    0x4EE8, 0xD8ED,
    0x4EEA, 0xD2C7,
    0x4EEB, 0xD8EF,
    0x4EEC, 0xC3C7,
    0x4EF0, 0xD1F6,
    0x4EF2, 0xD6D9,
    0x4EF3, 0xD8F2,
    0x4EF5, 0xD8F5,
    0x4EF6, 0xBCFE,
    0x4EF7, 0xBCDB,
    0x4EFB, 0xC8CE,
    0x4EFD, 0xB7DD,
    0x4EFF, 0xB7C2,
    0x4F01, 0xC6F3,
    0x4F09, 0xD8F8,
    0x4F0A, 0xD2C1,
    0x4F0D, 0xCEE9,
    0x4F0E, 0xBCBF,
    0x4F0F, 0xB7FC,
    0x4F10, 0xB7A5,
    0x4F11, 0xD0DD,
    0x4F17, 0xD6DA,
    0x4F18, 0xD3C5,
    0x4F19, 0xBBEF,
    0x4F1A, 0xBBE1,
    0x4F1B, 0xD8F1,
    0x4F1E, 0xC9A1,
    0x4F1F, 0xCEB0,
    0x4F20, 0xB4AB,
    0x4F22, 0xD8F3,
    0x4F24, 0xC9CB,
    0x4F25, 0xD8F6,
    0x4F26, 0xC2D7,
    0x4F27, 0xD8F7,
    0x4F2A, 0xCEB1,
    0x4F2B, 0xD8F9,
    0x4F2F, 0xB2AE,
    0x4F30, 0xB9C0,
    0x4F32, 0xD9A3,
    0x4F34, 0xB0E9,
    0x4F36, 0xC1E6,
    0x4F38, 0xC9EC,
    0x4F3A, 0xCBC5,
    0x4F3C, 0xCBC6,
    0x4F3D, 0xD9A4,
    0x4F43, 0xB5E8,
    0x4F46, 0xB5AB,
    0x4F4D, 0xCEBB,
    0x4F4E, 0xB5CD,
    0x4F4F, 0xD7A1,
    0x4F50, 0xD7F4,
    0x4F51, 0xD3D3,
    0x4F53, 0xCCE5,
    0x4F55, 0xBACE,
    0x4F57, 0xD9A2,
    0x4F58, 0xD9DC,
    0x4F59, 0xD3E0,
    0x4F5A, 0xD8FD,
    0x4F5B, 0xB7F0,
    0x4F5C, 0xD7F7,
    0x4F5D, 0xD8FE,
    0x4F5E, 0xD8FA,
    0x4F5F, 0xD9A1,
    0x4F60, 0xC4E3,
    0x4F63, 0xD3B6,
    0x4F64, 0xD8F4,
    0x4F65, 0xD9DD,
    0x4F67, 0xD8FB,
    0x4F69, 0xC5E5,
    0x4F6C, 0xC0D0,
    0x4F6F, 0xD1F0,
    0x4F70, 0xB0DB,
    0x4F73, 0xBCD1,
    0x4F74, 0xD9A6,
    0x4F76, 0xD9A5,
    0x4F7B, 0xD9AC,
    0x4F7C, 0xD9AE,
    0x4F7E, 0xD9AB,
    0x4F7F, 0xCAB9,
    0x4F83, 0xD9A9,
    0x4F84, 0xD6B6,
    0x4F88, 0xB3DE,
    0x4F89, 0xD9A8,
    0x4F8B, 0xC0FD,
    0x4F8D, 0xCACC,
    0x4F8F, 0xD9AA,
    0x4F91, 0xD9A7,
    0x4F94, 0xD9B0,
    0x4F97, 0xB6B1,
    0x4F9B, 0xB9A9,
    0x4F9D, 0xD2C0,
    0x4FA0, 0xCFC0,
    0x4FA3, 0xC2C2,
    0x4FA5, 0xBDC4,
    0x4FA6, 0xD5EC,
    0x4FA7, 0xB2E0,
    0x4FA8, 0xC7C8,
    0x4FA9, 0xBFEB,
    0x4FAA, 0xD9AD,
    0x4FAC, 0xD9AF,
    0x4FAE, 0xCEEA,
    0x4FAF, 0xBAEE,
    0x4FB5, 0xC7D6,
    0x4FBF, 0xB1E3,
    0x4FC3, 0xB4D9,
    0x4FC4, 0xB6ED,
    0x4FC5, 0xD9B4,
    0x4FCA, 0xBFA1,
    0x4FCE, 0xD9DE,
    0x4FCF, 0xC7CE,
    0x4FD0, 0xC0FE,
    0x4FD1, 0xD9B8,
    0x4FD7, 0xCBD7,
    0x4FD8, 0xB7FD,
    0x4FDA, 0xD9B5,
    0x4FDC, 0xD9B7,
    0x4FDD, 0xB1A3,
    0x4FDE, 0xD3E1,
    0x4FDF, 0xD9B9,
    0x4FE1, 0xD0C5,
    0x4FE3, 0xD9B6,
    0x4FE6, 0xD9B1,
    0x4FE8, 0xD9B2,
    0x4FE9, 0xC1A9,
    0x4FEA, 0xD9B3,
    0x4FED, 0xBCF3,
    0x4FEE, 0xD0DE,
    0x4FEF, 0xB8A9,
    0x4FF1, 0xBEE3,
    0x4FF3, 0xD9BD,
    0x4FF8, 0xD9BA,
    0x4FFA, 0xB0B3,
    0x4FFE, 0xD9C2,
    0x500C, 0xD9C4,
    0x500D, 0xB1B6,
    0x500F, 0xD9BF,
    0x5012, 0xB5B9,
    0x5014, 0xBEF3,
    0x5018, 0xCCC8,
    0x5019, 0xBAF2,
    0x501A, 0xD2D0,
    0x501C, 0xD9C3,
    0x501F, 0xBDE8,
    0x5021, 0xB3AB,
    0x5025, 0xD9C5,
    0x5026, 0xBEEB,
    0x5028, 0xD9C6,
    0x5029, 0xD9BB,
    0x502A, 0xC4DF,
    0x502C, 0xD9BE,
    0x502D, 0xD9C1,
    0x502E, 0xD9C0,
    0x503A, 0xD5AE,
    0x503C, 0xD6B5,
    0x503E, 0xC7E3,
    0x5043, 0xD9C8,
    0x5047, 0xBCD9,
    0x5048, 0xD9CA,
    0x504C, 0xD9BC,
    0x504E, 0xD9CB,
    0x504F, 0xC6AB,
    0x5055, 0xD9C9,
    0x505A, 0xD7F6,
    0x505C, 0xCDA3,
    0x5065, 0xBDA1,
    0x506C, 0xD9CC,
    0x5076, 0xC5BC,
    0x5077, 0xCDB5,
    0x507B, 0xD9CD,
    0x507E, 0xD9C7,
    0x507F, 0xB3A5,
    0x5080, 0xBFFE,
    0x5085, 0xB8B5,
    0x5088, 0xC0FC,
    0x508D, 0xB0F8,
    0x50A3, 0xB4F6,
    0x50A5, 0xD9CE,
    0x50A7, 0xD9CF,
    0x50A8, 0xB4A2,
    0x50A9, 0xD9D0,
    0x50AC, 0xB4DF,
    0x50B2, 0xB0C1,
    0x50BA, 0xD9D1,
    0x50BB, 0xC9B5,
    0x50CF, 0xCFF1,
    0x50D6, 0xD9D2,
    0x50DA, 0xC1C5,
    0x50E6, 0xD9D6,
    0x50E7, 0xC9AE,
    0x50EC, 0xD9D5,
    0x50ED, 0xD9D4,
    0x50EE, 0xD9D7,
    0x50F3, 0xCBDB,
    0x50F5, 0xBDA9,
    0x50FB, 0xC6A7,
    0x5106, 0xD9D3,
    0x5107, 0xD9D8,
    0x510B, 0xD9D9,
    0x5112, 0xC8E5,
    0x5121, 0xC0DC,
    0x513F, 0xB6F9,
    0x5140, 0xD8A3,
    0x5141, 0xD4CA,
    0x5143, 0xD4AA,
    0x5144, 0xD0D6,
    0x5145, 0xB3E4,
    0x5146, 0xD5D7,
    0x5148, 0xCFC8,
    0x5149, 0xB9E2,
    0x514B, 0xBFCB,
    0x514D, 0xC3E2,
    0x5151, 0xB6D2,
    0x5154, 0xCDC3,
    0x5155, 0xD9EE,
    0x5156, 0xD9F0,
    0x515A, 0xB5B3,
    0x515C, 0xB6B5,
    0x5162, 0xBEA4,
    0x5165, 0xC8EB,
    0x5168, 0xC8AB,
    0x516B, 0xB0CB,
    0x516C, 0xB9AB,
    0x516D, 0xC1F9,
    0x516E, 0xD9E2,
    0x5170, 0xC0BC,
    0x5171, 0xB9B2,
    0x5173, 0xB9D8,
    0x5174, 0xD0CB,
    0x5175, 0xB1F8,
    0x5176, 0xC6E4,
    0x5177, 0xBEDF,
    0x5178, 0xB5E4,
    0x5179, 0xD7C8,
    0x517B, 0xD1F8,
    0x517C, 0xBCE6,
    0x517D, 0xCADE,
    0x5180, 0xBCBD,
    0x5181, 0xD9E6,
    0x5182, 0xD8E7,
    0x5185, 0xC4DA,
    0x5188, 0xB8D4,
    0x5189, 0xC8BD,
    0x518C, 0xB2E1,
    0x518D, 0xD4D9,
    0x5192, 0xC3B0,
    0x5195, 0xC3E1,
    0x5196, 0xDAA2,
    0x5197, 0xC8DF,
    0x5199, 0xD0B4,
    0x519B, 0xBEFC,
    0x519C, 0xC5A9,
    0x51A0, 0xB9DA,
    0x51A2, 0xDAA3,
    0x51A4, 0xD4A9,
    0x51A5, 0xDAA4,
    0x51AB, 0xD9FB,
    0x51AC, 0xB6AC,
    0x51AF, 0xB7EB,
    0x51B0, 0xB1F9,
    0x51B1, 0xD9FC,
    0x51B2, 0xB3E5,
    0x51B3, 0xBEF6,
    0x51B5, 0xBFF6,
    0x51B6, 0xD2B1,
    0x51B7, 0xC0E4,
    0x51BB, 0xB6B3,
    0x51BC, 0xD9FE,
    0x51BD, 0xD9FD,
    0x51C0, 0xBEBB,
    0x51C4, 0xC6E0,
    0x51C6, 0xD7BC,
    0x51C7, 0xDAA1,
    0x51C9, 0xC1B9,
    0x51CB, 0xB5F2,
    0x51CC, 0xC1E8,
    0x51CF, 0xBCF5,
    0x51D1, 0xB4D5,
    0x51DB, 0xC1DD,
    0x51DD, 0xC4FD,
    0x51E0, 0xBCB8,
    0x51E1, 0xB7B2,
    0x51E4, 0xB7EF,
    0x51EB, 0xD9EC,
    0x51ED, 0xC6BE,
    0x51EF, 0xBFAD,
    0x51F0, 0xBBCB,
    0x51F3, 0xB5CA,
    0x51F5, 0xDBC9,
    0x51F6, 0xD0D7,
    0x51F8, 0xCDB9,
    0x51F9, 0xB0BC,
    0x51FA, 0xB3F6,
    0x51FB, 0xBBF7,
    0x51FC, 0xDBCA,
    0x51FD, 0xBAAF,
    0x51FF, 0xD4E4,
    0x5200, 0xB5B6,
    0x5201, 0xB5F3,
    0x5202, 0xD8D6,
    0x5203, 0xC8D0,
    0x5206, 0xB7D6,
    0x5207, 0xC7D0,
    0x5208, 0xD8D7,
    0x520A, 0xBFAF,
    0x520D, 0xDBBB,
    0x520E, 0xD8D8,
    0x5211, 0xD0CC,
    0x5212, 0xBBAE,
    0x5216, 0xEBBE,
    0x5217, 0xC1D0,
    0x5218, 0xC1F5,
    0x5219, 0xD4F2,
    0x521A, 0xB8D5,
    0x521B, 0xB4B4,
    0x521D, 0xB3F5,
    0x5220, 0xC9BE,
    0x5224, 0xC5D0,
    0x5228, 0xC5D9,
    0x5229, 0xC0FB,
    0x522B, 0xB1F0,
    0x522D, 0xD8D9,
    0x522E, 0xB9CE,
    0x5230, 0xB5BD,
    0x5233, 0xD8DA,
    0x5236, 0xD6C6,
    0x5237, 0xCBA2,
    0x5238, 0xC8AF,
    0x5239, 0xC9B2,
    0x523A, 0xB4CC,
    0x523B, 0xBFCC,
    0x523D, 0xB9F4,
    0x523F, 0xD8DB,
    0x5240, 0xD8DC,
    0x5241, 0xB6E7,
    0x5242, 0xBCC1,
    0x5243, 0xCCEA,
    0x524A, 0xCFF7,
    0x524C, 0xD8DD,
    0x524D, 0xC7B0,
    0x5250, 0xB9D0,
    0x5251, 0xBDA3,
    0x5254, 0xCCDE,
    0x5256, 0xC6CA,
    0x525C, 0xD8E0,
    0x525E, 0xD8DE,
    0x5261, 0xD8DF,
    0x5265, 0xB0FE,
    0x5267, 0xBEE7,
    0x5269, 0xCAA3,
    0x526A, 0xBCF4,
    0x526F, 0xB8B1,
    0x5272, 0xB8EE,
    0x527D, 0xD8E2,
    0x527F, 0xBDCB,
    0x5281, 0xD8E4,
    0x5282, 0xD8E3,
    0x5288, 0xC5FC,
    0x5290, 0xD8E5,
    0x5293, 0xD8E6,
    0x529B, 0xC1A6,
    0x529D, 0xC8B0,
    0x529E, 0xB0EC,
    0x529F, 0xB9A6,
    0x52A0, 0xBCD3,
    0x52A1, 0xCEF1,
    0x52A2, 0xDBBD,
    0x52A3, 0xC1D3,
    0x52A8, 0xB6AF,
    0x52A9, 0xD6FA,
    0x52AA, 0xC5AC,
    0x52AB, 0xBDD9,
    0x52AC, 0xDBBE,
    0x52AD, 0xDBBF,
    0x52B1, 0xC0F8,
    0x52B2, 0xBEA2,
    0x52B3, 0xC0CD,
    0x52BE, 0xDBC0,
    0x52BF, 0xCAC6,
    0x52C3, 0xB2AA,
    0x52C7, 0xD3C2,
    0x52C9, 0xC3E3,
    0x52CB, 0xD1AB,
    0x52D0, 0xDBC2,
    0x52D2, 0xC0D5,
    0x52D6, 0xDBC3,
    0x52D8, 0xBFB1,
    0x52DF, 0xC4BC,
    0x52E4, 0xC7DA,
    0x52F0, 0xDBC4,
    0x52F9, 0xD9E8,
    0x52FA, 0xC9D7,
    0x52FE, 0xB9B4,
    0x52FF, 0xCEF0,
    0x5300, 0xD4C8,
    0x5305, 0xB0FC,
    0x5306, 0xB4D2,
    0x5308, 0xD0D9,
    0x530D, 0xD9E9,
    0x530F, 0xDECB,
    0x5310, 0xD9EB,
    0x5315, 0xD8B0,
    0x5316, 0xBBAF,
    0x5317, 0xB1B1,
    0x5319, 0xB3D7,
    0x531A, 0xD8CE,
    0x531D, 0xD4D1,
    0x5320, 0xBDB3,
    0x5321, 0xBFEF,
    0x5323, 0xCFBB,
    0x5326, 0xD8D0,
    0x532A, 0xB7CB,
    0x532E, 0xD8D1,
    0x5339, 0xC6A5,
    0x533A, 0xC7F8,
    0x533B, 0xD2BD,
    0x533E, 0xD8D2,
    0x533F, 0xC4E4,
    0x5341, 0xCAAE,
    0x5343, 0xC7A7,
    0x5345, 0xD8A6,
    0x5347, 0xC9FD,
    0x5348, 0xCEE7,
    0x5349, 0xBBDC,
    0x534A, 0xB0EB,
    0x534E, 0xBBAA,
    0x534F, 0xD0AD,
    0x5351, 0xB1B0,
    0x5352, 0xD7E4,
    0x5353, 0xD7BF,
    0x5355, 0xB5A5,
    0x5356, 0xC2F4,
    0x5357, 0xC4CF,
    0x535A, 0xB2A9,
    0x535C, 0xB2B7,
    0x535E, 0xB1E5,
    0x535F, 0xDFB2,
    0x5360, 0xD5BC,
    0x5361, 0xBFA8,
    0x5362, 0xC2AC,
    0x5363, 0xD8D5,
    0x5364, 0xC2B1,
    0x5366, 0xD8D4,
    0x5367, 0xCED4,
    0x5369, 0xDAE0,
    0x536B, 0xCEC0,
    0x536E, 0xD8B4,
    0x536F, 0xC3AE,
    0x5370, 0xD3A1,
    0x5371, 0xCEA3,
    0x5373, 0xBCB4,
    0x5374, 0xC8B4,
    0x5375, 0xC2D1,
    0x5377, 0xBEED,
    0x5378, 0xD0B6,
    0x537A, 0xDAE1,
    0x537F, 0xC7E4,
    0x5382, 0xB3A7,
    0x5384, 0xB6F2,
    0x5385, 0xCCFC,
    0x5386, 0xC0FA,
    0x5389, 0xC0F7,
    0x538B, 0xD1B9,
    0x538C, 0xD1E1,
    0x538D, 0xD8C7,
    0x5395, 0xB2DE,
    0x5398, 0xC0E5,
    0x539A, 0xBAF1,
    0x539D, 0xD8C8,
    0x539F, 0xD4AD,
    0x53A2, 0xCFE1,
    0x53A3, 0xD8C9,
    0x53A5, 0xD8CA,
    0x53A6, 0xCFC3,
    0x53A8, 0xB3F8,
    0x53A9, 0xBEC7,
    0x53AE, 0xD8CB,
    0x53B6, 0xDBCC,
    0x53BB, 0xC8A5,
    0x53BF, 0xCFD8,
    0x53C1, 0xC8FE,
    0x53C2, 0xB2CE,
    0x53C8, 0xD3D6,
    0x53C9, 0xB2E6,
    0x53CA, 0xBCB0,
    0x53CB, 0xD3D1,
    0x53CC, 0xCBAB,
    0x53CD, 0xB7B4,
    0x53D1, 0xB7A2,
    0x53D4, 0xCAE5,
    0x53D6, 0xC8A1,
    0x53D7, 0xCADC,
    0x53D8, 0xB1E4,
    0x53D9, 0xD0F0,
    0x53DB, 0xC5D1,
    0x53DF, 0xDBC5,
    0x53E0, 0xB5FE,
    0x53E3, 0xBFDA,
    0x53E4, 0xB9C5,
    0x53E5, 0xBEE4,
    0x53E6, 0xC1ED,
    0x53E8, 0xDFB6,
    0x53E9, 0xDFB5,
    0x53EA, 0xD6BB,
    0x53EB, 0xBDD0,
    0x53EC, 0xD5D9,
    0x53ED, 0xB0C8,
    0x53EE, 0xB6A3,
    0x53EF, 0xBFC9,
    0x53F0, 0xCCA8,
    0x53F1, 0xDFB3,
    0x53F2, 0xCAB7,
    0x53F3, 0xD3D2,
    0x53F5, 0xD8CF,
    0x53F6, 0xD2B6,
    0x53F7, 0xBAC5,
    0x53F8, 0xCBBE,
    0x53F9, 0xCCBE,
    0x53FB, 0xDFB7,
    0x53FC, 0xB5F0,
    0x53FD, 0xDFB4,
    0x5401, 0xD3F5,
    0x5403, 0xB3D4,
    0x5404, 0xB8F7,
    0x5406, 0xDFBA,
    0x5408, 0xBACF,
    0x5409, 0xBCAA,
    0x540A, 0xB5F5,
    0x540C, 0xCDAC,
    0x540D, 0xC3FB,
    0x540E, 0xBAF3,
    0x540F, 0xC0F4,
    0x5410, 0xCDC2,
    0x5411, 0xCFF2,
    0x5412, 0xDFB8,
    0x5413, 0xCFC5,
    0x5415, 0xC2C0,
    0x5416, 0xDFB9,
    0x5417, 0xC2F0,
    0x541B, 0xBEFD,
    0x541D, 0xC1DF,
    0x541E, 0xCDCC,
    0x541F, 0xD2F7,
    0x5420, 0xB7CD,
    0x5421, 0xDFC1,
    0x5423, 0xDFC4,
    0x5426, 0xB7F1,
    0x5427, 0xB0C9,
    0x5428, 0xB6D6,
    0x5429, 0xB7D4,
    0x542B, 0xBAAC,
    0x542C, 0xCCFD,
    0x542D, 0xBFD4,
    0x542E, 0xCBB1,
    0x542F, 0xC6F4,
    0x5431, 0xD6A8,
    0x5432, 0xDFC5,
    0x5434, 0xCEE2,
    0x5435, 0xB3B3,
    0x5438, 0xCEFC,
    0x5439, 0xB4B5,
    0x543B, 0xCEC7,
    0x543C, 0xBAF0,
    0x543E, 0xCEE1,
    0x5440, 0xD1BD,
    0x5443, 0xDFC0,
    0x5446, 0xB4F4,
    0x5448, 0xB3CA,
    0x544A, 0xB8E6,
    0x544B, 0xDFBB,
    0x5450, 0xC4C5,
    0x5452, 0xDFBC,
    0x5453, 0xDFBD,
    0x5454, 0xDFBE,
    0x5455, 0xC5BB,
    0x5456, 0xDFBF,
    0x5457, 0xDFC2,
    0x5458, 0xD4B1,
    0x5459, 0xDFC3,
    0x545B, 0xC7BA,
    0x545C, 0xCED8,
    0x5462, 0xC4D8,
    0x5464, 0xDFCA,
    0x5466, 0xDFCF,
    0x5468, 0xD6DC,
    0x5471, 0xDFC9,
    0x5472, 0xDFDA,
    0x5473, 0xCEB6,
    0x5475, 0xBAC7,
    0x5476, 0xDFCE,
    0x5477, 0xDFC8,
    0x5478, 0xC5DE,
    0x547B, 0xC9EB,
    0x547C, 0xBAF4,
    0x547D, 0xC3FC,
    0x5480, 0xBED7,
    0x5482, 0xDFC6,
    0x5484, 0xDFCD,
    0x5486, 0xC5D8,
    0x548B, 0xD5A6,
    0x548C, 0xBACD,
    0x548E, 0xBECC,
    0x548F, 0xD3BD,
    0x5490, 0xB8C0,
    0x5492, 0xD6E4,
    0x5494, 0xDFC7,
    0x5495, 0xB9BE,
    0x5496, 0xBFA7,
    0x5499, 0xC1FC,
    0x549A, 0xDFCB,
    0x549B, 0xDFCC,
    0x549D, 0xDFD0,
    0x54A3, 0xDFDB,
    0x54A4, 0xDFE5,
    0x54A6, 0xDFD7,
    0x54A7, 0xDFD6,
    0x54A8, 0xD7C9,
    0x54A9, 0xDFE3,
    0x54AA, 0xDFE4,
    0x54AB, 0xE5EB,
    0x54AC, 0xD2A7,
    0x54AD, 0xDFD2,
    0x54AF, 0xBFA9,
    0x54B1, 0xD4DB,
    0x54B3, 0xBFC8,
    0x54B4, 0xDFD4,
    0x54B8, 0xCFCC,
    0x54BB, 0xDFDD,
    0x54BD, 0xD1CA,
    0x54BF, 0xDFDE,
    0x54C0, 0xB0A7,
    0x54C1, 0xC6B7,
    0x54C2, 0xDFD3,
    0x54C4, 0xBAE5,
    0x54C6, 0xB6DF,
    0x54C7, 0xCDDB,
    0x54C8, 0xB9FE,
    0x54C9, 0xD4D5,
    0x54CC, 0xDFDF,
    0x54CD, 0xCFEC,
    0x54CE, 0xB0A5,
    0x54CF, 0xDFE7,
    0x54D0, 0xDFD1,
    0x54D1, 0xD1C6,
    0x54D2, 0xDFD5,
    0x54D3, 0xDFD8,
    0x54D4, 0xDFD9,
    0x54D5, 0xDFDC,
    0x54D7, 0xBBA9,
    0x54D9, 0xDFE0,
    0x54DA, 0xDFE1,
    0x54DC, 0xDFE2,
    0x54DD, 0xDFE6,
    0x54DE, 0xDFE8,
    0x54DF, 0xD3B4,
    0x54E5, 0xB8E7,
    0x54E6, 0xC5B6,
    0x54E7, 0xDFEA,
    0x54E8, 0xC9DA,
    0x54E9, 0xC1A8,
    0x54EA, 0xC4C4,
    0x54ED, 0xBFDE,
    0x54EE, 0xCFF8,
    0x54F2, 0xD5DC,
    0x54F3, 0xDFEE,
    0x54FA, 0xB2B8,
    0x54FC, 0xBADF,
    0x54FD, 0xDFEC,
    0x54FF, 0xDBC1,
    0x5501, 0xD1E4,
    0x5506, 0xCBF4,
    0x5507, 0xB4BD,
    0x5509, 0xB0A6,
    0x550F, 0xDFF1,
    0x5510, 0xCCC6,
    0x5511, 0xDFF2,
    0x5514, 0xDFED,
    0x551B, 0xDFE9,
    0x5520, 0xDFEB,
    0x5522, 0xDFEF,
    0x5523, 0xDFF0,
    0x5524, 0xBBBD,
    0x5527, 0xDFF3,
    0x552A, 0xDFF4,
    0x552C, 0xBBA3,
    0x552E, 0xCADB,
    0x552F, 0xCEA8,
    0x5530, 0xE0A7,
    0x5531, 0xB3AA,
    0x5533, 0xE0A6,
    0x5537, 0xE0A1,
    0x553C, 0xDFFE,
    0x553E, 0xCDD9,
    0x553F, 0xDFFC,
    0x5541, 0xDFFA,
    0x5543, 0xBFD0,
    0x5544, 0xD7C4,
    0x5546, 0xC9CC,
    0x5549, 0xDFF8,
    0x554A, 0xB0A1,
    0x5550, 0xDFFD,
    0x5555, 0xDFFB,
    0x5556, 0xE0A2,
    0x555C, 0xE0A8,
    0x5561, 0xB7C8,
    0x5564, 0xC6A1,
    0x5565, 0xC9B6,
    0x5566, 0xC0B2,
    0x5567, 0xDFF5,
    0x556A, 0xC5BE,
    0x556C, 0xD8C4,
    0x556D, 0xDFF9,
    0x556E, 0xC4F6,
    0x5575, 0xE0A3,
    0x5576, 0xE0A4,
    0x5577, 0xE0A5,
    0x5578, 0xD0A5,
    0x557B, 0xE0B4,
    0x557C, 0xCCE4,
    0x557E, 0xE0B1,
    0x5580, 0xBFA6,
    0x5581, 0xE0AF,
    0x5582, 0xCEB9,
    0x5583, 0xE0AB,
    0x5584, 0xC9C6,
    0x5587, 0xC0AE,
    0x5588, 0xE0AE,
    0x5589, 0xBAED,
    0x558A, 0xBAB0,
    0x558B, 0xE0A9,
    0x558F, 0xDFF6,
    0x5591, 0xE0B3,
    0x5594, 0xE0B8,
    0x5598, 0xB4AD,
    0x5599, 0xE0B9,
    0x559C, 0xCFB2,
    0x559D, 0xBAC8,
    0x559F, 0xE0B0,
    0x55A7, 0xD0FA,
    0x55B1, 0xE0AC,
    0x55B3, 0xD4FB,
    0x55B5, 0xDFF7,
    0x55B7, 0xC5E7,
    0x55B9, 0xE0AD,
    0x55BB, 0xD3F7,
    0x55BD, 0xE0B6,
    0x55BE, 0xE0B7,
    0x55C4, 0xE0C4,
    0x55C5, 0xD0E1,
    0x55C9, 0xE0BC,
    0x55CC, 0xE0C9,
    0x55CD, 0xE0CA,
    0x55D1, 0xE0BE,
    0x55D2, 0xE0AA,
    0x55D3, 0xC9A4,
    0x55D4, 0xE0C1,
    0x55D6, 0xE0B2,
    0x55DC, 0xCAC8,
    0x55DD, 0xE0C3,
    0x55DF, 0xE0B5,
    0x55E1, 0xCECB,
    0x55E3, 0xCBC3,
    0x55E4, 0xE0CD,
    0x55E5, 0xE0C6,
    0x55E6, 0xE0C2,
    0x55E8, 0xE0CB,
    0x55EA, 0xE0BA,
    0x55EB, 0xE0BF,
    0x55EC, 0xE0C0,
    0x55EF, 0xE0C5,
    0x55F2, 0xE0C7,
    0x55F3, 0xE0C8,
    0x55F5, 0xE0CC,
    0x55F7, 0xE0BB,
    0x55FD, 0xCBD4,
    0x55FE, 0xE0D5,
    0x5600, 0xE0D6,
    0x5601, 0xE0D2,
    0x5608, 0xE0D0,
    0x5609, 0xBCCE,
    0x560C, 0xE0D1,
    0x560E, 0xB8C2,
    0x560F, 0xD8C5,
    0x5618, 0xD0EA,
    0x561B, 0xC2EF,
    0x561E, 0xE0CF,
    0x561F, 0xE0BD,
    0x5623, 0xE0D4,
    0x5624, 0xE0D3,
    0x5627, 0xE0D7,
    0x562C, 0xE0DC,
    0x562D, 0xE0D8,
    0x5631, 0xD6F6,
    0x5632, 0xB3B0,
    0x5634, 0xD7EC,
    0x5636, 0xCBBB,
    0x5639, 0xE0DA,
    0x563B, 0xCEFB,
    0x563F, 0xBAD9,
    0x564C, 0xE0E1,
    0x564D, 0xE0DD,
    0x564E, 0xD2AD,
    0x5654, 0xE0E2,
    0x5657, 0xE0DB,
    0x5658, 0xE0D9,
    0x5659, 0xE0DF,
    0x565C, 0xE0E0,
    0x5662, 0xE0DE,
    0x5664, 0xE0E4,
    0x5668, 0xC6F7,
    0x5669, 0xD8AC,
    0x566A, 0xD4EB,
    0x566B, 0xE0E6,
    0x566C, 0xCAC9,
    0x5671, 0xE0E5,
    0x5676, 0xB8C1,
    0x567B, 0xE0E7,
    0x567C, 0xE0E8,
    0x5685, 0xE0E9,
    0x5686, 0xE0E3,
    0x568E, 0xBABF,
    0x568F, 0xCCE7,
    0x5693, 0xE0EA,
    0x56A3, 0xCFF9,
    0x56AF, 0xE0EB,
    0x56B7, 0xC8C2,
    0x56BC, 0xBDC0,
    0x56CA, 0xC4D2,
    0x56D4, 0xE0EC,
    0x56D7, 0xE0ED,
    0x56DA, 0xC7F4,
    0x56DB, 0xCBC4,
    0x56DD, 0xE0EE,
    0x56DE, 0xBBD8,
    0x56DF, 0xD8B6,
    0x56E0, 0xD2F2,
    0x56E1, 0xE0EF,
    0x56E2, 0xCDC5,
    0x56E4, 0xB6DA,
    0x56EB, 0xE0F1,
    0x56ED, 0xD4B0,
    0x56F0, 0xC0A7,
    0x56F1, 0xB4D1,
    0x56F4, 0xCEA7,
    0x56F5, 0xE0F0,
    0x56F9, 0xE0F2,
    0x56FA, 0xB9CC,
    0x56FD, 0xB9FA,
    0x56FE, 0xCDBC,
    0x56FF, 0xE0F3,
    0x5703, 0xC6D4,
    0x5704, 0xE0F4,
    0x5706, 0xD4B2,
    0x5708, 0xC8A6,
    0x5709, 0xE0F6,
    0x570A, 0xE0F5,
    0x571C, 0xE0F7,
    0x571F, 0xCDC1,
    0x5723, 0xCAA5,
    0x5728, 0xD4DA,
    0x5729, 0xDBD7,
    0x572A, 0xDBD9,
    0x572C, 0xDBD8,
    0x572D, 0xB9E7,
    0x572E, 0xDBDC,
    0x572F, 0xDBDD,
    0x5730, 0xB5D8,
    0x5733, 0xDBDA,
    0x5739, 0xDBDB,
    0x573A, 0xB3A1,
    0x573B, 0xDBDF,
    0x573E, 0xBBF8,
    0x5740, 0xD6B7,
    0x5742, 0xDBE0,
    0x5747, 0xBEF9,
    0x574A, 0xB7BB,
    0x574C, 0xDBD0,
    0x574D, 0xCCAE,
    0x574E, 0xBFB2,
    0x574F, 0xBBB5,
    0x5750, 0xD7F8,
    0x5751, 0xBFD3,
    0x5757, 0xBFE9,
    0x575A, 0xBCE1,
    0x575B, 0xCCB3,
    0x575C, 0xDBDE,
    0x575D, 0xB0D3,
    0x575E, 0xCEEB,
    0x575F, 0xB7D8,
    0x5760, 0xD7B9,
    0x5761, 0xC6C2,
    0x5764, 0xC0A4,
    0x5766, 0xCCB9,
    0x5768, 0xDBE7,
    0x5769, 0xDBE1,
    0x576A, 0xC6BA,
    0x576B, 0xDBE3,
    0x576D, 0xDBE8,
    0x576F, 0xC5F7,
    0x5773, 0xDBEA,
    0x5776, 0xDBE9,
    0x5777, 0xBFC0,
    0x577B, 0xDBE6,
    0x577C, 0xDBE5,
    0x5782, 0xB4B9,
    0x5783, 0xC0AC,
    0x5784, 0xC2A2,
    0x5785, 0xDBE2,
    0x5786, 0xDBE4,
    0x578B, 0xD0CD,
    0x578C, 0xDBED,
    0x5792, 0xC0DD,
    0x5793, 0xDBF2,
    0x579B, 0xB6E2,
    0x57A0, 0xDBF3,
    0x57A1, 0xDBD2,
    0x57A2, 0xB9B8,
    0x57A3, 0xD4AB,
    0x57A4, 0xDBEC,
    0x57A6, 0xBFD1,
    0x57A7, 0xDBF0,
    0x57A9, 0xDBD1,
    0x57AB, 0xB5E6,
    0x57AD, 0xDBEB,
    0x57AE, 0xBFE5,
    0x57B2, 0xDBEE,
    0x57B4, 0xDBF1,
    0x57B8, 0xDBF9,
    0x57C2, 0xB9A1,
    0x57C3, 0xB0A3,
    0x57CB, 0xC2F1,
    0x57CE, 0xB3C7,
    0x57CF, 0xDBEF,
    0x57D2, 0xDBF8,
    0x57D4, 0xC6D2,
    0x57D5, 0xDBF4,
    0x57D8, 0xDBF5,
    0x57D9, 0xDBF7,
    0x57DA, 0xDBF6,
    0x57DD, 0xDBFE,
    0x57DF, 0xD3F2,
    0x57E0, 0xB2BA,
    0x57E4, 0xDBFD,
    0x57ED, 0xDCA4,
    0x57EF, 0xDBFB,
    0x57F4, 0xDBFA,
    0x57F8, 0xDBFC,
    0x57F9, 0xC5E0,
    0x57FA, 0xBBF9,
    0x57FD, 0xDCA3,
    0x5800, 0xDCA5,
    0x5802, 0xCCC3,
    0x5806, 0xB6D1,
    0x5807, 0xDDC0,
    0x580B, 0xDCA1,
    0x580D, 0xDCA2,
    0x5811, 0xC7B5,
    0x5815, 0xB6E9,
    0x5819, 0xDCA7,
    0x581E, 0xDCA6,
    0x5820, 0xDCA9,
    0x5821, 0xB1A4,
    0x5824, 0xB5CC,
    0x582A, 0xBFB0,
    0x5830, 0xD1DF,
    0x5835, 0xB6C2,
    0x5844, 0xDCA8,
    0x584C, 0xCBFA,
    0x584D, 0xEBF3,
    0x5851, 0xCBDC,
    0x5854, 0xCBFE,
    0x5858, 0xCCC1,
    0x585E, 0xC8FB,
    0x5865, 0xDCAA,
    0x586B, 0xCCEE,
    0x586C, 0xDCAB,
    0x587E, 0xDBD3,
    0x5880, 0xDCAF,
    0x5881, 0xDCAC,
    0x5883, 0xBEB3,
    0x5885, 0xCAFB,
    0x5889, 0xDCAD,
    0x5892, 0xC9CA,
    0x5893, 0xC4B9,
    0x5899, 0xC7BD,
    0x589A, 0xDCAE,
    0x589E, 0xD4F6,
    0x589F, 0xD0E6,
    0x58A8, 0xC4AB,
    0x58A9, 0xB6D5,
    0x58BC, 0xDBD4,
    0x58C1, 0xB1DA,
    0x58C5, 0xDBD5,
    0x58D1, 0xDBD6,
    0x58D5, 0xBABE,
    0x58E4, 0xC8C0,
    0x58EB, 0xCABF,
    0x58EC, 0xC8C9,
    0x58EE, 0xD7B3,
    0x58F0, 0xC9F9,
    0x58F3, 0xBFC7,
    0x58F6, 0xBAF8,
    0x58F9, 0xD2BC,
    0x5902, 0xE2BA,
    0x5904, 0xB4A6,
    0x5907, 0xB1B8,
    0x590D, 0xB8B4,
    0x590F, 0xCFC4,
    0x5914, 0xD9E7,
    0x5915, 0xCFA6,
    0x5916, 0xCDE2,
    0x5919, 0xD9ED,
    0x591A, 0xB6E0,
    0x591C, 0xD2B9,
    0x591F, 0xB9BB,
    0x5924, 0xE2B9,
    0x5925, 0xE2B7,
    0x5927, 0xB4F3,
    0x5929, 0xCCEC,
    0x592A, 0xCCAB,
    0x592B, 0xB7F2,
    0x592D, 0xD8B2,
    0x592E, 0xD1EB,
    0x592F, 0xBABB,
    0x5931, 0xCAA7,
    0x5934, 0xCDB7,
    0x5937, 0xD2C4,
    0x5938, 0xBFE4,
    0x5939, 0xBCD0,
    0x593A, 0xB6E1,
    0x593C, 0xDEC5,
    0x5941, 0xDEC6,
    0x5942, 0xDBBC,
    0x5944, 0xD1D9,
    0x5947, 0xC6E6,
    0x5948, 0xC4CE,
    0x5949, 0xB7EE,
    0x594B, 0xB7DC,
    0x594E, 0xBFFC,
    0x594F, 0xD7E0,
    0x5951, 0xC6F5,
    0x5954, 0xB1BC,
    0x5955, 0xDEC8,
    0x5956, 0xBDB1,
    0x5957, 0xCCD7,
    0x5958, 0xDECA,
    0x595A, 0xDEC9,
    0x5960, 0xB5EC,
    0x5962, 0xC9DD,
    0x5965, 0xB0C2,
    0x5973, 0xC5AE,
    0x5974, 0xC5AB,
    0x5976, 0xC4CC,
    0x5978, 0xBCE9,
    0x5979, 0xCBFD,
    0x597D, 0xBAC3,
    0x5981, 0xE5F9,
    0x5982, 0xC8E7,
    0x5983, 0xE5FA,
    0x5984, 0xCDFD,
    0x5986, 0xD7B1,
    0x5987, 0xB8BE,
    0x5988, 0xC2E8,
    0x598A, 0xC8D1,
    0x598D, 0xE5FB,
    0x5992, 0xB6CA,
    0x5993, 0xBCCB,
    0x5996, 0xD1FD,
    0x5997, 0xE6A1,
    0x5999, 0xC3EE,
    0x599E, 0xE6A4,
    0x59A3, 0xE5FE,
    0x59A4, 0xE6A5,
    0x59A5, 0xCDD7,
    0x59A8, 0xB7C1,
    0x59A9, 0xE5FC,
    0x59AA, 0xE5FD,
    0x59AB, 0xE6A3,
    0x59AE, 0xC4DD,
    0x59AF, 0xE6A8,
    0x59B2, 0xE6A7,
    0x59B9, 0xC3C3,
    0x59BB, 0xC6DE,
    0x59BE, 0xE6AA,
    0x59C6, 0xC4B7,
    0x59CA, 0xE6A2,
    0x59CB, 0xCABC,
    0x59D0, 0xBDE3,
    0x59D1, 0xB9C3,
    0x59D2, 0xE6A6,
    0x59D3, 0xD0D5,
    0x59D4, 0xCEAF,
    0x59D7, 0xE6A9,
    0x59D8, 0xE6B0,
    0x59DA, 0xD2A6,
    0x59DC, 0xBDAA,
    0x59DD, 0xE6AD,
    0x59E3, 0xE6AF,
    0x59E5, 0xC0D1,
    0x59E8, 0xD2CC,
    0x59EC, 0xBCA7,
    0x59F9, 0xE6B1,
    0x59FB, 0xD2F6,
    0x59FF, 0xD7CB,
    0x5A01, 0xCDFE,
    0x5A03, 0xCDDE,
    0x5A04, 0xC2A6,
    0x5A05, 0xE6AB,
    0x5A06, 0xE6AC,
    0x5A07, 0xBDBF,
    0x5A08, 0xE6AE,
    0x5A09, 0xE6B3,
    0x5A0C, 0xE6B2,
    0x5A11, 0xE6B6,
    0x5A13, 0xE6B8,
    0x5A18, 0xC4EF,
    0x5A1C, 0xC4C8,
    0x5A1F, 0xBEEA,
    0x5A20, 0xC9EF,
    0x5A23, 0xE6B7,
    0x5A25, 0xB6F0,
    0x5A29, 0xC3E4,
    0x5A31, 0xD3E9,
    0x5A32, 0xE6B4,
    0x5A34, 0xE6B5,
    0x5A36, 0xC8A2,
    0x5A3C, 0xE6BD,
    0x5A40, 0xE6B9,
    0x5A46, 0xC6C5,
    0x5A49, 0xCDF1,
    0x5A4A, 0xE6BB,
    0x5A55, 0xE6BC,
    0x5A5A, 0xBBE9,
    0x5A62, 0xE6BE,
    0x5A67, 0xE6BA,
    0x5A6A, 0xC0B7,
    0x5A74, 0xD3A4,
    0x5A75, 0xE6BF,
    0x5A76, 0xC9F4,
    0x5A77, 0xE6C3,
    0x5A7A, 0xE6C4,
    0x5A7F, 0xD0F6,
    0x5A92, 0xC3BD,
    0x5A9A, 0xC3C4,
    0x5A9B, 0xE6C2,
    0x5AAA, 0xE6C1,
    0x5AB2, 0xE6C7,
    0x5AB3, 0xCFB1,
    0x5AB5, 0xEBF4,
    0x5AB8, 0xE6CA,
    0x5ABE, 0xE6C5,
    0x5AC1, 0xBCDE,
    0x5AC2, 0xC9A9,
    0x5AC9, 0xBCB5,
    0x5ACC, 0xCFD3,
    0x5AD2, 0xE6C8,
    0x5AD4, 0xE6C9,
    0x5AD6, 0xE6CE,
    0x5AD8, 0xE6D0,
    0x5ADC, 0xE6D1,
    0x5AE0, 0xE6CB,
    0x5AE1, 0xB5D5,
    0x5AE3, 0xE6CC,
    0x5AE6, 0xE6CF,
    0x5AE9, 0xC4DB,
    0x5AEB, 0xE6C6,
    0x5AF1, 0xE6CD,
    0x5B09, 0xE6D2,
    0x5B16, 0xE6D4,
    0x5B17, 0xE6D3,
    0x5B32, 0xE6D5,
    0x5B34, 0xD9F8,
    0x5B37, 0xE6D6,
    0x5B40, 0xE6D7,
    0x5B50, 0xD7D3,
    0x5B51, 0xE6DD,
    0x5B53, 0xE6DE,
    0x5B54, 0xBFD7,
    0x5B55, 0xD4D0,
    0x5B57, 0xD7D6,
    0x5B58, 0xB4E6,
    0x5B59, 0xCBEF,
    0x5B5A, 0xE6DA,
    0x5B5B, 0xD8C3,
    0x5B5C, 0xD7CE,
    0x5B5D, 0xD0A2,
    0x5B5F, 0xC3CF,
    0x5B62, 0xE6DF,
    0x5B63, 0xBCBE,
    0x5B64, 0xB9C2,
    0x5B65, 0xE6DB,
    0x5B66, 0xD1A7,
    0x5B69, 0xBAA2,
    0x5B6A, 0xC2CF,
    0x5B6C, 0xD8AB,
    0x5B70, 0xCAEB,
    0x5B71, 0xE5EE,
    0x5B73, 0xE6DC,
    0x5B75, 0xB7F5,
    0x5B7A, 0xC8E6,
    0x5B7D, 0xC4F5,
    0x5B80, 0xE5B2,
    0x5B81, 0xC4FE,
    0x5B83, 0xCBFC,
    0x5B84, 0xE5B3,
    0x5B85, 0xD5AC,
    0x5B87, 0xD3EE,
    0x5B88, 0xCAD8,
    0x5B89, 0xB0B2,
    0x5B8B, 0xCBCE,
    0x5B8C, 0xCDEA,
    0x5B8F, 0xBAEA,
    0x5B93, 0xE5B5,
    0x5B95, 0xE5B4,
    0x5B97, 0xD7DA,
    0x5B98, 0xB9D9,
    0x5B99, 0xD6E6,
    0x5B9A, 0xB6A8,
    0x5B9B, 0xCDF0,
    0x5B9C, 0xD2CB,
    0x5B9D, 0xB1A6,
    0x5B9E, 0xCAB5,
    0x5BA0, 0xB3E8,
    0x5BA1, 0xC9F3,
    0x5BA2, 0xBFCD,
    0x5BA3, 0xD0FB,
    0x5BA4, 0xCAD2,
    0x5BA5, 0xE5B6,
    0x5BA6, 0xBBC2,
    0x5BAA, 0xCFDC,
    0x5BAB, 0xB9AC,
    0x5BB0, 0xD4D7,
    0x5BB3, 0xBAA6,
    0x5BB4, 0xD1E7,
    0x5BB5, 0xCFFC,
    0x5BB6, 0xBCD2,
    0x5BB8, 0xE5B7,
    0x5BB9, 0xC8DD,
    0x5BBD, 0xBFED,
    0x5BBE, 0xB1F6,
    0x5BBF, 0xCBDE,
    0x5BC2, 0xBCC5,
    0x5BC4, 0xBCC4,
    0x5BC5, 0xD2FA,
    0x5BC6, 0xC3DC,
    0x5BC7, 0xBFDC,
    0x5BCC, 0xB8BB,
    0x5BD0, 0xC3C2,
    0x5BD2, 0xBAAE,
    0x5BD3, 0xD4A2,
    0x5BDD, 0xC7DE,
    0x5BDE, 0xC4AF,
    0x5BDF, 0xB2EC,
    0x5BE1, 0xB9D1,
    0x5BE4, 0xE5BB,
    0x5BE5, 0xC1C8,
    0x5BE8, 0xD5AF,
    0x5BEE, 0xE5BC,
    0x5BF0, 0xE5BE,
    0x5BF8, 0xB4E7,
    0x5BF9, 0xB6D4,
    0x5BFA, 0xCBC2,
    0x5BFB, 0xD1B0,
    0x5BFC, 0xB5BC,
    0x5BFF, 0xCAD9,
    0x5C01, 0xB7E2,
    0x5C04, 0xC9E4,
    0x5C06, 0xBDAB,
    0x5C09, 0xCEBE,
    0x5C0A, 0xD7F0,
    0x5C0F, 0xD0A1,
    0x5C11, 0xC9D9,
    0x5C14, 0xB6FB,
    0x5C15, 0xE6D8,
    0x5C16, 0xBCE2,
    0x5C18, 0xB3BE,
    0x5C1A, 0xC9D0,
    0x5C1C, 0xE6D9,
    0x5C1D, 0xB3A2,
    0x5C22, 0xDECC,
    0x5C24, 0xD3C8,
    0x5C25, 0xDECD,
    0x5C27, 0xD2A2,
    0x5C2C, 0xDECE,
    0x5C31, 0xBECD,
    0x5C34, 0xDECF,
    0x5C38, 0xCAAC,
    0x5C39, 0xD2FC,
    0x5C3A, 0xB3DF,
    0x5C3B, 0xE5EA,
    0x5C3C, 0xC4E1,
    0x5C3D, 0xBEA1,
    0x5C3E, 0xCEB2,
    0x5C3F, 0xC4F2,
    0x5C40, 0xBED6,
    0x5C41, 0xC6A8,
    0x5C42, 0xB2E3,
    0x5C45, 0xBED3,
    0x5C48, 0xC7FC,
    0x5C49, 0xCCEB,
    0x5C4A, 0xBDEC,
    0x5C4B, 0xCEDD,
    0x5C4E, 0xCABA,
    0x5C4F, 0xC6C1,
    0x5C50, 0xE5EC,
    0x5C51, 0xD0BC,
    0x5C55, 0xD5B9,
    0x5C59, 0xE5ED,
    0x5C5E, 0xCAF4,
    0x5C60, 0xCDC0,
    0x5C61, 0xC2C5,
    0x5C63, 0xE5EF,
    0x5C65, 0xC2C4,
    0x5C66, 0xE5F0,
    0x5C6E, 0xE5F8,
    0x5C6F, 0xCDCD,
    0x5C71, 0xC9BD,
    0x5C79, 0xD2D9,
    0x5C7A, 0xE1A8,
    0x5C7F, 0xD3EC,
    0x5C81, 0xCBEA,
    0x5C82, 0xC6F1,
    0x5C88, 0xE1AC,
    0x5C8C, 0xE1A7,
    0x5C8D, 0xE1A9,
    0x5C90, 0xE1AA,
    0x5C91, 0xE1AF,
    0x5C94, 0xB2ED,
    0x5C96, 0xE1AB,
    0x5C97, 0xB8DA,
    0x5C98, 0xE1AD,
    0x5C99, 0xE1AE,
    0x5C9A, 0xE1B0,
    0x5C9B, 0xB5BA,
    0x5C9C, 0xE1B1,
    0x5CA2, 0xE1B3,
    0x5CA3, 0xE1B8,
    0x5CA9, 0xD1D2,
    0x5CAB, 0xE1B6,
    0x5CAC, 0xE1B5,
    0x5CAD, 0xC1EB,
    0x5CB1, 0xE1B7,
    0x5CB3, 0xD4C0,
    0x5CB5, 0xE1B2,
    0x5CB7, 0xE1BA,
    0x5CB8, 0xB0B6,
    0x5CBD, 0xE1B4,
    0x5CBF, 0xBFF9,
    0x5CC1, 0xE1B9,
    0x5CC4, 0xE1BB,
    0x5CCB, 0xE1BE,
    0x5CD2, 0xE1BC,
    0x5CD9, 0xD6C5,
    0x5CE1, 0xCFBF,
    0x5CE4, 0xE1BD,
    0x5CE5, 0xE1BF,
    0x5CE6, 0xC2CD,
    0x5CE8, 0xB6EB,
    0x5CEA, 0xD3F8,
    0x5CED, 0xC7CD,
    0x5CF0, 0xB7E5,
    0x5CFB, 0xBEFE,
    0x5D02, 0xE1C0,
    0x5D03, 0xE1C1,
    0x5D06, 0xE1C7,
    0x5D07, 0xB3E7,
    0x5D0E, 0xC6E9,
    0x5D14, 0xB4DE,
    0x5D16, 0xD1C2,
    0x5D1B, 0xE1C8,
    0x5D1E, 0xE1C6,
    0x5D24, 0xE1C5,
    0x5D26, 0xE1C3,
    0x5D27, 0xE1C2,
    0x5D29, 0xB1C0,
    0x5D2D, 0xD5B8,
    0x5D2E, 0xE1C4,
    0x5D34, 0xE1CB,
    0x5D3D, 0xE1CC,
    0x5D3E, 0xE1CA,
    0x5D47, 0xEFFA,
    0x5D4A, 0xE1D3,
    0x5D4B, 0xE1D2,
    0x5D4C, 0xC7B6,
    0x5D58, 0xE1C9,
    0x5D5B, 0xE1CE,
    0x5D5D, 0xE1D0,
    0x5D69, 0xE1D4,
    0x5D6B, 0xE1D1,
    0x5D6C, 0xE1CD,
    0x5D6F, 0xE1CF,
    0x5D74, 0xE1D5,
    0x5D82, 0xE1D6,
    0x5D99, 0xE1D7,
    0x5D9D, 0xE1D8,
    0x5DB7, 0xE1DA,
    0x5DC5, 0xE1DB,
    0x5DCD, 0xCEA1,
    0x5DDB, 0xE7DD,
    0x5DDD, 0xB4A8,
    0x5DDE, 0xD6DD,
    0x5DE1, 0xD1B2,
    0x5DE2, 0xB3B2,
    0x5DE5, 0xB9A4,
    0x5DE6, 0xD7F3,
    0x5DE7, 0xC7C9,
    0x5DE8, 0xBEDE,
    0x5DE9, 0xB9AE,
    0x5DEB, 0xCED7,
    0x5DEE, 0xB2EE,
    0x5DEF, 0xDBCF,
    0x5DF1, 0xBCBA,
    0x5DF2, 0xD2D1,
    0x5DF3, 0xCBC8,
    0x5DF4, 0xB0CD,
    0x5DF7, 0xCFEF,
    0x5DFD, 0xD9E3,
    0x5DFE, 0xBDED,
    0x5E01, 0xB1D2,
    0x5E02, 0xCAD0,
    0x5E03, 0xB2BC,
    0x5E05, 0xCBA7,
    0x5E06, 0xB7AB,
    0x5E08, 0xCAA6,
    0x5E0C, 0xCFA3,
    0x5E0F, 0xE0F8,
    0x5E10, 0xD5CA,
    0x5E11, 0xE0FB,
    0x5E14, 0xE0FA,
    0x5E15, 0xC5C1,
    0x5E16, 0xCCFB,
    0x5E18, 0xC1B1,
    0x5E19, 0xE0F9,
    0x5E1A, 0xD6E3,
    0x5E1B, 0xB2AF,
    0x5E1C, 0xD6C4,
    0x5E1D, 0xB5DB,
    0x5E26, 0xB4F8,
    0x5E27, 0xD6A1,
    0x5E2D, 0xCFAF,
    0x5E2E, 0xB0EF,
    0x5E31, 0xE0FC,
    0x5E37, 0xE1A1,
    0x5E38, 0xB3A3,
    0x5E3B, 0xE0FD,
    0x5E3C, 0xE0FE,
    0x5E3D, 0xC3B1,
    0x5E42, 0xC3DD,
    0x5E44, 0xE1A2,
    0x5E45, 0xB7F9,
    0x5E4C, 0xBBCF,
    0x5E54, 0xE1A3,
    0x5E55, 0xC4BB,
    0x5E5B, 0xE1A4,
    0x5E5E, 0xE1A5,
    0x5E61, 0xE1A6,
    0x5E62, 0xB4B1,
    0x5E72, 0xB8C9,
    0x5E73, 0xC6BD,
    0x5E74, 0xC4EA,
    0x5E76, 0xB2A2,
    0x5E78, 0xD0D2,
    0x5E7A, 0xE7DB,
    0x5E7B, 0xBBC3,
    0x5E7C, 0xD3D7,
    0x5E7D, 0xD3C4,
    0x5E7F, 0xB9E3,
    0x5E80, 0xE2CF,
    0x5E84, 0xD7AF,
    0x5E86, 0xC7EC,
    0x5E87, 0xB1D3,
    0x5E8A, 0xB4B2,
    0x5E8B, 0xE2D1,
    0x5E8F, 0xD0F2,
    0x5E90, 0xC2AE,
    0x5E91, 0xE2D0,
    0x5E93, 0xBFE2,
    0x5E94, 0xD3A6,
    0x5E95, 0xB5D7,
    0x5E96, 0xE2D2,
    0x5E97, 0xB5EA,
    0x5E99, 0xC3ED,
    0x5E9A, 0xB8FD,
    0x5E9C, 0xB8AE,
    0x5E9E, 0xC5D3,
    0x5E9F, 0xB7CF,
    0x5EA0, 0xE2D4,
    0x5EA5, 0xE2D3,
    0x5EA6, 0xB6C8,
    0x5EA7, 0xD7F9,
    0x5EAD, 0xCDA5,
    0x5EB3, 0xE2D8,
    0x5EB5, 0xE2D6,
    0x5EB6, 0xCAFC,
    0x5EB7, 0xBFB5,
    0x5EB8, 0xD3B9,
    0x5EB9, 0xE2D5,
    0x5EBE, 0xE2D7,
    0x5EC9, 0xC1AE,
    0x5ECA, 0xC0C8,
    0x5ED1, 0xE2DB,
    0x5ED2, 0xE2DA,
    0x5ED3, 0xC0AA,
    0x5ED6, 0xC1CE,
    0x5EDB, 0xE2DC,
    0x5EE8, 0xE2DD,
    0x5EEA, 0xE2DE,
    0x5EF4, 0xDBC8,
    0x5EF6, 0xD1D3,
    0x5EF7, 0xCDA2,
    0x5EFA, 0xBDA8,
    0x5EFE, 0xDEC3,
    0x5EFF, 0xD8A5,
    0x5F00, 0xBFAA,
    0x5F01, 0xDBCD,
    0x5F02, 0xD2EC,
    0x5F03, 0xC6FA,
    0x5F04, 0xC5AA,
    0x5F08, 0xDEC4,
    0x5F0A, 0xB1D7,
    0x5F0B, 0xDFAE,
    0x5F0F, 0xCABD,
    0x5F11, 0xDFB1,
    0x5F13, 0xB9AD,
    0x5F15, 0xD2FD,
    0x5F17, 0xB8A5,
    0x5F18, 0xBAEB,
    0x5F1B, 0xB3DA,
    0x5F1F, 0xB5DC,
    0x5F20, 0xD5C5,
    0x5F25, 0xC3D6,
    0x5F26, 0xCFD2,
    0x5F27, 0xBBA1,
    0x5F29, 0xE5F3,
    0x5F2A, 0xE5F2,
    0x5F2D, 0xE5F4,
    0x5F2F, 0xCDE4,
    0x5F31, 0xC8F5,
    0x5F39, 0xB5AF,
    0x5F3A, 0xC7BF,
    0x5F3C, 0xE5F6,
    0x5F40, 0xECB0,
    0x5F50, 0xE5E6,
    0x5F52, 0xB9E9,
    0x5F53, 0xB5B1,
    0x5F55, 0xC2BC,
    0x5F56, 0xE5E8,
    0x5F57, 0xE5E7,
    0x5F58, 0xE5E9,
    0x5F5D, 0xD2CD,
    0x5F61, 0xE1EA,
    0x5F62, 0xD0CE,
    0x5F64, 0xCDAE,
    0x5F66, 0xD1E5,
    0x5F69, 0xB2CA,
    0x5F6A, 0xB1EB,
    0x5F6C, 0xB1F2,
    0x5F6D, 0xC5ED,
    0x5F70, 0xD5C3,
    0x5F71, 0xD3B0,
    0x5F73, 0xE1DC,
    0x5F77, 0xE1DD,
    0x5F79, 0xD2DB,
    0x5F7B, 0xB3B9,
    0x5F7C, 0xB1CB,
    0x5F80, 0xCDF9,
    0x5F81, 0xD5F7,
    0x5F82, 0xE1DE,
    0x5F84, 0xBEB6,
    0x5F85, 0xB4FD,
    0x5F87, 0xE1DF,
    0x5F88, 0xBADC,
    0x5F89, 0xE1E0,
    0x5F8A, 0xBBB2,
    0x5F8B, 0xC2C9,
    0x5F8C, 0xE1E1,
    0x5F90, 0xD0EC,
    0x5F92, 0xCDBD,
    0x5F95, 0xE1E2,
    0x5F97, 0xB5C3,
    0x5F98, 0xC5C7,
    0x5F99, 0xE1E3,
    0x5F9C, 0xE1E4,
    0x5FA1, 0xD3F9,
    0x5FA8, 0xE1E5,
    0x5FAA, 0xD1AD,
    0x5FAD, 0xE1E6,
    0x5FAE, 0xCEA2,
    0x5FB5, 0xE1E7,
    0x5FB7, 0xB5C2,
    0x5FBC, 0xE1E8,
    0x5FBD, 0xBBD5,
    0x5FC3, 0xD0C4,
    0x5FC4, 0xE2E0,
    0x5FC5, 0xB1D8,
    0x5FC6, 0xD2E4,
    0x5FC9, 0xE2E1,
    0x5FCC, 0xBCC9,
    0x5FCD, 0xC8CC,
    0x5FCF, 0xE2E3,
    0x5FD0, 0xECFE,
    0x5FD1, 0xECFD,
    0x5FD2, 0xDFAF,
    0x5FD6, 0xE2E2,
    0x5FD7, 0xD6BE,
    0x5FD8, 0xCDFC,
    0x5FD9, 0xC3A6,
    0x5FDD, 0xE3C3,
    0x5FE0, 0xD6D2,
    0x5FE1, 0xE2E7,
    0x5FE4, 0xE2E8,
    0x5FE7, 0xD3C7,
    0x5FEA, 0xE2EC,
    0x5FEB, 0xBFEC,
    0x5FED, 0xE2ED,
    0x5FEE, 0xE2E5,
    0x5FF1, 0xB3C0,
    0x5FF5, 0xC4EE,
    0x5FF8, 0xE2EE,
    0x5FFB, 0xD0C3,
    0x5FFD, 0xBAF6,
    0x5FFE, 0xE2E9,
    0x5FFF, 0xB7DE,
    0x6000, 0xBBB3,
    0x6001, 0xCCAC,
    0x6002, 0xCBCB,
    0x6003, 0xE2E4,
    0x6004, 0xE2E6,
    0x6005, 0xE2EA,
    0x6006, 0xE2EB,
    0x600A, 0xE2F7,
    0x600D, 0xE2F4,
    0x600E, 0xD4F5,
    0x600F, 0xE2F3,
    0x6012, 0xC5AD,
    0x6014, 0xD5FA,
    0x6015, 0xC5C2,
    0x6016, 0xB2C0,
    0x6019, 0xE2EF,
    0x601B, 0xE2F2,
    0x601C, 0xC1AF,
    0x601D, 0xCBBC,
    0x6020, 0xB5A1,
    0x6021, 0xE2F9,
    0x6025, 0xBCB1,
    0x6026, 0xE2F1,
    0x6027, 0xD0D4,
    0x6028, 0xD4B9,
    0x6029, 0xE2F5,
    0x602A, 0xB9D6,
    0x602B, 0xE2F6,
    0x602F, 0xC7D3,
    0x6035, 0xE2F0,
    0x603B, 0xD7DC,
    0x603C, 0xEDA1,
    0x603F, 0xE2F8,
    0x6041, 0xEDA5,
    0x6042, 0xE2FE,
    0x6043, 0xCAD1,
    0x604B, 0xC1B5,
    0x604D, 0xBBD0,
    0x6050, 0xBFD6,
    0x6052, 0xBAE3,
    0x6055, 0xCBA1,
    0x6059, 0xEDA6,
    0x605A, 0xEDA3,
    0x605D, 0xEDA2,
    0x6062, 0xBBD6,
    0x6063, 0xEDA7,
    0x6064, 0xD0F4,
    0x6067, 0xEDA4,
    0x6068, 0xBADE,
    0x6069, 0xB6F7,
    0x606A, 0xE3A1,
    0x606B, 0xB6B2,
    0x606C, 0xCCF1,
    0x606D, 0xB9A7,
    0x606F, 0xCFA2,
    0x6070, 0xC7A1,
    0x6073, 0xBFD2,
    0x6076, 0xB6F1,
    0x6078, 0xE2FA,
    0x6079, 0xE2FB,
    0x607A, 0xE2FD,
    0x607B, 0xE2FC,
    0x607C, 0xC4D5,
    0x607D, 0xE3A2,
    0x607F, 0xD3C1,
    0x6083, 0xE3A7,
    0x6084, 0xC7C4,
    0x6089, 0xCFA4,
    0x608C, 0xE3A9,
    0x608D, 0xBAB7,
    0x6092, 0xE3A8,
    0x6094, 0xBBDA,
    0x6096, 0xE3A3,
    0x609A, 0xE3A4,
    0x609B, 0xE3AA,
    0x609D, 0xE3A6,
    0x609F, 0xCEF2,
    0x60A0, 0xD3C6,
    0x60A3, 0xBBBC,
    0x60A6, 0xD4C3,
    0x60A8, 0xC4FA,
    0x60AB, 0xEDA8,
    0x60AC, 0xD0FC,
    0x60AD, 0xE3A5,
    0x60AF, 0xC3F5,
    0x60B1, 0xE3AD,
    0x60B2, 0xB1AF,
    0x60B4, 0xE3B2,
    0x60B8, 0xBCC2,
    0x60BB, 0xE3AC,
    0x60BC, 0xB5BF,
    0x60C5, 0xC7E9,
    0x60C6, 0xE3B0,
    0x60CA, 0xBEAA,
    0x60CB, 0xCDEF,
    0x60D1, 0xBBF3,
    0x60D5, 0xCCE8,
    0x60D8, 0xE3AF,
    0x60DA, 0xE3B1,
    0x60DC, 0xCFA7,
    0x60DD, 0xE3AE,
    0x60DF, 0xCEA9,
    0x60E0, 0xBBDD,
    0x60E6, 0xB5EB,
    0x60E7, 0xBEE5,
    0x60E8, 0xB2D2,
    0x60E9, 0xB3CD,
    0x60EB, 0xB1B9,
    0x60EC, 0xE3AB,
    0x60ED, 0xB2D1,
    0x60EE, 0xB5AC,
    0x60EF, 0xB9DF,
    0x60F0, 0xB6E8,
    0x60F3, 0xCFEB,
    0x60F4, 0xE3B7,
    0x60F6, 0xBBCC,
    0x60F9, 0xC8C7,
    0x60FA, 0xD0CA,
    0x6100, 0xE3B8,
    0x6101, 0xB3EE,
    0x6106, 0xEDA9,
    0x6108, 0xD3FA,
    0x6109, 0xD3E4,
    0x610D, 0xEDAA,
    0x610E, 0xE3B9,
    0x610F, 0xD2E2,
    0x6115, 0xE3B5,
    0x611A, 0xD3DE,
    0x611F, 0xB8D0,
    0x6120, 0xE3B3,
    0x6123, 0xE3B6,
    0x6124, 0xB7DF,
    0x6126, 0xE3B4,
    0x6127, 0xC0A2,
    0x612B, 0xE3BA,
    0x613F, 0xD4B8,
    0x6148, 0xB4C8,
    0x614A, 0xE3BB,
    0x614C, 0xBBC5,
    0x614E, 0xC9F7,
    0x6151, 0xC9E5,
    0x6155, 0xC4BD,
    0x615D, 0xEDAB,
    0x6162, 0xC2FD,
    0x6167, 0xBBDB,
    0x6168, 0xBFAE,
    0x6170, 0xCEBF,
    0x6175, 0xE3BC,
    0x6177, 0xBFB6,
    0x618B, 0xB1EF,
    0x618E, 0xD4F7,
    0x6194, 0xE3BE,
    0x619D, 0xEDAD,
    0x61A7, 0xE3BF,
    0x61A8, 0xBAA9,
    0x61A9, 0xEDAC,
    0x61AC, 0xE3BD,
    0x61B7, 0xE3C0,
    0x61BE, 0xBAB6,
    0x61C2, 0xB6AE,
    0x61C8, 0xD0B8,
    0x61CA, 0xB0C3,
    0x61CB, 0xEDAE,
    0x61D1, 0xEDAF,
    0x61D2, 0xC0C1,
    0x61D4, 0xE3C1,
    0x61E6, 0xC5B3,
    0x61F5, 0xE3C2,
    0x61FF, 0xDCB2,
    0x6206, 0xEDB0,
    0x6208, 0xB8EA,
    0x620A, 0xCEEC,
    0x620B, 0xEAA7,
    0x620C, 0xD0E7,
    0x620D, 0xCAF9,
    0x620E, 0xC8D6,
    0x620F, 0xCFB7,
    0x6210, 0xB3C9,
    0x6211, 0xCED2,
    0x6212, 0xBDE4,
    0x6215, 0xE3DE,
    0x6216, 0xBBF2,
    0x6217, 0xEAA8,
    0x6218, 0xD5BD,
    0x621A, 0xC6DD,
    0x621B, 0xEAA9,
    0x621F, 0xEAAA,
    0x6221, 0xEAAC,
    0x6222, 0xEAAB,
    0x6224, 0xEAAE,
    0x6225, 0xEAAD,
    0x622A, 0xBDD8,
    0x622C, 0xEAAF,
    0x622E, 0xC2BE,
    0x6233, 0xB4C1,
    0x6234, 0xB4F7,
    0x6237, 0xBBA7,
    0x623D, 0xECE6,
    0x623E, 0xECE5,
    0x623F, 0xB7BF,
    0x6240, 0xCBF9,
    0x6241, 0xB1E2,
    0x6243, 0xECE7,
    0x6247, 0xC9C8,
    0x6248, 0xECE8,
    0x6249, 0xECE9,
    0x624B, 0xCAD6,
    0x624C, 0xDED0,
    0x624D, 0xB2C5,
    0x624E, 0xD4FA,
    0x6251, 0xC6CB,
    0x6252, 0xB0C7,
    0x6253, 0xB4F2,
    0x6254, 0xC8D3,
    0x6258, 0xCDD0,
    0x625B, 0xBFB8,
    0x6263, 0xBFDB,
    0x6266, 0xC7A4,
    0x6267, 0xD6B4,
    0x6269, 0xC0A9,
    0x626A, 0xDED1,
    0x626B, 0xC9A8,
    0x626C, 0xD1EF,
    0x626D, 0xC5A4,
    0x626E, 0xB0E7,
    0x626F, 0xB3B6,
    0x6270, 0xC8C5,
    0x6273, 0xB0E2,
    0x6276, 0xB7F6,
    0x6279, 0xC5FA,
    0x627C, 0xB6F3,
    0x627E, 0xD5D2,
    0x627F, 0xB3D0,
    0x6280, 0xBCBC,
    0x6284, 0xB3AD,
    0x6289, 0xBEF1,
    0x628A, 0xB0D1,
    0x6291, 0xD2D6,
    0x6292, 0xCAE3,
    0x6293, 0xD7A5,
    0x6295, 0xCDB6,
    0x6296, 0xB6B6,
    0x6297, 0xBFB9,
    0x6298, 0xD5DB,
    0x629A, 0xB8A7,
    0x629B, 0xC5D7,
    0x629F, 0xDED2,
    0x62A0, 0xBFD9,
    0x62A1, 0xC2D5,
    0x62A2, 0xC7C0,
    0x62A4, 0xBBA4,
    0x62A5, 0xB1A8,
    0x62A8, 0xC5EA,
    0x62AB, 0xC5FB,
    0x62AC, 0xCCA7,
    0x62B1, 0xB1A7,
    0x62B5, 0xB5D6,
    0x62B9, 0xC4A8,
    0x62BB, 0xDED3,
    0x62BC, 0xD1BA,
    0x62BD, 0xB3E9,
    0x62BF, 0xC3F2,
    0x62C2, 0xB7F7,
    0x62C4, 0xD6F4,
    0x62C5, 0xB5A3,
    0x62C6, 0xB2F0,
    0x62C7, 0xC4B4,
    0x62C8, 0xC4E9,
    0x62C9, 0xC0AD,
    0x62CA, 0xDED4,
    0x62CC, 0xB0E8,
    0x62CD, 0xC5C4,
    0x62CE, 0xC1E0,
    0x62D0, 0xB9D5,
    0x62D2, 0xBEDC,
    0x62D3, 0xCDD8,
    0x62D4, 0xB0CE,
    0x62D6, 0xCDCF,
    0x62D7, 0xDED6,
    0x62D8, 0xBED0,
    0x62D9, 0xD7BE,
    0x62DA, 0xDED5,
    0x62DB, 0xD5D0,
    0x62DC, 0xB0DD,
    0x62DF, 0xC4E2,
    0x62E2, 0xC2A3,
    0x62E3, 0xBCF0,
    0x62E5, 0xD3B5,
    0x62E6, 0xC0B9,
    0x62E7, 0xC5A1,
    0x62E8, 0xB2A6,
    0x62E9, 0xD4F1,
    0x62EC, 0xC0A8,
    0x62ED, 0xCAC3,
    0x62EE, 0xDED7,
    0x62EF, 0xD5FC,
    0x62F1, 0xB9B0,
    0x62F3, 0xC8AD,
    0x62F4, 0xCBA9,
    0x62F6, 0xDED9,
    0x62F7, 0xBFBD,
    0x62FC, 0xC6B4,
    0x62FD, 0xD7A7,
    0x62FE, 0xCAB0,
    0x62FF, 0xC4C3,
    0x6301, 0xB3D6,
    0x6302, 0xB9D2,
    0x6307, 0xD6B8,
    0x6308, 0xEAFC,
    0x6309, 0xB0B4,
    0x630E, 0xBFE6,
    0x6311, 0xCCF4,
    0x6316, 0xCDDA,
    0x631A, 0xD6BF,
    0x631B, 0xC2CE,
    0x631D, 0xCECE,
    0x631E, 0xCCA2,
    0x631F, 0xD0AE,
    0x6320, 0xC4D3,
    0x6321, 0xB5B2,
    0x6322, 0xDED8,
    0x6323, 0xD5F5,
    0x6324, 0xBCB7,
    0x6325, 0xBBD3,
    0x6328, 0xB0A4,
    0x632A, 0xC5B2,
    0x632B, 0xB4EC,
    0x632F, 0xD5F1,
    0x6332, 0xEAFD,
    0x6339, 0xDEDA,
    0x633A, 0xCDA6,
    0x633D, 0xCDEC,
    0x6342, 0xCEE6,
    0x6343, 0xDEDC,
    0x6345, 0xCDB1,
    0x6346, 0xC0A6,
    0x6349, 0xD7BD,
    0x634B, 0xDEDB,
    0x634C, 0xB0C6,
    0x634D, 0xBAB4,
    0x634E, 0xC9D3,
    0x634F, 0xC4F3,
    0x6350, 0xBEE8,
    0x6355, 0xB2B6,
    0x635E, 0xC0CC,
    0x635F, 0xCBF0,
    0x6361, 0xBCF1,
    0x6362, 0xBBBB,
    0x6363, 0xB5B7,
    0x6367, 0xC5F5,
    0x6369, 0xDEE6,
    0x636D, 0xDEE3,
    0x636E, 0xBEDD,
    0x6371, 0xDEDF,
    0x6376, 0xB4B7,
    0x6377, 0xBDDD,
    0x637A, 0xDEE0,
    0x637B, 0xC4ED,
    0x6380, 0xCFC6,
    0x6382, 0xB5E0,
    0x6387, 0xB6DE,
    0x6388, 0xCADA,
    0x6389, 0xB5F4,
    0x638A, 0xDEE5,
    0x638C, 0xD5C6,
    0x638E, 0xDEE1,
    0x638F, 0xCCCD,
    0x6390, 0xC6FE,
    0x6392, 0xC5C5,
    0x6396, 0xD2B4,
    0x6398, 0xBEF2,
    0x63A0, 0xC2D3,
    0x63A2, 0xCCBD,
    0x63A3, 0xB3B8,
    0x63A5, 0xBDD3,
    0x63A7, 0xBFD8,
    0x63A8, 0xCDC6,
    0x63A9, 0xD1DA,
    0x63AA, 0xB4EB,
    0x63AC, 0xDEE4,
    0x63AD, 0xDEDD,
    0x63AE, 0xDEE7,
    0x63B0, 0xEAFE,
    0x63B3, 0xC2B0,
    0x63B4, 0xDEE2,
    0x63B7, 0xD6C0,
    0x63B8, 0xB5A7,
    0x63BA, 0xB2F4,
    0x63BC, 0xDEE8,
    0x63BE, 0xDEF2,
    0x63C4, 0xDEED,
    0x63C6, 0xDEF1,
    0x63C9, 0xC8E0,
    0x63CD, 0xD7E1,
    0x63CE, 0xDEEF,
    0x63CF, 0xC3E8,
    0x63D0, 0xCCE1,
    0x63D2, 0xB2E5,
    0x63D6, 0xD2BE,
    0x63DE, 0xDEEE,
    0x63E0, 0xDEEB,
    0x63E1, 0xCED5,
    0x63E3, 0xB4A7,
    0x63E9, 0xBFAB,
    0x63EA, 0xBEBE,
    0x63ED, 0xBDD2,
    0x63F2, 0xDEE9,
    0x63F4, 0xD4AE,
    0x63F6, 0xDEDE,
    0x63F8, 0xDEEA,
    0x63FD, 0xC0BF,
    0x63FF, 0xDEEC,
    0x6400, 0xB2F3,
    0x6401, 0xB8E9,
    0x6402, 0xC2A7,
    0x6405, 0xBDC1,
    0x640B, 0xDEF5,
    0x640C, 0xDEF8,
    0x640F, 0xB2AB,
    0x6410, 0xB4A4,
    0x6413, 0xB4EA,
    0x6414, 0xC9A6,
    0x641B, 0xDEF6,
    0x641C, 0xCBD1,
    0x641E, 0xB8E3,
    0x6420, 0xDEF7,
    0x6421, 0xDEFA,
    0x6426, 0xDEF9,
    0x642A, 0xCCC2,
    0x642C, 0xB0E1,
    0x642D, 0xB4EE,
    0x6434, 0xE5BA,
    0x643A, 0xD0AF,
    0x643D, 0xB2EB,
    0x643F, 0xEBA1,
    0x6441, 0xDEF4,
    0x6444, 0xC9E3,
    0x6445, 0xDEF3,
    0x6446, 0xB0DA,
    0x6447, 0xD2A1,
    0x6448, 0xB1F7,
    0x644A, 0xCCAF,
    0x6452, 0xDEF0,
    0x6454, 0xCBA4,
    0x6458, 0xD5AA,
    0x645E, 0xDEFB,
    0x6467, 0xB4DD,
    0x6469, 0xC4A6,
    0x646D, 0xDEFD,
    0x6478, 0xC3FE,
    0x6479, 0xC4A1,
    0x647A, 0xDFA1,
    0x6482, 0xC1CC,
    0x6484, 0xDEFC,
    0x6485, 0xBEEF,
    0x6487, 0xC6B2,
    0x6491, 0xB3C5,
    0x6492, 0xC8F6,
    0x6495, 0xCBBA,
    0x6496, 0xDEFE,
    0x6499, 0xDFA4,
    0x649E, 0xD7B2,
    0x64A4, 0xB3B7,
    0x64A9, 0xC1C3,
    0x64AC, 0xC7CB,
    0x64AD, 0xB2A5,
    0x64AE, 0xB4E9,
    0x64B0, 0xD7AB,
    0x64B5, 0xC4EC,
    0x64B7, 0xDFA2,
    0x64B8, 0xDFA3,
    0x64BA, 0xDFA5,
    0x64BC, 0xBAB3,
    0x64C0, 0xDFA6,
    0x64C2, 0xC0DE,
    0x64C5, 0xC9C3,
    0x64CD, 0xB2D9,
    0x64CE, 0xC7E6,
    0x64D0, 0xDFA7,
    0x64D2, 0xC7DC,
    0x64D7, 0xDFA8,
    0x64D8, 0xEBA2,
    0x64DE, 0xCBD3,
    0x64E2, 0xDFAA,
    0x64E4, 0xDFA9,
    0x64E6, 0xB2C1,
    0x6500, 0xC5CA,
    0x6509, 0xDFAB,
    0x6512, 0xD4DC,
    0x6518, 0xC8C1,
    0x6525, 0xDFAC,
    0x652B, 0xBEF0,
    0x652E, 0xDFAD,
    0x652F, 0xD6A7,
    0x6534, 0xEAB7,
    0x6535, 0xEBB6,
    0x6536, 0xCAD5,
    0x6538, 0xD8FC,
    0x6539, 0xB8C4,
    0x653B, 0xB9A5,
    0x653E, 0xB7C5,
    0x653F, 0xD5FE,
    0x6545, 0xB9CA,
    0x6548, 0xD0A7,
    0x6549, 0xF4CD,
    0x654C, 0xB5D0,
    0x654F, 0xC3F4,
    0x6551, 0xBEC8,
    0x6555, 0xEBB7,
    0x6556, 0xB0BD,
    0x6559, 0xBDCC,
    0x655B, 0xC1B2,
    0x655D, 0xB1D6,
    0x655E, 0xB3A8,
    0x6562, 0xB8D2,
    0x6563, 0xC9A2,
    0x6566, 0xB6D8,
    0x656B, 0xEBB8,
    0x656C, 0xBEB4,
    0x6570, 0xCAFD,
    0x6572, 0xC7C3,
    0x6574, 0xD5FB,
    0x6577, 0xB7F3,
    0x6587, 0xCEC4,
    0x658B, 0xD5AB,
    0x658C, 0xB1F3,
    0x6590, 0xECB3,
    0x6591, 0xB0DF,
    0x6593, 0xECB5,
    0x6597, 0xB6B7,
    0x6599, 0xC1CF,
    0x659B, 0xF5FA,
    0x659C, 0xD0B1,
    0x659F, 0xD5E5,
    0x65A1, 0xCED3,
    0x65A4, 0xBDEF,
    0x65A5, 0xB3E2,
    0x65A7, 0xB8AB,
    0x65A9, 0xD5B6,
    0x65AB, 0xEDBD,
    0x65AD, 0xB6CF,
    0x65AF, 0xCBB9,
    0x65B0, 0xD0C2,
    0x65B9, 0xB7BD,
    0x65BC, 0xECB6,
    0x65BD, 0xCAA9,
    0x65C1, 0xC5D4,
    0x65C3, 0xECB9,
    0x65C4, 0xECB8,
    0x65C5, 0xC2C3,
    0x65C6, 0xECB7,
    0x65CB, 0xD0FD,
    0x65CC, 0xECBA,
    0x65CE, 0xECBB,
    0x65CF, 0xD7E5,
    0x65D2, 0xECBC,
    0x65D6, 0xECBD,
    0x65D7, 0xC6EC,
    0x65E0, 0xCEDE,
    0x65E2, 0xBCC8,
    0x65E5, 0xC8D5,
    0x65E6, 0xB5A9,
    0x65E7, 0xBEC9,
    0x65E8, 0xD6BC,
    0x65E9, 0xD4E7,
    0x65EC, 0xD1AE,
    0x65ED, 0xD0F1,
    0x65EE, 0xEAB8,
    0x65EF, 0xEAB9,
    0x65F0, 0xEABA,
    0x65F1, 0xBAB5,
    0x65F6, 0xCAB1,
    0x65F7, 0xBFF5,
    0x65FA, 0xCDFA,
    0x6600, 0xEAC0,
    0x6602, 0xB0BA,
    0x6603, 0xEABE,
    0x6606, 0xC0A5,
    0x660A, 0xEABB,
    0x660C, 0xB2FD,
    0x660E, 0xC3F7,
    0x660F, 0xBBE8,
    0x6613, 0xD2D7,
    0x6614, 0xCEF4,
    0x6615, 0xEABF,
    0x6619, 0xEABC,
    0x661D, 0xEAC3,
    0x661F, 0xD0C7,
    0x6620, 0xD3B3,
    0x6625, 0xB4BA,
    0x6627, 0xC3C1,
    0x6628, 0xD7F2,
    0x662D, 0xD5D1,
    0x662F, 0xCAC7,
    0x6631, 0xEAC5,
    0x6634, 0xEAC4,
    0x6635, 0xEAC7,
    0x6636, 0xEAC6,
    0x663C, 0xD6E7,
    0x663E, 0xCFD4,
    0x6641, 0xEACB,
    0x6643, 0xBBCE,
    0x664B, 0xBDFA,
    0x664C, 0xC9CE,
    0x664F, 0xEACC,
    0x6652, 0xC9B9,
    0x6653, 0xCFFE,
    0x6654, 0xEACA,
    0x6655, 0xD4CE,
    0x6656, 0xEACD,
    0x6657, 0xEACF,
    0x665A, 0xCDED,
    0x665F, 0xEAC9,
    0x6661, 0xEACE,
    0x6664, 0xCEEE,
    0x6666, 0xBBDE,
    0x6668, 0xB3BF,
    0x666E, 0xC6D5,
    0x666F, 0xBEB0,
    0x6670, 0xCEFA,
    0x6674, 0xC7E7,
    0x6676, 0xBEA7,
    0x6677, 0xEAD0,
    0x667A, 0xD6C7,
    0x667E, 0xC1C0,
    0x6682, 0xD4DD,
    0x6684, 0xEAD1,
    0x6687, 0xCFBE,
    0x668C, 0xEAD2,
    0x6691, 0xCAEE,
    0x6696, 0xC5AF,
    0x6697, 0xB0B5,
    0x669D, 0xEAD4,
    0x66A7, 0xEAD3,
    0x66A8, 0xF4DF,
    0x66AE, 0xC4BA,
    0x66B4, 0xB1A9,
    0x66B9, 0xE5DF,
    0x66BE, 0xEAD5,
    0x66D9, 0xCAEF,
    0x66DB, 0xEAD6,
    0x66DC, 0xEAD7,
    0x66DD, 0xC6D8,
    0x66E6, 0xEAD8,
    0x66E9, 0xEAD9,
    0x66F0, 0xD4BB,
    0x66F2, 0xC7FA,
    0x66F3, 0xD2B7,
    0x66F4, 0xB8FC,
    0x66F7, 0xEAC2,
    0x66F9, 0xB2DC,
    0x66FC, 0xC2FC,
    0x66FE, 0xD4F8,
    0x66FF, 0xCCE6,
    0x6700, 0xD7EE,
    0x6708, 0xD4C2,
    0x6709, 0xD3D0,
    0x670A, 0xEBC3,
    0x670B, 0xC5F3,
    0x670D, 0xB7FE,
    0x6710, 0xEBD4,
    0x6714, 0xCBB7,
    0x6715, 0xEBDE,
    0x6717, 0xC0CA,
    0x671B, 0xCDFB,
    0x671D, 0xB3AF,
    0x671F, 0xC6DA,
    0x6726, 0xEBFC,
    0x6728, 0xC4BE,
    0x672A, 0xCEB4,
    0x672B, 0xC4A9,
    0x672C, 0xB1BE,
    0x672D, 0xD4FD,
    0x672F, 0xCAF5,
    0x6731, 0xD6EC,
    0x6734, 0xC6D3,
    0x6735, 0xB6E4,
    0x673A, 0xBBFA,
    0x673D, 0xD0E0,
    0x6740, 0xC9B1,
    0x6742, 0xD4D3,
    0x6743, 0xC8A8,
    0x6746, 0xB8CB,
    0x6748, 0xE8BE,
    0x6749, 0xC9BC,
    0x674C, 0xE8BB,
    0x674E, 0xC0EE,
    0x674F, 0xD0D3,
    0x6750, 0xB2C4,
    0x6751, 0xB4E5,
    0x6753, 0xE8BC,
    0x6756, 0xD5C8,
    0x675C, 0xB6C5,
    0x675E, 0xE8BD,
    0x675F, 0xCAF8,
    0x6760, 0xB8DC,
    0x6761, 0xCCF5,
    0x6765, 0xC0B4,
    0x6768, 0xD1EE,
    0x6769, 0xE8BF,
    0x676A, 0xE8C2,
    0x676D, 0xBABC,
    0x676F, 0xB1AD,
    0x6770, 0xBDDC,
    0x6772, 0xEABD,
    0x6773, 0xE8C3,
    0x6775, 0xE8C6,
    0x6777, 0xE8CB,
    0x677C, 0xE8CC,
    0x677E, 0xCBC9,
    0x677F, 0xB0E5,
    0x6781, 0xBCAB,
    0x6784, 0xB9B9,
    0x6787, 0xE8C1,
    0x6789, 0xCDF7,
    0x678B, 0xE8CA,
    0x6790, 0xCEF6,
    0x6795, 0xD5ED,
    0x6797, 0xC1D6,
    0x6798, 0xE8C4,
    0x679A, 0xC3B6,
    0x679C, 0xB9FB,
    0x679D, 0xD6A6,
    0x679E, 0xE8C8,
    0x67A2, 0xCAE0,
    0x67A3, 0xD4E6,
    0x67A5, 0xE8C0,
    0x67A7, 0xE8C5,
    0x67A8, 0xE8C7,
    0x67AA, 0xC7B9,
    0x67AB, 0xB7E3,
    0x67AD, 0xE8C9,
    0x67AF, 0xBFDD,
    0x67B0, 0xE8D2,
    0x67B3, 0xE8D7,
    0x67B5, 0xE8D5,
    0x67B6, 0xBCDC,
    0x67B7, 0xBCCF,
    0x67B8, 0xE8DB,
    0x67C1, 0xE8DE,
    0x67C3, 0xE8DA,
    0x67C4, 0xB1FA,
    0x67CF, 0xB0D8,
    0x67D0, 0xC4B3,
    0x67D1, 0xB8CC,
    0x67D2, 0xC6E2,
    0x67D3, 0xC8BE,
    0x67D4, 0xC8E1,
    0x67D8, 0xE8CF,
    0x67D9, 0xE8D4,
    0x67DA, 0xE8D6,
    0x67DC, 0xB9F1,
    0x67DD, 0xE8D8,
    0x67DE, 0xD7F5,
    0x67E0, 0xC4FB,
    0x67E2, 0xE8DC,
    0x67E5, 0xB2E9,
    0x67E9, 0xE8D1,
    0x67EC, 0xBCED,
    0x67EF, 0xBFC2,
    0x67F0, 0xE8CD,
    0x67F1, 0xD6F9,
    0x67F3, 0xC1F8,
    0x67F4, 0xB2F1,
    0x67FD, 0xE8DF,
    0x67FF, 0xCAC1,
    0x6800, 0xE8D9,
    0x6805, 0xD5A4,
    0x6807, 0xB1EA,
    0x6808, 0xD5BB,
    0x6809, 0xE8CE,
    0x680A, 0xE8D0,
    0x680B, 0xB6B0,
    0x680C, 0xE8D3,
    0x680E, 0xE8DD,
    0x680F, 0xC0B8,
    0x6811, 0xCAF7,
    0x6813, 0xCBA8,
    0x6816, 0xC6DC,
    0x6817, 0xC0F5,
    0x681D, 0xE8E9,
    0x6821, 0xD0A3,
    0x6829, 0xE8F2,
    0x682A, 0xD6EA,
    0x6832, 0xE8E0,
    0x6833, 0xE8E1,
    0x6837, 0xD1F9,
    0x6838, 0xBACB,
    0x6839, 0xB8F9,
    0x683C, 0xB8F1,
    0x683D, 0xD4D4,
    0x683E, 0xE8EF,
    0x6840, 0xE8EE,
    0x6841, 0xE8EC,
    0x6842, 0xB9F0,
    0x6843, 0xCCD2,
    0x6844, 0xE8E6,
    0x6845, 0xCEA6,
    0x6846, 0xBFF2,
    0x6848, 0xB0B8,
    0x6849, 0xE8F1,
    0x684A, 0xE8F0,
    0x684C, 0xD7C0,
    0x684E, 0xE8E4,
    0x6850, 0xCDA9,
    0x6851, 0xC9A3,
    0x6853, 0xBBB8,
    0x6854, 0xBDDB,
    0x6855, 0xE8EA,
    0x6860, 0xE8E2,
    0x6861, 0xE8E3,
    0x6862, 0xE8E5,
    0x6863, 0xB5B5,
    0x6864, 0xE8E7,
    0x6865, 0xC7C5,
    0x6866, 0xE8EB,
    0x6867, 0xE8ED,
    0x6868, 0xBDB0,
    0x6869, 0xD7AE,
    0x686B, 0xE8F8,
    0x6874, 0xE8F5,
    0x6876, 0xCDB0,
    0x6877, 0xE8F6,
    0x6881, 0xC1BA,
    0x6883, 0xE8E8,
    0x6885, 0xC3B7,
    0x6886, 0xB0F0,
    0x688F, 0xE8F4,
    0x6893, 0xE8F7,
    0x6897, 0xB9A3,
    0x68A2, 0xC9D2,
    0x68A6, 0xC3CE,
    0x68A7, 0xCEE0,
    0x68A8, 0xC0E6,
    0x68AD, 0xCBF3,
    0x68AF, 0xCCDD,
    0x68B0, 0xD0B5,
    0x68B3, 0xCAE1,
    0x68B5, 0xE8F3,
    0x68C0, 0xBCEC,
    0x68C2, 0xE8F9,
    0x68C9, 0xC3DE,
    0x68CB, 0xC6E5,
    0x68CD, 0xB9F7,
    0x68D2, 0xB0F4,
    0x68D5, 0xD7D8,
    0x68D8, 0xBCAC,
    0x68DA, 0xC5EF,
    0x68E0, 0xCCC4,
    0x68E3, 0xE9A6,
    0x68EE, 0xC9AD,
    0x68F0, 0xE9A2,
    0x68F1, 0xC0E2,
    0x68F5, 0xBFC3,
    0x68F9, 0xE8FE,
    0x68FA, 0xB9D7,
    0x68FC, 0xE8FB,
    0x6901, 0xE9A4,
    0x6905, 0xD2CE,
    0x690B, 0xE9A3,
    0x690D, 0xD6B2,
    0x690E, 0xD7B5,
    0x6910, 0xE9A7,
    0x6912, 0xBDB7,
    0x691F, 0xE8FC,
    0x6920, 0xE8FD,
    0x6924, 0xE9A1,
    0x692D, 0xCDD6,
    0x6930, 0xD2AC,
    0x6934, 0xE9B2,
    0x6939, 0xE9A9,
    0x693D, 0xB4AA,
    0x693F, 0xB4BB,
    0x6942, 0xE9AB,
    0x6954, 0xD0A8,
    0x6957, 0xE9A5,
    0x695A, 0xB3FE,
    0x695D, 0xE9AC,
    0x695E, 0xC0E3,
    0x6960, 0xE9AA,
    0x6963, 0xE9B9,
    0x6966, 0xE9B8,
    0x696B, 0xE9AE,
    0x696E, 0xE8FA,
    0x6971, 0xE9A8,
    0x6977, 0xBFAC,
    0x6978, 0xE9B1,
    0x6979, 0xE9BA,
    0x697C, 0xC2A5,
    0x6980, 0xE9AF,
    0x6982, 0xB8C5,
    0x6984, 0xE9AD,
    0x6986, 0xD3DC,
    0x6987, 0xE9B4,
    0x6988, 0xE9B5,
    0x6989, 0xE9B7,
    0x698D, 0xE9C7,
    0x6994, 0xC0C6,
    0x6995, 0xE9C5,
    0x6998, 0xE9B0,
    0x699B, 0xE9BB,
    0x699C, 0xB0F1,
    0x69A7, 0xE9BC,
    0x69A8, 0xD5A5,
    0x69AB, 0xE9BE,
    0x69AD, 0xE9BF,
    0x69B1, 0xE9C1,
    0x69B4, 0xC1F1,
    0x69B7, 0xC8B6,
    0x69BB, 0xE9BD,
    0x69C1, 0xE9C2,
    0x69CA, 0xE9C3,
    0x69CC, 0xE9B3,
    0x69CE, 0xE9B6,
    0x69D0, 0xBBB1,
    0x69D4, 0xE9C0,
    0x69DB, 0xBCF7,
    0x69DF, 0xE9C4,
    0x69E0, 0xE9C6,
    0x69ED, 0xE9CA,
    0x69F2, 0xE9CE,
    0x69FD, 0xB2DB,
    0x69FF, 0xE9C8,
    0x6A0A, 0xB7AE,
    0x6A17, 0xE9CB,
    0x6A18, 0xE9CC,
    0x6A1F, 0xD5C1,
    0x6A21, 0xC4A3,
    0x6A28, 0xE9D8,
    0x6A2A, 0xBAE1,
    0x6A2F, 0xE9C9,
    0x6A31, 0xD3A3,
    0x6A35, 0xE9D4,
    0x6A3D, 0xE9D7,
    0x6A3E, 0xE9D0,
    0x6A44, 0xE9CF,
    0x6A47, 0xC7C1,
    0x6A50, 0xE9D2,
    0x6A58, 0xE9D9,
    0x6A59, 0xB3C8,
    0x6A5B, 0xE9D3,
    0x6A61, 0xCFF0,
    0x6A65, 0xE9CD,
    0x6A71, 0xB3F7,
    0x6A79, 0xE9D6,
    0x6A7C, 0xE9DA,
    0x6A80, 0xCCB4,
    0x6A84, 0xCFAD,
    0x6A8E, 0xE9D5,
    0x6A90, 0xE9DC,
    0x6A91, 0xE9DB,
    0x6A97, 0xE9DE,
    0x6AA0, 0xE9D1,
    0x6AA9, 0xE9DD,
    0x6AAB, 0xE9DF,
    0x6AAC, 0xC3CA,
    0x6B20, 0xC7B7,
    0x6B21, 0xB4CE,
    0x6B22, 0xBBB6,
    0x6B23, 0xD0C0,
    0x6B24, 0xECA3,
    0x6B27, 0xC5B7,
    0x6B32, 0xD3FB,
    0x6B37, 0xECA4,
    0x6B39, 0xECA5,
    0x6B3A, 0xC6DB,
    0x6B3E, 0xBFEE,
    0x6B43, 0xECA6,
    0x6B46, 0xECA7,
    0x6B47, 0xD0AA,
    0x6B49, 0xC7B8,
    0x6B4C, 0xB8E8,
    0x6B59, 0xECA8,
    0x6B62, 0xD6B9,
    0x6B63, 0xD5FD,
    0x6B64, 0xB4CB,
    0x6B65, 0xB2BD,
    0x6B66, 0xCEE4,
    0x6B67, 0xC6E7,
    0x6B6A, 0xCDE1,
    0x6B79, 0xB4F5,
    0x6B7B, 0xCBC0,
    0x6B7C, 0xBCDF,
    0x6B81, 0xE9E2,
    0x6B82, 0xE9E3,
    0x6B83, 0xD1EA,
    0x6B84, 0xE9E5,
    0x6B86, 0xB4F9,
    0x6B87, 0xE9E4,
    0x6B89, 0xD1B3,
    0x6B8A, 0xCAE2,
    0x6B8B, 0xB2D0,
    0x6B8D, 0xE9E8,
    0x6B92, 0xE9E6,
    0x6B93, 0xE9E7,
    0x6B96, 0xD6B3,
    0x6B9A, 0xE9E9,
    0x6B9B, 0xE9EA,
    0x6BA1, 0xE9EB,
    0x6BAA, 0xE9EC,
    0x6BB3, 0xECAF,
    0x6BB4, 0xC5B9,
    0x6BB5, 0xB6CE,
    0x6BB7, 0xD2F3,
    0x6BBF, 0xB5EE,
    0x6BC1, 0xBBD9,
    0x6BC2, 0xECB1,
    0x6BC5, 0xD2E3,
    0x6BCB, 0xCEE3,
    0x6BCD, 0xC4B8,
    0x6BCF, 0xC3BF,
    0x6BD2, 0xB6BE,
    0x6BD3, 0xD8B9,
    0x6BD4, 0xB1C8,
    0x6BD5, 0xB1CF,
    0x6BD6, 0xB1D1,
    0x6BD7, 0xC5FE,
    0x6BD9, 0xB1D0,
    0x6BDB, 0xC3AB,
    0x6BE1, 0xD5B1,
    0x6BEA, 0xEBA4,
    0x6BEB, 0xBAC1,
    0x6BEF, 0xCCBA,
    0x6BF3, 0xEBA5,
    0x6BF5, 0xEBA7,
    0x6BF9, 0xEBA8,
    0x6BFD, 0xEBA6,
    0x6C05, 0xEBA9,
    0x6C06, 0xEBAB,
    0x6C07, 0xEBAA,
    0x6C0D, 0xEBAC,
    0x6C0F, 0xCACF,
    0x6C10, 0xD8B5,
    0x6C11, 0xC3F1,
    0x6C13, 0xC3A5,
    0x6C14, 0xC6F8,
    0x6C15, 0xEBAD,
    0x6C16, 0xC4CA,
    0x6C18, 0xEBAE,
    0x6C19, 0xEBAF,
    0x6C1A, 0xEBB0,
    0x6C1B, 0xB7D5,
    0x6C1F, 0xB7FA,
    0x6C21, 0xEBB1,
    0x6C22, 0xC7E2,
    0x6C24, 0xEBB3,
    0x6C26, 0xBAA4,
    0x6C27, 0xD1F5,
    0x6C28, 0xB0B1,
    0x6C29, 0xEBB2,
    0x6C2A, 0xEBB4,
    0x6C2E, 0xB5AA,
    0x6C2F, 0xC2C8,
    0x6C30, 0xC7E8,
    0x6C32, 0xEBB5,
    0x6C34, 0xCBAE,
    0x6C35, 0xE3DF,
    0x6C38, 0xD3C0,
    0x6C3D, 0xD9DB,
    0x6C40, 0xCDA1,
    0x6C41, 0xD6AD,
    0x6C42, 0xC7F3,
    0x6C46, 0xD9E0,
    0x6C47, 0xBBE3,
    0x6C49, 0xBABA,
    0x6C4A, 0xE3E2,
    0x6C50, 0xCFAB,
    0x6C54, 0xE3E0,
    0x6C55, 0xC9C7,
    0x6C57, 0xBAB9,
    0x6C5B, 0xD1B4,
    0x6C5C, 0xE3E1,
    0x6C5D, 0xC8EA,
    0x6C5E, 0xB9AF,
    0x6C5F, 0xBDAD,
    0x6C60, 0xB3D8,
    0x6C61, 0xCEDB,
    0x6C64, 0xCCC0,
    0x6C68, 0xE3E8,
    0x6C69, 0xE3E9,
    0x6C6A, 0xCDF4,
    0x6C70, 0xCCAD,
    0x6C72, 0xBCB3,
    0x6C74, 0xE3EA,
    0x6C76, 0xE3EB,
    0x6C79, 0xD0DA,
    0x6C7D, 0xC6FB,
    0x6C7E, 0xB7DA,
    0x6C81, 0xC7DF,
    0x6C82, 0xD2CA,
    0x6C83, 0xCED6,
    0x6C85, 0xE3E4,
    0x6C86, 0xE3EC,
    0x6C88, 0xC9F2,
    0x6C89, 0xB3C1,
    0x6C8C, 0xE3E7,
    0x6C8F, 0xC6E3,
    0x6C90, 0xE3E5,
    0x6C93, 0xEDB3,
    0x6C94, 0xE3E6,
    0x6C99, 0xC9B3,
    0x6C9B, 0xC5E6,
    0x6C9F, 0xB9B5,
    0x6CA1, 0xC3BB,
    0x6CA3, 0xE3E3,
    0x6CA4, 0xC5BD,
    0x6CA5, 0xC1A4,
    0x6CA6, 0xC2D9,
    0x6CA7, 0xB2D7,
    0x6CA9, 0xE3ED,
    0x6CAA, 0xBBA6,
    0x6CAB, 0xC4AD,
    0x6CAD, 0xE3F0,
    0x6CAE, 0xBEDA,
    0x6CB1, 0xE3FB,
    0x6CB2, 0xE3F5,
    0x6CB3, 0xBAD3,
    0x6CB8, 0xB7D0,
    0x6CB9, 0xD3CD,
    0x6CBB, 0xD6CE,
    0x6CBC, 0xD5D3,
    0x6CBD, 0xB9C1,
    0x6CBE, 0xD5B4,
    0x6CBF, 0xD1D8,
    0x6CC4, 0xD0B9,
    0x6CC5, 0xC7F6,
    0x6CC9, 0xC8AA,
    0x6CCA, 0xB2B4,
    0x6CCC, 0xC3DA,
    0x6CD0, 0xE3EE,
    0x6CD3, 0xE3FC,
    0x6CD4, 0xE3EF,
    0x6CD5, 0xB7A8,
    0x6CD6, 0xE3F7,
    0x6CD7, 0xE3F4,
    0x6CDB, 0xB7BA,
    0x6CDE, 0xC5A2,
    0x6CE0, 0xE3F6,
    0x6CE1, 0xC5DD,
    0x6CE2, 0xB2A8,
    0x6CE3, 0xC6FC,
    0x6CE5, 0xC4E0,
    0x6CE8, 0xD7A2,
    0x6CEA, 0xC0E1,
    0x6CEB, 0xE3F9,
    0x6CEE, 0xE3FA,
    0x6CEF, 0xE3FD,
    0x6CF0, 0xCCA9,
    0x6CF1, 0xE3F3,
    0x6CF3, 0xD3BE,
    0x6CF5, 0xB1C3,
    0x6CF6, 0xEDB4,
    0x6CF7, 0xE3F1,
    0x6CF8, 0xE3F2,
    0x6CFA, 0xE3F8,
    0x6CFB, 0xD0BA,
    0x6CFC, 0xC6C3,
    0x6CFD, 0xD4F3,
    0x6CFE, 0xE3FE,
    0x6D01, 0xBDE0,
    0x6D04, 0xE4A7,
    0x6D07, 0xE4A6,
    0x6D0B, 0xD1F3,
    0x6D0C, 0xE4A3,
    0x6D0E, 0xE4A9,
    0x6D12, 0xC8F7,
    0x6D17, 0xCFB4,
    0x6D19, 0xE4A8,
    0x6D1A, 0xE4AE,
    0x6D1B, 0xC2E5,
    0x6D1E, 0xB6B4,
    0x6D25, 0xBDF2,
    0x6D27, 0xE4A2,
    0x6D2A, 0xBAE9,
    0x6D2B, 0xE4AA,
    0x6D2E, 0xE4AC,
    0x6D31, 0xB6FD,
    0x6D32, 0xD6DE,
    0x6D33, 0xE4B2,
    0x6D35, 0xE4AD,
    0x6D39, 0xE4A1,
    0x6D3B, 0xBBEE,
    0x6D3C, 0xCDDD,
    0x6D3D, 0xC7A2,
    0x6D3E, 0xC5C9,
    0x6D41, 0xC1F7,
    0x6D43, 0xE4A4,
    0x6D45, 0xC7B3,
    0x6D46, 0xBDAC,
    0x6D47, 0xBDBD,
    0x6D48, 0xE4A5,
    0x6D4A, 0xD7C7,
    0x6D4B, 0xB2E2,
    0x6D4D, 0xE4AB,
    0x6D4E, 0xBCC3,
    0x6D4F, 0xE4AF,
    0x6D51, 0xBBEB,
    0x6D52, 0xE4B0,
    0x6D53, 0xC5A8,
    0x6D54, 0xE4B1,
    0x6D59, 0xD5E3,
    0x6D5A, 0xBFA3,
    0x6D5C, 0xE4BA,
    0x6D5E, 0xE4B7,
    0x6D60, 0xE4BB,
    0x6D63, 0xE4BD,
    0x6D66, 0xC6D6,
    0x6D69, 0xBAC6,
    0x6D6A, 0xC0CB,
    0x6D6E, 0xB8A1,
    0x6D6F, 0xE4B4,
    0x6D74, 0xD4A1,
    0x6D77, 0xBAA3,
    0x6D78, 0xBDFE,
    0x6D7C, 0xE4BC,
    0x6D82, 0xCDBF,
    0x6D85, 0xC4F9,
    0x6D88, 0xCFFB,
    0x6D89, 0xC9E6,
    0x6D8C, 0xD3BF,
    0x6D8E, 0xCFD1,
    0x6D91, 0xE4B3,
    0x6D93, 0xE4B8,
    0x6D94, 0xE4B9,
    0x6D95, 0xCCE9,
    0x6D9B, 0xCCCE,
    0x6D9D, 0xC0D4,
    0x6D9E, 0xE4B5,
    0x6D9F, 0xC1B0,
    0x6DA0, 0xE4B6,
    0x6DA1, 0xCED0,
    0x6DA3, 0xBBC1,
    0x6DA4, 0xB5D3,
    0x6DA6, 0xC8F3,
    0x6DA7, 0xBDA7,
    0x6DA8, 0xD5C7,
    0x6DA9, 0xC9AC,
    0x6DAA, 0xB8A2,
    0x6DAB, 0xE4CA,
    0x6DAE, 0xE4CC,
    0x6DAF, 0xD1C4,
    0x6DB2, 0xD2BA,
    0x6DB5, 0xBAAD,
    0x6DB8, 0xBAD4,
    0x6DBF, 0xE4C3,
    0x6DC0, 0xB5ED,
    0x6DC4, 0xD7CD,
    0x6DC5, 0xE4C0,
    0x6DC6, 0xCFFD,
    0x6DC7, 0xE4BF,
    0x6DCB, 0xC1DC,
    0x6DCC, 0xCCCA,
    0x6DD1, 0xCAE7,
    0x6DD6, 0xC4D7,
    0x6DD8, 0xCCD4,
    0x6DD9, 0xE4C8,
    0x6DDD, 0xE4C7,
    0x6DDE, 0xE4C1,
    0x6DE0, 0xE4C4,
    0x6DE1, 0xB5AD,
    0x6DE4, 0xD3D9,
    0x6DE6, 0xE4C6,
    0x6DEB, 0xD2F9,
    0x6DEC, 0xB4E3,
    0x6DEE, 0xBBB4,
    0x6DF1, 0xC9EE,
    0x6DF3, 0xB4BE,
    0x6DF7, 0xBBEC,
    0x6DF9, 0xD1CD,
    0x6DFB, 0xCCED,
    0x6DFC, 0xEDB5,
    0x6E05, 0xC7E5,
    0x6E0A, 0xD4A8,
    0x6E0C, 0xE4CB,
    0x6E0D, 0xD7D5,
    0x6E0E, 0xE4C2,
    0x6E10, 0xBDA5,
    0x6E11, 0xE4C5,
    0x6E14, 0xD3E6,
    0x6E16, 0xE4C9,
    0x6E17, 0xC9F8,
    0x6E1A, 0xE4BE,
    0x6E1D, 0xD3E5,
    0x6E20, 0xC7FE,
    0x6E21, 0xB6C9,
    0x6E23, 0xD4FC,
    0x6E24, 0xB2B3,
    0x6E25, 0xE4D7,
    0x6E29, 0xCEC2,
    0x6E2B, 0xE4CD,
    0x6E2D, 0xCEBC,
    0x6E2F, 0xB8DB,
    0x6E32, 0xE4D6,
    0x6E34, 0xBFCA,
    0x6E38, 0xD3CE,
    0x6E3A, 0xC3EC,
    0x6E43, 0xC5C8,
    0x6E44, 0xE4D8,
    0x6E4D, 0xCDC4,
    0x6E4E, 0xE4CF,
    0x6E53, 0xE4D4,
    0x6E54, 0xE4D5,
    0x6E56, 0xBAFE,
    0x6E58, 0xCFE6,
    0x6E5B, 0xD5BF,
    0x6E5F, 0xE4D2,
    0x6E6B, 0xE4D0,
    0x6E6E, 0xE4CE,
    0x6E7E, 0xCDE5,
    0x6E7F, 0xCAAA,
    0x6E83, 0xC0A3,
    0x6E85, 0xBDA6,
    0x6E86, 0xE4D3,
    0x6E89, 0xB8C8,
    0x6E8F, 0xE4E7,
    0x6E90, 0xD4B4,
    0x6E98, 0xE4DB,
    0x6E9C, 0xC1EF,
    0x6E9F, 0xE4E9,
    0x6EA2, 0xD2E7,
    0x6EA5, 0xE4DF,
    0x6EA7, 0xE4E0,
    0x6EAA, 0xCFAA,
    0x6EAF, 0xCBDD,
    0x6EB1, 0xE4DA,
    0x6EB2, 0xE4D1,
    0x6EB4, 0xE4E5,
    0x6EB6, 0xC8DC,
    0x6EB7, 0xE4E3,
    0x6EBA, 0xC4E7,
    0x6EBB, 0xE4E2,
    0x6EBD, 0xE4E1,
    0x6EC1, 0xB3FC,
    0x6EC2, 0xE4E8,
    0x6EC7, 0xB5E1,
    0x6ECB, 0xD7CC,
    0x6ECF, 0xE4E6,
    0x6ED1, 0xBBAC,
    0x6ED3, 0xD7D2,
    0x6ED4, 0xCCCF,
    0x6ED5, 0xEBF8,
    0x6ED7, 0xE4E4,
    0x6EDA, 0xB9F6,
    0x6EDE, 0xD6CD,
    0x6EDF, 0xE4D9,
    0x6EE0, 0xE4DC,
    0x6EE1, 0xC2FA,
    0x6EE2, 0xE4DE,
    0x6EE4, 0xC2CB,
    0x6EE5, 0xC0C4,
    0x6EE6, 0xC2D0,
    0x6EE8, 0xB1F5,
    0x6EE9, 0xCCB2,
    0x6EF4, 0xB5CE,
    0x6EF9, 0xE4EF,
    0x6F02, 0xC6AF,
    0x6F06, 0xC6E1,
    0x6F09, 0xE4F5,
    0x6F0F, 0xC2A9,
    0x6F13, 0xC0EC,
    0x6F14, 0xD1DD,
    0x6F15, 0xE4EE,
    0x6F20, 0xC4AE,
    0x6F24, 0xE4ED,
    0x6F29, 0xE4F6,
    0x6F2A, 0xE4F4,
    0x6F2B, 0xC2FE,
    0x6F2D, 0xE4DD,
    0x6F2F, 0xE4F0,
    0x6F31, 0xCAFE,
    0x6F33, 0xD5C4,
    0x6F36, 0xE4F1,
    0x6F3E, 0xD1FA,
    0x6F46, 0xE4EB,
    0x6F47, 0xE4EC,
    0x6F4B, 0xE4F2,
    0x6F4D, 0xCEAB,
    0x6F58, 0xC5CB,
    0x6F5C, 0xC7B1,
    0x6F5E, 0xC2BA,
    0x6F62, 0xE4EA,
    0x6F66, 0xC1CA,
    0x6F6D, 0xCCB6,
    0x6F6E, 0xB3B1,
    0x6F72, 0xE4FB,
    0x6F74, 0xE4F3,
    0x6F78, 0xE4FA,
    0x6F7A, 0xE4FD,
    0x6F7C, 0xE4FC,
    0x6F84, 0xB3CE,
    0x6F88, 0xB3BA,
    0x6F89, 0xE4F7,
    0x6F8C, 0xE4F9,
    0x6F8D, 0xE4F8,
    0x6F8E, 0xC5EC,
    0x6F9C, 0xC0BD,
    0x6FA1, 0xD4E8,
    0x6FA7, 0xE5A2,
    0x6FB3, 0xB0C4,
    0x6FB6, 0xE5A4,
    0x6FB9, 0xE5A3,
    0x6FC0, 0xBCA4,
    0x6FC2, 0xE5A5,
    0x6FC9, 0xE5A1,
    0x6FD1, 0xE4FE,
    0x6FD2, 0xB1F4,
    0x6FDE, 0xE5A8,
    0x6FE0, 0xE5A9,
    0x6FE1, 0xE5A6,
    0x6FEE, 0xE5A7,
    0x6FEF, 0xE5AA,
    0x7011, 0xC6D9,
    0x701A, 0xE5AB,
    0x701B, 0xE5AD,
    0x7023, 0xE5AC,
    0x7035, 0xE5AF,
    0x7039, 0xE5AE,
    0x704C, 0xB9E0,
    0x704F, 0xE5B0,
    0x705E, 0xE5B1,
    0x706B, 0xBBF0,
    0x706C, 0xECE1,
    0x706D, 0xC3F0,
    0x706F, 0xB5C6,
    0x7070, 0xBBD2,
    0x7075, 0xC1E9,
    0x7076, 0xD4EE,
    0x7078, 0xBEC4,
    0x707C, 0xD7C6,
    0x707E, 0xD4D6,
    0x707F, 0xB2D3,
    0x7080, 0xECBE,
    0x7085, 0xEAC1,
    0x7089, 0xC2AF,
    0x708A, 0xB4B6,
    0x708E, 0xD1D7,
    0x7092, 0xB3B4,
    0x7094, 0xC8B2,
    0x7095, 0xBFBB,
    0x7096, 0xECC0,
    0x7099, 0xD6CB,
    0x709C, 0xECBF,
    0x709D, 0xECC1,
    0x70AB, 0xECC5,
    0x70AC, 0xBEE6,
    0x70AD, 0xCCBF,
    0x70AE, 0xC5DA,
    0x70AF, 0xBEBC,
    0x70B1, 0xECC6,
    0x70B3, 0xB1FE,
    0x70B7, 0xECC4,
    0x70B8, 0xD5A8,
    0x70B9, 0xB5E3,
    0x70BB, 0xECC2,
    0x70BC, 0xC1B6,
    0x70BD, 0xB3E3,
    0x70C0, 0xECC3,
    0x70C1, 0xCBB8,
    0x70C2, 0xC0C3,
    0x70C3, 0xCCFE,
    0x70C8, 0xC1D2,
    0x70CA, 0xECC8,
    0x70D8, 0xBAE6,
    0x70D9, 0xC0D3,
    0x70DB, 0xD6F2,
    0x70DF, 0xD1CC,
    0x70E4, 0xBFBE,
    0x70E6, 0xB7B3,
    0x70E7, 0xC9D5,
    0x70E8, 0xECC7,
    0x70E9, 0xBBE2,
    0x70EB, 0xCCCC,
    0x70EC, 0xBDFD,
    0x70ED, 0xC8C8,
    0x70EF, 0xCFA9,
    0x70F7, 0xCDE9,
    0x70F9, 0xC5EB,
    0x70FD, 0xB7E9,
    0x7109, 0xD1C9,
    0x710A, 0xBAB8,
    0x7110, 0xECC9,
    0x7113, 0xECCA,
    0x7115, 0xBBC0,
    0x7116, 0xECCB,
    0x7118, 0xECE2,
    0x7119, 0xB1BA,
    0x711A, 0xB7D9,
    0x7126, 0xBDB9,
    0x712F, 0xECCC,
    0x7130, 0xD1E6,
    0x7131, 0xECCD,
    0x7136, 0xC8BB,
    0x7145, 0xECD1,
    0x714A, 0xECD3,
    0x714C, 0xBBCD,
    0x714E, 0xBCE5,
    0x715C, 0xECCF,
    0x715E, 0xC9B7,
    0x7164, 0xC3BA,
    0x7166, 0xECE3,
    0x7167, 0xD5D5,
    0x7168, 0xECD0,
    0x716E, 0xD6F3,
    0x7172, 0xECD2,
    0x7173, 0xECCE,
    0x7178, 0xECD4,
    0x717A, 0xECD5,
    0x717D, 0xC9BF,
    0x7184, 0xCFA8,
    0x718A, 0xD0DC,
    0x718F, 0xD1AC,
    0x7194, 0xC8DB,
    0x7198, 0xECD6,
    0x7199, 0xCEF5,
    0x719F, 0xCAEC,
    0x71A0, 0xECDA,
    0x71A8, 0xECD9,
    0x71AC, 0xB0BE,
    0x71B3, 0xECD7,
    0x71B5, 0xECD8,
    0x71B9, 0xECE4,
    0x71C3, 0xC8BC,
    0x71CE, 0xC1C7,
    0x71D4, 0xECDC,
    0x71D5, 0xD1E0,
    0x71E0, 0xECDB,
    0x71E5, 0xD4EF,
    0x71E7, 0xECDD,
    0x71EE, 0xDBC6,
    0x71F9, 0xECDE,
    0x7206, 0xB1AC,
    0x721D, 0xECDF,
    0x7228, 0xECE0,
    0x722A, 0xD7A6,
    0x722C, 0xC5C0,
    0x7230, 0xEBBC,
    0x7231, 0xB0AE,
    0x7235, 0xBEF4,
    0x7236, 0xB8B8,
    0x7237, 0xD2AF,
    0x7238, 0xB0D6,
    0x7239, 0xB5F9,
    0x723B, 0xD8B3,
    0x723D, 0xCBAC,
    0x723F, 0xE3DD,
    0x7247, 0xC6AC,
    0x7248, 0xB0E6,
    0x724C, 0xC5C6,
    0x724D, 0xEBB9,
    0x7252, 0xEBBA,
    0x7256, 0xEBBB,
    0x7259, 0xD1C0,
    0x725B, 0xC5A3,
    0x725D, 0xEAF2,
    0x725F, 0xC4B2,
    0x7261, 0xC4B5,
    0x7262, 0xC0CE,
    0x7266, 0xEAF3,
    0x7267, 0xC4C1,
    0x7269, 0xCEEF,
    0x726E, 0xEAF0,
    0x726F, 0xEAF4,
    0x7272, 0xC9FC,
    0x7275, 0xC7A3,
    0x7279, 0xCCD8,
    0x727A, 0xCEFE,
    0x727E, 0xEAF5,
    0x727F, 0xEAF6,
    0x7280, 0xCFAC,
    0x7281, 0xC0E7,
    0x7284, 0xEAF7,
    0x728A, 0xB6BF,
    0x728B, 0xEAF8,
    0x728D, 0xEAF9,
    0x728F, 0xEAFA,
    0x7292, 0xEAFB,
    0x729F, 0xEAF1,
    0x72AC, 0xC8AE,
    0x72AD, 0xE1EB,
    0x72AF, 0xB7B8,
    0x72B0, 0xE1EC,
    0x72B4, 0xE1ED,
    0x72B6, 0xD7B4,
    0x72B7, 0xE1EE,
    0x72B8, 0xE1EF,
    0x72B9, 0xD3CC,
    0x72C1, 0xE1F1,
    0x72C2, 0xBFF1,
    0x72C3, 0xE1F0,
    0x72C4, 0xB5D2,
    0x72C8, 0xB1B7,
    0x72CD, 0xE1F3,
    0x72CE, 0xE1F2,
    0x72D0, 0xBAFC,
    0x72D2, 0xE1F4,
    0x72D7, 0xB9B7,
    0x72D9, 0xBED1,
    0x72DE, 0xC4FC,
    0x72E0, 0xBADD,
    0x72E1, 0xBDC6,
    0x72E8, 0xE1F5,
    0x72E9, 0xE1F7,
    0x72EC, 0xB6C0,
    0x72ED, 0xCFC1,
    0x72EE, 0xCAA8,
    0x72EF, 0xE1F6,
    0x72F0, 0xD5F8,
    0x72F1, 0xD3FC,
    0x72F2, 0xE1F8,
    0x72F3, 0xE1FC,
    0x72F4, 0xE1F9,
    0x72F7, 0xE1FA,
    0x72F8, 0xC0EA,
    0x72FA, 0xE1FE,
    0x72FB, 0xE2A1,
    0x72FC, 0xC0C7,
    0x7301, 0xE1FB,
    0x7303, 0xE1FD,
    0x730A, 0xE2A5,
    0x730E, 0xC1D4,
    0x7313, 0xE2A3,
    0x7315, 0xE2A8,
    0x7316, 0xB2FE,
    0x7317, 0xE2A2,
    0x731B, 0xC3CD,
    0x731C, 0xB2C2,
    0x731D, 0xE2A7,
    0x731E, 0xE2A6,
    0x7321, 0xE2A4,
    0x7322, 0xE2A9,
    0x7325, 0xE2AB,
    0x7329, 0xD0C9,
    0x732A, 0xD6ED,
    0x732B, 0xC3A8,
    0x732C, 0xE2AC,
    0x732E, 0xCFD7,
    0x7331, 0xE2AE,
    0x7334, 0xBAEF,
    0x7337, 0xE9E0,
    0x7338, 0xE2AD,
    0x7339, 0xE2AA,
    0x733E, 0xBBAB,
    0x733F, 0xD4B3,
    0x734D, 0xE2B0,
    0x7350, 0xE2AF,
    0x7352, 0xE9E1,
    0x7357, 0xE2B1,
    0x7360, 0xE2B2,
    0x736C, 0xE2B3,
    0x736D, 0xCCA1,
    0x736F, 0xE2B4,
    0x737E, 0xE2B5,
    0x7384, 0xD0FE,
    0x7387, 0xC2CA,
    0x7389, 0xD3F1,
    0x738B, 0xCDF5,
    0x738E, 0xE7E0,
    0x7391, 0xE7E1,
    0x7396, 0xBEC1,
    0x739B, 0xC2EA,
    0x739F, 0xE7E4,
    0x73A2, 0xE7E3,
    0x73A9, 0xCDE6,
    0x73AB, 0xC3B5,
    0x73AE, 0xE7E2,
    0x73AF, 0xBBB7,
    0x73B0, 0xCFD6,
    0x73B2, 0xC1E1,
    0x73B3, 0xE7E9,
    0x73B7, 0xE7E8,
    0x73BA, 0xE7F4,
    0x73BB, 0xB2A3,
    0x73C0, 0xE7EA,
    0x73C2, 0xE7E6,
    0x73C8, 0xE7EC,
    0x73C9, 0xE7EB,
    0x73CA, 0xC9BA,
    0x73CD, 0xD5E4,
    0x73CF, 0xE7E5,
    0x73D0, 0xB7A9,
    0x73D1, 0xE7E7,
    0x73D9, 0xE7EE,
    0x73DE, 0xE7F3,
    0x73E0, 0xD6E9,
    0x73E5, 0xE7ED,
    0x73E7, 0xE7F2,
    0x73E9, 0xE7F1,
    0x73ED, 0xB0E0,
    0x73F2, 0xE7F5,
    0x7403, 0xC7F2,
    0x7405, 0xC0C5,
    0x7406, 0xC0ED,
    0x7409, 0xC1F0,
    0x740A, 0xE7F0,
    0x740F, 0xE7F6,
    0x7410, 0xCBF6,
    0x741A, 0xE8A2,
    0x741B, 0xE8A1,
    0x7422, 0xD7C1,
    0x7425, 0xE7FA,
    0x7426, 0xE7F9,
    0x7428, 0xE7FB,
    0x742A, 0xE7F7,
    0x742C, 0xE7FE,
    0x742E, 0xE7FD,
    0x7430, 0xE7FC,
    0x7433, 0xC1D5,
    0x7434, 0xC7D9,
    0x7435, 0xC5FD,
    0x7436, 0xC5C3,
    0x743C, 0xC7ED,
    0x7441, 0xE8A3,
    0x7455, 0xE8A6,
    0x7457, 0xE8A5,
    0x7459, 0xE8A7,
    0x745A, 0xBAF7,
    0x745B, 0xE7F8,
    0x745C, 0xE8A4,
    0x745E, 0xC8F0,
    0x745F, 0xC9AA,
    0x746D, 0xE8A9,
    0x7470, 0xB9E5,
    0x7476, 0xD1FE,
    0x7477, 0xE8A8,
    0x747E, 0xE8AA,
    0x7480, 0xE8AD,
    0x7481, 0xE8AE,
    0x7483, 0xC1A7,
    0x7487, 0xE8AF,
    0x748B, 0xE8B0,
    0x748E, 0xE8AC,
    0x7490, 0xE8B4,
    0x749C, 0xE8AB,
    0x749E, 0xE8B1,
    0x74A7, 0xE8B5,
    0x74A8, 0xE8B2,
    0x74A9, 0xE8B3,
    0x74BA, 0xE8B7,
    0x74D2, 0xE8B6,
    0x74DC, 0xB9CF,
    0x74DE, 0xF0AC,
    0x74E0, 0xF0AD,
    0x74E2, 0xC6B0,
    0x74E3, 0xB0EA,
    0x74E4, 0xC8BF,
    0x74E6, 0xCDDF,
    0x74EE, 0xCECD,
    0x74EF, 0xEAB1,
    0x74F4, 0xEAB2,
    0x74F6, 0xC6BF,
    0x74F7, 0xB4C9,
    0x74FF, 0xEAB3,
    0x7504, 0xD5E7,
    0x750D, 0xDDF9,
    0x750F, 0xEAB4,
    0x7511, 0xEAB5,
    0x7513, 0xEAB6,
    0x7518, 0xB8CA,
    0x7519, 0xDFB0,
    0x751A, 0xC9F5,
    0x751C, 0xCCF0,
    0x751F, 0xC9FA,
    0x7525, 0xC9FB,
    0x7528, 0xD3C3,
    0x7529, 0xCBA6,
    0x752B, 0xB8A6,
    0x752C, 0xF0AE,
    0x752D, 0xB1C2,
    0x752F, 0xE5B8,
    0x7530, 0xCCEF,
    0x7531, 0xD3C9,
    0x7532, 0xBCD7,
    0x7533, 0xC9EA,
    0x7535, 0xB5E7,
    0x7537, 0xC4D0,
    0x7538, 0xB5E9,
    0x753A, 0xEEAE,
    0x753B, 0xBBAD,
    0x753E, 0xE7DE,
    0x7540, 0xEEAF,
    0x7545, 0xB3A9,
    0x7548, 0xEEB2,
    0x754B, 0xEEB1,
    0x754C, 0xBDE7,
    0x754E, 0xEEB0,
    0x754F, 0xCEB7,
    0x7554, 0xC5CF,
    0x7559, 0xC1F4,
    0x755A, 0xDBCE,
    0x755B, 0xEEB3,
    0x755C, 0xD0F3,
    0x7565, 0xC2D4,
    0x7566, 0xC6E8,
    0x756A, 0xB7AC,
    0x7572, 0xEEB4,
    0x7574, 0xB3EB,
    0x7578, 0xBBFB,
    0x7579, 0xEEB5,
    0x757F, 0xE7DC,
    0x7583, 0xEEB6,
    0x7586, 0xBDAE,
    0x758B, 0xF1E2,
    0x758F, 0xCAE8,
    0x7591, 0xD2C9,
    0x7592, 0xF0DA,
    0x7594, 0xF0DB,
    0x7596, 0xF0DC,
    0x7597, 0xC1C6,
    0x7599, 0xB8ED,
    0x759A, 0xBECE,
    0x759D, 0xF0DE,
    0x759F, 0xC5B1,
    0x75A0, 0xF0DD,
    0x75A1, 0xD1F1,
    0x75A3, 0xF0E0,
    0x75A4, 0xB0CC,
    0x75A5, 0xBDEA,
    0x75AB, 0xD2DF,
    0x75AC, 0xF0DF,
    0x75AE, 0xB4AF,
    0x75AF, 0xB7E8,
    0x75B0, 0xF0E6,
    0x75B1, 0xF0E5,
    0x75B2, 0xC6A3,
    0x75B3, 0xF0E1,
    0x75B4, 0xF0E2,
    0x75B5, 0xB4C3,
    0x75B8, 0xF0E3,
    0x75B9, 0xD5EE,
    0x75BC, 0xCCDB,
    0x75BD, 0xBED2,
    0x75BE, 0xBCB2,
    0x75C2, 0xF0E8,
    0x75C3, 0xF0E7,
    0x75C4, 0xF0E4,
    0x75C5, 0xB2A1,
    0x75C7, 0xD6A2,
    0x75C8, 0xD3B8,
    0x75C9, 0xBEB7,
    0x75CA, 0xC8AC,
    0x75CD, 0xF0EA,
    0x75D2, 0xD1F7,
    0x75D4, 0xD6CC,
    0x75D5, 0xBADB,
    0x75D6, 0xF0E9,
    0x75D8, 0xB6BB,
    0x75DB, 0xCDB4,
    0x75DE, 0xC6A6,
    0x75E2, 0xC1A1,
    0x75E3, 0xF0EB,
    0x75E4, 0xF0EE,
    0x75E6, 0xF0ED,
    0x75E7, 0xF0F0,
    0x75E8, 0xF0EC,
    0x75EA, 0xBBBE,
    0x75EB, 0xF0EF,
    0x75F0, 0xCCB5,
    0x75F1, 0xF0F2,
    0x75F4, 0xB3D5,
    0x75F9, 0xB1D4,
    0x75FC, 0xF0F3,
    0x75FF, 0xF0F4,
    0x7600, 0xF0F6,
    0x7601, 0xB4E1,
    0x7603, 0xF0F1,
    0x7605, 0xF0F7,
    0x760A, 0xF0FA,
    0x760C, 0xF0F8,
    0x7610, 0xF0F5,
    0x7615, 0xF0FD,
    0x7617, 0xF0F9,
    0x7618, 0xF0FC,
    0x7619, 0xF0FE,
    0x761B, 0xF1A1,
    0x761F, 0xCEC1,
    0x7620, 0xF1A4,
    0x7622, 0xF1A3,
    0x7624, 0xC1F6,
    0x7625, 0xF0FB,
    0x7626, 0xCADD,
    0x7629, 0xB4F1,
    0x762A, 0xB1F1,
    0x762B, 0xCCB1,
    0x762D, 0xF1A6,
    0x7630, 0xF1A7,
    0x7633, 0xF1AC,
    0x7634, 0xD5CE,
    0x7635, 0xF1A9,
    0x7638, 0xC8B3,
    0x763C, 0xF1A2,
    0x763E, 0xF1AB,
    0x763F, 0xF1A8,
    0x7640, 0xF1A5,
    0x7643, 0xF1AA,
    0x764C, 0xB0A9,
    0x764D, 0xF1AD,
    0x7654, 0xF1AF,
    0x7656, 0xF1B1,
    0x765C, 0xF1B0,
    0x765E, 0xF1AE,
    0x7663, 0xD1A2,
    0x766B, 0xF1B2,
    0x766F, 0xF1B3,
    0x7678, 0xB9EF,
    0x767B, 0xB5C7,
    0x767D, 0xB0D7,
    0x767E, 0xB0D9,
    0x7682, 0xD4ED,
    0x7684, 0xB5C4,
    0x7686, 0xBDD4,
    0x7687, 0xBBCA,
    0x7688, 0xF0A7,
    0x768B, 0xB8DE,
    0x768E, 0xF0A8,
    0x7691, 0xB0A8,
    0x7693, 0xF0A9,
    0x7696, 0xCDEE,
    0x7699, 0xF0AA,
    0x76A4, 0xF0AB,
    0x76AE, 0xC6A4,
    0x76B1, 0xD6E5,
    0x76B2, 0xF1E4,
    0x76B4, 0xF1E5,
    0x76BF, 0xC3F3,
    0x76C2, 0xD3DB,
    0x76C5, 0xD6D1,
    0x76C6, 0xC5E8,
    0x76C8, 0xD3AF,
    0x76CA, 0xD2E6,
    0x76CD, 0xEEC1,
    0x76CE, 0xB0BB,
    0x76CF, 0xD5B5,
    0x76D0, 0xD1CE,
    0x76D1, 0xBCE0,
    0x76D2, 0xBAD0,
    0x76D4, 0xBFF8,
    0x76D6, 0xB8C7,
    0x76D7, 0xB5C1,
    0x76D8, 0xC5CC,
    0x76DB, 0xCAA2,
    0x76DF, 0xC3CB,
    0x76E5, 0xEEC2,
    0x76EE, 0xC4BF,
    0x76EF, 0xB6A2,
    0x76F1, 0xEDEC,
    0x76F2, 0xC3A4,
    0x76F4, 0xD6B1,
    0x76F8, 0xCFE0,
    0x76F9, 0xEDEF,
    0x76FC, 0xC5CE,
    0x76FE, 0xB6DC,
    0x7701, 0xCAA1,
    0x7704, 0xEDED,
    0x7707, 0xEDF0,
    0x7708, 0xEDF1,
    0x7709, 0xC3BC,
    0x770B, 0xBFB4,
    0x770D, 0xEDEE,
    0x7719, 0xEDF4,
    0x771A, 0xEDF2,
    0x771F, 0xD5E6,
    0x7720, 0xC3DF,
    0x7722, 0xEDF3,
    0x7726, 0xEDF6,
    0x7728, 0xD5A3,
    0x7729, 0xD1A3,
    0x772D, 0xEDF5,
    0x772F, 0xC3D0,
    0x7735, 0xEDF7,
    0x7736, 0xBFF4,
    0x7737, 0xBEEC,
    0x7738, 0xEDF8,
    0x773A, 0xCCF7,
    0x773C, 0xD1DB,
    0x7740, 0xD7C5,
    0x7741, 0xD5F6,
    0x7743, 0xEDFC,
    0x7747, 0xEDFB,
    0x7750, 0xEDF9,
    0x7751, 0xEDFA,
    0x775A, 0xEDFD,
    0x775B, 0xBEA6,
    0x7761, 0xCBAF,
    0x7762, 0xEEA1,
    0x7763, 0xB6BD,
    0x7765, 0xEEA2,
    0x7766, 0xC4C0,
    0x7768, 0xEDFE,
    0x776B, 0xBDDE,
    0x776C, 0xB2C7,
    0x7779, 0xB6C3,
    0x777D, 0xEEA5,
    0x777E, 0xD8BA,
    0x777F, 0xEEA3,
    0x7780, 0xEEA6,
    0x7784, 0xC3E9,
    0x7785, 0xB3F2,
    0x778C, 0xEEA7,
    0x778D, 0xEEA4,
    0x778E, 0xCFB9,
    0x7791, 0xEEA8,
    0x7792, 0xC2F7,
    0x779F, 0xEEA9,
    0x77A0, 0xEEAA,
    0x77A2, 0xDEAB,
    0x77A5, 0xC6B3,
    0x77A7, 0xC7C6,
    0x77A9, 0xD6F5,
    0x77AA, 0xB5C9,
    0x77AC, 0xCBB2,
    0x77B0, 0xEEAB,
    0x77B3, 0xCDAB,
    0x77B5, 0xEEAC,
    0x77BB, 0xD5B0,
    0x77BD, 0xEEAD,
    0x77BF, 0xF6C4,
    0x77CD, 0xDBC7,
    0x77D7, 0xB4A3,
    0x77DB, 0xC3AC,
    0x77DC, 0xF1E6,
    0x77E2, 0xCAB8,
    0x77E3, 0xD2D3,
    0x77E5, 0xD6AA,
    0x77E7, 0xEFF2,
    0x77E9, 0xBED8,
    0x77EB, 0xBDC3,
    0x77EC, 0xEFF3,
    0x77ED, 0xB6CC,
    0x77EE, 0xB0AB,
    0x77F3, 0xCAAF,
    0x77F6, 0xEDB6,
    0x77F8, 0xEDB7,
    0x77FD, 0xCEF9,
    0x77FE, 0xB7AF,
    0x77FF, 0xBFF3,
    0x7800, 0xEDB8,
    0x7801, 0xC2EB,
    0x7802, 0xC9B0,
    0x7809, 0xEDB9,
    0x780C, 0xC6F6,
    0x780D, 0xBFB3,
    0x7811, 0xEDBC,
    0x7812, 0xC5F8,
    0x7814, 0xD1D0,
    0x7816, 0xD7A9,
    0x7817, 0xEDBA,
    0x7818, 0xEDBB,
    0x781A, 0xD1E2,
    0x781C, 0xEDBF,
    0x781D, 0xEDC0,
    0x781F, 0xEDC4,
    0x7823, 0xEDC8,
    0x7825, 0xEDC6,
    0x7826, 0xEDCE,
    0x7827, 0xD5E8,
    0x7829, 0xEDC9,
    0x782C, 0xEDC7,
    0x782D, 0xEDBE,
    0x7830, 0xC5E9,
    0x7834, 0xC6C6,
    0x7837, 0xC9E9,
    0x7838, 0xD4D2,
    0x7839, 0xEDC1,
    0x783A, 0xEDC2,
    0x783B, 0xEDC3,
    0x783C, 0xEDC5,
    0x783E, 0xC0F9,
    0x7840, 0xB4A1,
    0x7845, 0xB9E8,
    0x7847, 0xEDD0,
    0x784C, 0xEDD1,
    0x784E, 0xEDCA,
    0x7850, 0xEDCF,
    0x7852, 0xCEF8,
    0x7855, 0xCBB6,
    0x7856, 0xEDCC,
    0x7857, 0xEDCD,
    0x785D, 0xCFF5,
    0x786A, 0xEDD2,
    0x786B, 0xC1F2,
    0x786C, 0xD3B2,
    0x786D, 0xEDCB,
    0x786E, 0xC8B7,
    0x7877, 0xBCEF,
    0x787C, 0xC5F0,
    0x7887, 0xEDD6,
    0x7889, 0xB5EF,
    0x788C, 0xC2B5,
    0x788D, 0xB0AD,
    0x788E, 0xCBE9,
    0x7891, 0xB1AE,
    0x7893, 0xEDD4,
    0x7897, 0xCDEB,
    0x7898, 0xB5E2,
    0x789A, 0xEDD5,
    0x789B, 0xEDD3,
    0x789C, 0xEDD7,
    0x789F, 0xB5FA,
    0x78A1, 0xEDD8,
    0x78A3, 0xEDD9,
    0x78A5, 0xEDDC,
    0x78A7, 0xB1CC,
    0x78B0, 0xC5F6,
    0x78B1, 0xBCEE,
    0x78B2, 0xEDDA,
    0x78B3, 0xCCBC,
    0x78B4, 0xB2EA,
    0x78B9, 0xEDDB,
    0x78BE, 0xC4EB,
    0x78C1, 0xB4C5,
    0x78C5, 0xB0F5,
    0x78C9, 0xEDDF,
    0x78CA, 0xC0DA,
    0x78CB, 0xB4E8,
    0x78D0, 0xC5CD,
    0x78D4, 0xEDDD,
    0x78D5, 0xBFC4,
    0x78D9, 0xEDDE,
    0x78E8, 0xC4A5,
    0x78EC, 0xEDE0,
    0x78F2, 0xEDE1,
    0x78F4, 0xEDE3,
    0x78F7, 0xC1D7,
    0x78FA, 0xBBC7,
    0x7901, 0xBDB8,
    0x7905, 0xEDE2,
    0x7913, 0xEDE4,
    0x791E, 0xEDE6,
    0x7924, 0xEDE5,
    0x7934, 0xEDE7,
    0x793A, 0xCABE,
    0x793B, 0xECEA,
    0x793C, 0xC0F1,
    0x793E, 0xC9E7,
    0x7940, 0xECEB,
    0x7941, 0xC6EE,
    0x7946, 0xECEC,
    0x7948, 0xC6ED,
    0x7949, 0xECED,
    0x7953, 0xECF0,
    0x7956, 0xD7E6,
    0x7957, 0xECF3,
    0x795A, 0xECF1,
    0x795B, 0xECEE,
    0x795C, 0xECEF,
    0x795D, 0xD7A3,
    0x795E, 0xC9F1,
    0x795F, 0xCBEE,
    0x7960, 0xECF4,
    0x7962, 0xECF2,
    0x7965, 0xCFE9,
    0x7967, 0xECF6,
    0x7968, 0xC6B1,
    0x796D, 0xBCC0,
    0x796F, 0xECF5,
    0x7977, 0xB5BB,
    0x7978, 0xBBF6,
    0x797A, 0xECF7,
    0x7980, 0xD9F7,
    0x7981, 0xBDFB,
    0x7984, 0xC2BB,
    0x7985, 0xECF8,
    0x798A, 0xECF9,
    0x798F, 0xB8A3,
    0x799A, 0xECFA,
    0x79A7, 0xECFB,
    0x79B3, 0xECFC,
    0x79B9, 0xD3ED,
    0x79BA, 0xD8AE,
    0x79BB, 0xC0EB,
    0x79BD, 0xC7DD,
    0x79BE, 0xBACC,
    0x79C0, 0xD0E3,
    0x79C1, 0xCBBD,
    0x79C3, 0xCDBA,
    0x79C6, 0xB8D1,
    0x79C9, 0xB1FC,
    0x79CB, 0xC7EF,
    0x79CD, 0xD6D6,
    0x79D1, 0xBFC6,
    0x79D2, 0xC3EB,
    0x79D5, 0xEFF5,
    0x79D8, 0xC3D8,
    0x79DF, 0xD7E2,
    0x79E3, 0xEFF7,
    0x79E4, 0xB3D3,
    0x79E6, 0xC7D8,
    0x79E7, 0xD1ED,
    0x79E9, 0xD6C8,
    0x79EB, 0xEFF8,
    0x79ED, 0xEFF6,
    0x79EF, 0xBBFD,
    0x79F0, 0xB3C6,
    0x79F8, 0xBDD5,
    0x79FB, 0xD2C6,
    0x79FD, 0xBBE0,
    0x7A00, 0xCFA1,
    0x7A02, 0xEFFC,
    0x7A03, 0xEFFB,
    0x7A06, 0xEFF9,
    0x7A0B, 0xB3CC,
    0x7A0D, 0xC9D4,
    0x7A0E, 0xCBB0,
    0x7A14, 0xEFFE,
    0x7A17, 0xB0DE,
    0x7A1A, 0xD6C9,
    0x7A1E, 0xEFFD,
    0x7A20, 0xB3ED,
    0x7A23, 0xF6D5,
    0x7A33, 0xCEC8,
    0x7A37, 0xF0A2,
    0x7A39, 0xF0A1,
    0x7A3B, 0xB5BE,
    0x7A3C, 0xBCDA,
    0x7A3D, 0xBBFC,
    0x7A3F, 0xB8E5,
    0x7A46, 0xC4C2,
    0x7A51, 0xF0A3,
    0x7A57, 0xCBEB,
    0x7A70, 0xF0A6,
    0x7A74, 0xD1A8,
    0x7A76, 0xBEBF,
    0x7A77, 0xC7EE,
    0x7A78, 0xF1B6,
    0x7A79, 0xF1B7,
    0x7A7A, 0xBFD5,
    0x7A7F, 0xB4A9,
    0x7A80, 0xF1B8,
    0x7A81, 0xCDBB,
    0x7A83, 0xC7D4,
    0x7A84, 0xD5AD,
    0x7A86, 0xF1B9,
    0x7A88, 0xF1BA,
    0x7A8D, 0xC7CF,
    0x7A91, 0xD2A4,
    0x7A92, 0xD6CF,
    0x7A95, 0xF1BB,
    0x7A96, 0xBDD1,
    0x7A97, 0xB4B0,
    0x7A98, 0xBEBD,
    0x7A9C, 0xB4DC,
    0x7A9D, 0xCED1,
    0x7A9F, 0xBFDF,
    0x7AA0, 0xF1BD,
    0x7AA5, 0xBFFA,
    0x7AA6, 0xF1BC,
    0x7AA8, 0xF1BF,
    0x7AAC, 0xF1BE,
    0x7AAD, 0xF1C0,
    0x7AB3, 0xF1C1,
    0x7ABF, 0xC1FE,
    0x7ACB, 0xC1A2,
    0x7AD6, 0xCAFA,
    0x7AD9, 0xD5BE,
    0x7ADE, 0xBEBA,
    0x7ADF, 0xBEB9,
    0x7AE0, 0xD5C2,
    0x7AE3, 0xBFA2,
    0x7AE5, 0xCDAF,
    0x7AE6, 0xF1B5,
    0x7AED, 0xBDDF,
    0x7AEF, 0xB6CB,
    0x7AF9, 0xD6F1,
    0x7AFA, 0xF3C3,
    0x7AFD, 0xF3C4,
    0x7AFF, 0xB8CD,
    0x7B03, 0xF3C6,
    0x7B04, 0xF3C7,
    0x7B06, 0xB0CA,
    0x7B08, 0xF3C5,
    0x7B0A, 0xF3C9,
    0x7B0B, 0xCBF1,
    0x7B0F, 0xF3CB,
    0x7B11, 0xD0A6,
    0x7B14, 0xB1CA,
    0x7B15, 0xF3C8,
    0x7B19, 0xF3CF,
    0x7B1B, 0xB5D1,
    0x7B1E, 0xF3D7,
    0x7B20, 0xF3D2,
    0x7B24, 0xF3D4,
    0x7B25, 0xF3D3,
    0x7B26, 0xB7FB,
    0x7B28, 0xB1BF,
    0x7B2A, 0xF3CE,
    0x7B2B, 0xF3CA,
    0x7B2C, 0xB5DA,
    0x7B2E, 0xF3D0,
    0x7B31, 0xF3D1,
    0x7B33, 0xF3D5,
    0x7B38, 0xF3CD,
    0x7B3A, 0xBCE3,
    0x7B3C, 0xC1FD,
    0x7B3E, 0xF3D6,
    0x7B45, 0xF3DA,
    0x7B47, 0xF3CC,
    0x7B49, 0xB5C8,
    0x7B4B, 0xBDEE,
    0x7B4C, 0xF3DC,
    0x7B4F, 0xB7A4,
    0x7B50, 0xBFF0,
    0x7B51, 0xD6FE,
    0x7B52, 0xCDB2,
    0x7B54, 0xB4F0,
    0x7B56, 0xB2DF,
    0x7B58, 0xF3D8,
    0x7B5A, 0xF3D9,
    0x7B5B, 0xC9B8,
    0x7B5D, 0xF3DD,
    0x7B60, 0xF3DE,
    0x7B62, 0xF3E1,
    0x7B6E, 0xF3DF,
    0x7B71, 0xF3E3,
    0x7B72, 0xF3E2,
    0x7B75, 0xF3DB,
    0x7B77, 0xBFEA,
    0x7B79, 0xB3EF,
    0x7B7B, 0xF3E0,
    0x7B7E, 0xC7A9,
    0x7B80, 0xBCF2,
    0x7B85, 0xF3EB,
    0x7B8D, 0xB9BF,
    0x7B90, 0xF3E4,
    0x7B94, 0xB2AD,
    0x7B95, 0xBBFE,
    0x7B97, 0xCBE3,
    0x7B9C, 0xF3ED,
    0x7B9D, 0xF3E9,
    0x7BA1, 0xB9DC,
    0x7BA2, 0xF3EE,
    0x7BA6, 0xF3E5,
    0x7BA7, 0xF3E6,
    0x7BA8, 0xF3EA,
    0x7BA9, 0xC2E1,
    0x7BAA, 0xF3EC,
    0x7BAB, 0xF3EF,
    0x7BAC, 0xF3E8,
    0x7BAD, 0xBCFD,
    0x7BB1, 0xCFE4,
    0x7BB4, 0xF3F0,
    0x7BB8, 0xF3E7,
    0x7BC1, 0xF3F2,
    0x7BC6, 0xD7AD,
    0x7BC7, 0xC6AA,
    0x7BCC, 0xF3F3,
    0x7BD1, 0xF3F1,
    0x7BD3, 0xC2A8,
    0x7BD9, 0xB8DD,
    0x7BDA, 0xF3F5,
    0x7BDD, 0xF3F4,
    0x7BE1, 0xB4DB,
    0x7BE5, 0xF3F6,
    0x7BE6, 0xF3F7,
    0x7BEA, 0xF3F8,
    0x7BEE, 0xC0BA,
    0x7BF1, 0xC0E9,
    0x7BF7, 0xC5F1,
    0x7BFC, 0xF3FB,
    0x7BFE, 0xF3FA,
    0x7C07, 0xB4D8,
    0x7C0B, 0xF3FE,
    0x7C0C, 0xF3F9,
    0x7C0F, 0xF3FC,
    0x7C16, 0xF3FD,
    0x7C1F, 0xF4A1,
    0x7C26, 0xF4A3,
    0x7C27, 0xBBC9,
    0x7C2A, 0xF4A2,
    0x7C38, 0xF4A4,
    0x7C3F, 0xB2BE,
    0x7C40, 0xF4A6,
    0x7C41, 0xF4A5,
    0x7C4D, 0xBCAE,
    0x7C73, 0xC3D7,
    0x7C74, 0xD9E1,
    0x7C7B, 0xC0E0,
    0x7C7C, 0xF4CC,
    0x7C7D, 0xD7D1,
    0x7C89, 0xB7DB,
    0x7C91, 0xF4CE,
    0x7C92, 0xC1A3,
    0x7C95, 0xC6C9,
    0x7C97, 0xB4D6,
    0x7C98, 0xD5B3,
    0x7C9C, 0xF4D0,
    0x7C9D, 0xF4CF,
    0x7C9E, 0xF4D1,
    0x7C9F, 0xCBDA,
    0x7CA2, 0xF4D2,
    0x7CA4, 0xD4C1,
    0x7CA5, 0xD6E0,
    0x7CAA, 0xB7E0,
    0x7CAE, 0xC1B8,
    0x7CB1, 0xC1BB,
    0x7CB2, 0xF4D3,
    0x7CB3, 0xBEAC,
    0x7CB9, 0xB4E2,
    0x7CBC, 0xF4D4,
    0x7CBD, 0xF4D5,
    0x7CBE, 0xBEAB,
    0x7CC1, 0xF4D6,
    0x7CC5, 0xF4DB,
    0x7CC7, 0xF4D7,
    0x7CC8, 0xF4DA,
    0x7CCA, 0xBAFD,
    0x7CCC, 0xF4D8,
    0x7CCD, 0xF4D9,
    0x7CD5, 0xB8E2,
    0x7CD6, 0xCCC7,
    0x7CD7, 0xF4DC,
    0x7CD9, 0xB2DA,
    0x7CDC, 0xC3D3,
    0x7CDF, 0xD4E3,
    0x7CE0, 0xBFB7,
    0x7CE8, 0xF4DD,
    0x7CEF, 0xC5B4,
    0x7CF8, 0xF4E9,
    0x7CFB, 0xCFB5,
    0x7D0A, 0xCEC9,
    0x7D20, 0xCBD8,
    0x7D22, 0xCBF7,
    0x7D27, 0xBDF4,
    0x7D2B, 0xD7CF,
    0x7D2F, 0xC0DB,
    0x7D6E, 0xD0F5,
    0x7D77, 0xF4EA,
    0x7DA6, 0xF4EB,
    0x7DAE, 0xF4EC,
    0x7E3B, 0xF7E3,
    0x7E41, 0xB7B1,
    0x7E47, 0xF4ED,
    0x7E82, 0xD7EB,
    0x7E9B, 0xF4EE,
    0x7E9F, 0xE6F9,
    0x7EA0, 0xBEC0,
    0x7EA1, 0xE6FA,
    0x7EA2, 0xBAEC,
    0x7EA3, 0xE6FB,
    0x7EA4, 0xCFCB,
    0x7EA5, 0xE6FC,
    0x7EA6, 0xD4BC,
    0x7EA7, 0xBCB6,
    0x7EA8, 0xE6FD,
    0x7EA9, 0xE6FE,
    0x7EAA, 0xBCCD,
    0x7EAB, 0xC8D2,
    0x7EAC, 0xCEB3,
    0x7EAD, 0xE7A1,
    0x7EAF, 0xB4BF,
    0x7EB0, 0xE7A2,
    0x7EB1, 0xC9B4,
    0x7EB2, 0xB8D9,
    0x7EB3, 0xC4C9,
    0x7EB5, 0xD7DD,
    0x7EB6, 0xC2DA,
    0x7EB7, 0xB7D7,
    0x7EB8, 0xD6BD,
    0x7EB9, 0xCEC6,
    0x7EBA, 0xB7C4,
    0x7EBD, 0xC5A6,
    0x7EBE, 0xE7A3,
    0x7EBF, 0xCFDF,
    0x7EC0, 0xE7A4,
    0x7EC1, 0xE7A5,
    0x7EC2, 0xE7A6,
    0x7EC3, 0xC1B7,
    0x7EC4, 0xD7E9,
    0x7EC5, 0xC9F0,
    0x7EC6, 0xCFB8,
    0x7EC7, 0xD6AF,
    0x7EC8, 0xD6D5,
    0x7EC9, 0xE7A7,
    0x7ECA, 0xB0ED,
    0x7ECB, 0xE7A8,
    0x7ECC, 0xE7A9,
    0x7ECD, 0xC9DC,
    0x7ECE, 0xD2EF,
    0x7ECF, 0xBEAD,
    0x7ED0, 0xE7AA,
    0x7ED1, 0xB0F3,
    0x7ED2, 0xC8DE,
    0x7ED3, 0xBDE1,
    0x7ED4, 0xE7AB,
    0x7ED5, 0xC8C6,
    0x7ED7, 0xE7AC,
    0x7ED8, 0xBBE6,
    0x7ED9, 0xB8F8,
    0x7EDA, 0xD1A4,
    0x7EDB, 0xE7AD,
    0x7EDC, 0xC2E7,
    0x7EDD, 0xBEF8,
    0x7EDE, 0xBDCA,
    0x7EDF, 0xCDB3,
    0x7EE0, 0xE7AE,
    0x7EE1, 0xE7AF,
    0x7EE2, 0xBEEE,
    0x7EE3, 0xD0E5,
    0x7EE5, 0xCBE7,
    0x7EE6, 0xCCD0,
    0x7EE7, 0xBCCC,
    0x7EE8, 0xE7B0,
    0x7EE9, 0xBCA8,
    0x7EEA, 0xD0F7,
    0x7EEB, 0xE7B1,
    0x7EED, 0xD0F8,
    0x7EEE, 0xE7B2,
    0x7EEF, 0xE7B3,
    0x7EF0, 0xB4C2,
    0x7EF1, 0xE7B4,
    0x7EF2, 0xE7B5,
    0x7EF3, 0xC9FE,
    0x7EF4, 0xCEAC,
    0x7EF5, 0xC3E0,
    0x7EF6, 0xE7B7,
    0x7EF7, 0xB1C1,
    0x7EF8, 0xB3F1,
    0x7EFA, 0xE7B8,
    0x7EFB, 0xE7B9,
    0x7EFC, 0xD7DB,
    0x7EFD, 0xD5C0,
    0x7EFE, 0xE7BA,
    0x7EFF, 0xC2CC,
    0x7F00, 0xD7BA,
    0x7F01, 0xE7BB,
    0x7F02, 0xE7BC,
    0x7F03, 0xE7BD,
    0x7F04, 0xBCEA,
    0x7F05, 0xC3E5,
    0x7F06, 0xC0C2,
    0x7F07, 0xE7BE,
    0x7F08, 0xE7BF,
    0x7F09, 0xBCA9,
    0x7F0B, 0xE7C0,
    0x7F0C, 0xE7C1,
    0x7F0D, 0xE7B6,
    0x7F0E, 0xB6D0,
    0x7F0F, 0xE7C2,
    0x7F11, 0xE7C3,
    0x7F12, 0xE7C4,
    0x7F13, 0xBBBA,
    0x7F14, 0xB5DE,
    0x7F15, 0xC2C6,
    0x7F16, 0xB1E0,
    0x7F17, 0xE7C5,
    0x7F18, 0xD4B5,
    0x7F19, 0xE7C6,
    0x7F1A, 0xB8BF,
    0x7F1B, 0xE7C8,
    0x7F1C, 0xE7C7,
    0x7F1D, 0xB7EC,
    0x7F1F, 0xE7C9,
    0x7F20, 0xB2F8,
    0x7F21, 0xE7CA,
    0x7F22, 0xE7CB,
    0x7F23, 0xE7CC,
    0x7F24, 0xE7CD,
    0x7F25, 0xE7CE,
    0x7F26, 0xE7CF,
    0x7F27, 0xE7D0,
    0x7F28, 0xD3A7,
    0x7F29, 0xCBF5,
    0x7F2A, 0xE7D1,
    0x7F2B, 0xE7D2,
    0x7F2C, 0xE7D3,
    0x7F2D, 0xE7D4,
    0x7F2E, 0xC9C9,
    0x7F2F, 0xE7D5,
    0x7F30, 0xE7D6,
    0x7F31, 0xE7D7,
    0x7F32, 0xE7D8,
    0x7F33, 0xE7D9,
    0x7F34, 0xBDC9,
    0x7F35, 0xE7DA,
    0x7F36, 0xF3BE,
    0x7F38, 0xB8D7,
    0x7F3A, 0xC8B1,
    0x7F42, 0xF3BF,
    0x7F44, 0xF3C0,
    0x7F45, 0xF3C1,
    0x7F50, 0xB9DE,
    0x7F51, 0xCDF8,
    0x7F54, 0xD8E8,
    0x7F55, 0xBAB1,
    0x7F57, 0xC2DE,
    0x7F58, 0xEEB7,
    0x7F5A, 0xB7A3,
    0x7F5F, 0xEEB9,
    0x7F61, 0xEEB8,
    0x7F62, 0xB0D5,
    0x7F68, 0xEEBB,
    0x7F69, 0xD5D6,
    0x7F6A, 0xD7EF,
    0x7F6E, 0xD6C3,
    0x7F71, 0xEEBD,
    0x7F72, 0xCAF0,
    0x7F74, 0xEEBC,
    0x7F79, 0xEEBE,
    0x7F7E, 0xEEC0,
    0x7F81, 0xEEBF,
    0x7F8A, 0xD1F2,
    0x7F8C, 0xC7BC,
    0x7F8E, 0xC3C0,
    0x7F94, 0xB8E1,
    0x7F9A, 0xC1E7,
    0x7F9D, 0xF4C6,
    0x7F9E, 0xD0DF,
    0x7F9F, 0xF4C7,
    0x7FA1, 0xCFDB,
    0x7FA4, 0xC8BA,
    0x7FA7, 0xF4C8,
    0x7FAF, 0xF4C9,
    0x7FB0, 0xF4CA,
    0x7FB2, 0xF4CB,
    0x7FB8, 0xD9FA,
    0x7FB9, 0xB8FE,
    0x7FBC, 0xE5F1,
    0x7FBD, 0xD3F0,
    0x7FBF, 0xF4E0,
    0x7FC1, 0xCECC,
    0x7FC5, 0xB3E1,
    0x7FCA, 0xF1B4,
    0x7FCC, 0xD2EE,
    0x7FCE, 0xF4E1,
    0x7FD4, 0xCFE8,
    0x7FD5, 0xF4E2,
    0x7FD8, 0xC7CC,
    0x7FDF, 0xB5D4,
    0x7FE0, 0xB4E4,
    0x7FE1, 0xF4E4,
    0x7FE5, 0xF4E3,
    0x7FE6, 0xF4E5,
    0x7FE9, 0xF4E6,
    0x7FEE, 0xF4E7,
    0x7FF0, 0xBAB2,
    0x7FF1, 0xB0BF,
    0x7FF3, 0xF4E8,
    0x7FFB, 0xB7AD,
    0x7FFC, 0xD2ED,
    0x8000, 0xD2AB,
    0x8001, 0xC0CF,
    0x8003, 0xBFBC,
    0x8004, 0xEBA3,
    0x8005, 0xD5DF,
    0x8006, 0xEAC8,
    0x800B, 0xF1F3,
    0x800C, 0xB6F8,
    0x800D, 0xCBA3,
    0x8010, 0xC4CD,
    0x8012, 0xF1E7,
    0x8014, 0xF1E8,
    0x8015, 0xB8FB,
    0x8016, 0xF1E9,
    0x8017, 0xBAC4,
    0x8018, 0xD4C5,
    0x8019, 0xB0D2,
    0x801C, 0xF1EA,
    0x8020, 0xF1EB,
    0x8022, 0xF1EC,
    0x8025, 0xF1ED,
    0x8026, 0xF1EE,
    0x8027, 0xF1EF,
    0x8028, 0xF1F1,
    0x8029, 0xF1F0,
    0x802A, 0xC5D5,
    0x8031, 0xF1F2,
    0x8033, 0xB6FA,
    0x8035, 0xF1F4,
    0x8036, 0xD2AE,
    0x8037, 0xDEC7,
    0x8038, 0xCBCA,
    0x803B, 0xB3DC,
    0x803D, 0xB5A2,
    0x803F, 0xB9A2,
    0x8042, 0xC4F4,
    0x8043, 0xF1F5,
    0x8046, 0xF1F6,
    0x804A, 0xC1C4,
    0x804B, 0xC1FB,
    0x804C, 0xD6B0,
    0x804D, 0xF1F7,
    0x8052, 0xF1F8,
    0x8054, 0xC1AA,
    0x8058, 0xC6B8,
    0x805A, 0xBEDB,
    0x8069, 0xF1F9,
    0x806A, 0xB4CF,
    0x8071, 0xF1FA,
    0x807F, 0xEDB2,
    0x8080, 0xEDB1,
    0x8083, 0xCBE0,
    0x8084, 0xD2DE,
    0x8086, 0xCBC1,
    0x8087, 0xD5D8,
    0x8089, 0xC8E2,
    0x808B, 0xC0DF,
    0x808C, 0xBCA1,
    0x8093, 0xEBC1,
    0x8096, 0xD0A4,
    0x8098, 0xD6E2,
    0x809A, 0xB6C7,
    0x809B, 0xB8D8,
    0x809C, 0xEBC0,
    0x809D, 0xB8CE,
    0x809F, 0xEBBF,
    0x80A0, 0xB3A6,
    0x80A1, 0xB9C9,
    0x80A2, 0xD6AB,
    0x80A4, 0xB7F4,
    0x80A5, 0xB7CA,
    0x80A9, 0xBCE7,
    0x80AA, 0xB7BE,
    0x80AB, 0xEBC6,
    0x80AD, 0xEBC7,
    0x80AE, 0xB0B9,
    0x80AF, 0xBFCF,
    0x80B1, 0xEBC5,
    0x80B2, 0xD3FD,
    0x80B4, 0xEBC8,
    0x80B7, 0xEBC9,
    0x80BA, 0xB7CE,
    0x80BC, 0xEBC2,
    0x80BD, 0xEBC4,
    0x80BE, 0xC9F6,
    0x80BF, 0xD6D7,
    0x80C0, 0xD5CD,
    0x80C1, 0xD0B2,
    0x80C2, 0xEBCF,
    0x80C3, 0xCEB8,
    0x80C4, 0xEBD0,
    0x80C6, 0xB5A8,
    0x80CC, 0xB1B3,
    0x80CD, 0xEBD2,
    0x80CE, 0xCCA5,
    0x80D6, 0xC5D6,
    0x80D7, 0xEBD3,
    0x80D9, 0xEBD1,
    0x80DA, 0xC5DF,
    0x80DB, 0xEBCE,
    0x80DC, 0xCAA4,
    0x80DD, 0xEBD5,
    0x80DE, 0xB0FB,
    0x80E1, 0xBAFA,
    0x80E4, 0xD8B7,
    0x80E5, 0xF1E3,
    0x80E7, 0xEBCA,
    0x80E8, 0xEBCB,
    0x80E9, 0xEBCC,
    0x80EA, 0xEBCD,
    0x80EB, 0xEBD6,
    0x80EC, 0xE6C0,
    0x80ED, 0xEBD9,
    0x80EF, 0xBFE8,
    0x80F0, 0xD2C8,
    0x80F1, 0xEBD7,
    0x80F2, 0xEBDC,
    0x80F3, 0xB8EC,
    0x80F4, 0xEBD8,
    0x80F6, 0xBDBA,
    0x80F8, 0xD0D8,
    0x80FA, 0xB0B7,
    0x80FC, 0xEBDD,
    0x80FD, 0xC4DC,
    0x8102, 0xD6AC,
    0x8106, 0xB4E0,
    0x8109, 0xC2F6,
    0x810A, 0xBCB9,
    0x810D, 0xEBDA,
    0x810E, 0xEBDB,
    0x810F, 0xD4E0,
    0x8110, 0xC6EA,
    0x8111, 0xC4D4,
    0x8112, 0xEBDF,
    0x8113, 0xC5A7,
    0x8114, 0xD9F5,
    0x8116, 0xB2B1,
    0x8118, 0xEBE4,
    0x811A, 0xBDC5,
    0x811E, 0xEBE2,
    0x812C, 0xEBE3,
    0x812F, 0xB8AC,
    0x8131, 0xCDD1,
    0x8132, 0xEBE5,
    0x8136, 0xEBE1,
    0x8138, 0xC1B3,
    0x813E, 0xC6A2,
    0x8146, 0xCCF3,
    0x8148, 0xEBE6,
    0x814A, 0xC0B0,
    0x814B, 0xD2B8,
    0x814C, 0xEBE7,
    0x8150, 0xB8AF,
    0x8151, 0xB8AD,
    0x8153, 0xEBE8,
    0x8154, 0xC7BB,
    0x8155, 0xCDF3,
    0x8159, 0xEBEA,
    0x815A, 0xEBEB,
    0x8160, 0xEBED,
    0x8165, 0xD0C8,
    0x8167, 0xEBF2,
    0x8169, 0xEBEE,
    0x816D, 0xEBF1,
    0x816E, 0xC8F9,
    0x8170, 0xD1FC,
    0x8171, 0xEBEC,
    0x8174, 0xEBE9,
    0x8179, 0xB8B9,
    0x817A, 0xCFD9,
    0x817B, 0xC4E5,
    0x817C, 0xEBEF,
    0x817D, 0xEBF0,
    0x817E, 0xCCDA,
    0x817F, 0xCDC8,
    0x8180, 0xB0F2,
    0x8182, 0xEBF6,
    0x8188, 0xEBF5,
    0x818A, 0xB2B2,
    0x818F, 0xB8E0,
    0x8191, 0xEBF7,
    0x8198, 0xB1EC,
    0x819B, 0xCCC5,
    0x819C, 0xC4A4,
    0x819D, 0xCFA5,
    0x81A3, 0xEBF9,
    0x81A6, 0xECA2,
    0x81A8, 0xC5F2,
    0x81AA, 0xEBFA,
    0x81B3, 0xC9C5,
    0x81BA, 0xE2DF,
    0x81BB, 0xEBFE,
    0x81C0, 0xCDCE,
    0x81C1, 0xECA1,
    0x81C2, 0xB1DB,
    0x81C3, 0xD3B7,
    0x81C6, 0xD2DC,
    0x81CA, 0xEBFD,
    0x81CC, 0xEBFB,
    0x81E3, 0xB3BC,
    0x81E7, 0xEAB0,
    0x81EA, 0xD7D4,
    0x81EC, 0xF4AB,
    0x81ED, 0xB3F4,
    0x81F3, 0xD6C1,
    0x81F4, 0xD6C2,
    0x81FB, 0xD5E9,
    0x81FC, 0xBECA,
    0x81FE, 0xF4A7,
    0x8200, 0xD2A8,
    0x8201, 0xF4A8,
    0x8202, 0xF4A9,
    0x8204, 0xF4AA,
    0x8205, 0xBECB,
    0x8206, 0xD3DF,
    0x820C, 0xC9E0,
    0x820D, 0xC9E1,
    0x8210, 0xF3C2,
    0x8212, 0xCAE6,
    0x8214, 0xCCF2,
    0x821B, 0xE2B6,
    0x821C, 0xCBB4,
    0x821E, 0xCEE8,
    0x821F, 0xD6DB,
    0x8221, 0xF4AD,
    0x8222, 0xF4AE,
    0x8223, 0xF4AF,
    0x8228, 0xF4B2,
    0x822A, 0xBABD,
    0x822B, 0xF4B3,
    0x822C, 0xB0E3,
    0x822D, 0xF4B0,
    0x822F, 0xF4B1,
    0x8230, 0xBDA2,
    0x8231, 0xB2D5,
    0x8233, 0xF4B6,
    0x8234, 0xF4B7,
    0x8235, 0xB6E6,
    0x8236, 0xB2B0,
    0x8237, 0xCFCF,
    0x8238, 0xF4B4,
    0x8239, 0xB4AC,
    0x823B, 0xF4B5,
    0x823E, 0xF4B8,
    0x8244, 0xF4B9,
    0x8247, 0xCDA7,
    0x8249, 0xF4BA,
    0x824B, 0xF4BB,
    0x824F, 0xF4BC,
    0x8258, 0xCBD2,
    0x825A, 0xF4BD,
    0x825F, 0xF4BE,
    0x8268, 0xF4BF,
    0x826E, 0xF4DE,
    0x826F, 0xC1BC,
    0x8270, 0xBCE8,
    0x8272, 0xC9AB,
    0x8273, 0xD1DE,
    0x8274, 0xE5F5,
    0x8279, 0xDCB3,
    0x827A, 0xD2D5,
    0x827D, 0xDCB4,
    0x827E, 0xB0AC,
    0x827F, 0xDCB5,
    0x8282, 0xBDDA,
    0x8284, 0xDCB9,
    0x8288, 0xD8C2,
    0x828A, 0xDCB7,
    0x828B, 0xD3F3,
    0x828D, 0xC9D6,
    0x828E, 0xDCBA,
    0x828F, 0xDCB6,
    0x8291, 0xDCBB,
    0x8292, 0xC3A2,
    0x8297, 0xDCBC,
    0x8298, 0xDCC5,
    0x8299, 0xDCBD,
    0x829C, 0xCEDF,
    0x829D, 0xD6A5,
    0x829F, 0xDCCF,
    0x82A1, 0xDCCD,
    0x82A4, 0xDCD2,
    0x82A5, 0xBDE6,
    0x82A6, 0xC2AB,
    0x82A8, 0xDCB8,
    0x82A9, 0xDCCB,
    0x82AA, 0xDCCE,
    0x82AB, 0xDCBE,
    0x82AC, 0xB7D2,
    0x82AD, 0xB0C5,
    0x82AE, 0xDCC7,
    0x82AF, 0xD0BE,
    0x82B0, 0xDCC1,
    0x82B1, 0xBBA8,
    0x82B3, 0xB7BC,
    0x82B4, 0xDCCC,
    0x82B7, 0xDCC6,
    0x82B8, 0xDCBF,
    0x82B9, 0xC7DB,
    0x82BD, 0xD1BF,
    0x82BE, 0xDCC0,
    0x82C1, 0xDCCA,
    0x82C4, 0xDCD0,
    0x82C7, 0xCEAD,
    0x82C8, 0xDCC2,
    0x82CA, 0xDCC3,
    0x82CB, 0xDCC8,
    0x82CC, 0xDCC9,
    0x82CD, 0xB2D4,
    0x82CE, 0xDCD1,
    0x82CF, 0xCBD5,
    0x82D1, 0xD4B7,
    0x82D2, 0xDCDB,
    0x82D3, 0xDCDF,
    0x82D4, 0xCCA6,
    0x82D5, 0xDCE6,
    0x82D7, 0xC3E7,
    0x82D8, 0xDCDC,
    0x82DB, 0xBFC1,
    0x82DC, 0xDCD9,
    0x82DE, 0xB0FA,
    0x82DF, 0xB9B6,
    0x82E0, 0xDCE5,
    0x82E1, 0xDCD3,
    0x82E3, 0xDCC4,
    0x82E4, 0xDCD6,
    0x82E5, 0xC8F4,
    0x82E6, 0xBFE0,
    0x82EB, 0xC9BB,
    0x82EF, 0xB1BD,
    0x82F1, 0xD3A2,
    0x82F4, 0xDCDA,
    0x82F7, 0xDCD5,
    0x82F9, 0xC6BB,
    0x82FB, 0xDCDE,
    0x8301, 0xD7C2,
    0x8302, 0xC3AF,
    0x8303, 0xB7B6,
    0x8304, 0xC7D1,
    0x8305, 0xC3A9,
    0x8306, 0xDCE2,
    0x8307, 0xDCD8,
    0x8308, 0xDCEB,
    0x8309, 0xDCD4,
    0x830C, 0xDCDD,
    0x830E, 0xBEA5,
    0x830F, 0xDCD7,
    0x8311, 0xDCE0,
    0x8314, 0xDCE3,
    0x8315, 0xDCE4,
    0x8317, 0xDCF8,
    0x831A, 0xDCE1,
    0x831B, 0xDDA2,
    0x831C, 0xDCE7,
    0x8327, 0xBCEB,
    0x8328, 0xB4C4,
    0x832B, 0xC3A3,
    0x832C, 0xB2E7,
    0x832D, 0xDCFA,
    0x832F, 0xDCF2,
    0x8331, 0xDCEF,
    0x8333, 0xDCFC,
    0x8334, 0xDCEE,
    0x8335, 0xD2F0,
    0x8336, 0xB2E8,
    0x8338, 0xC8D7,
    0x8339, 0xC8E3,
    0x833A, 0xDCFB,
    0x833C, 0xDCED,
    0x8340, 0xDCF7,
    0x8343, 0xDCF5,
    0x8346, 0xBEA3,
    0x8347, 0xDCF4,
    0x8349, 0xB2DD,
    0x834F, 0xDCF3,
    0x8350, 0xBCF6,
    0x8351, 0xDCE8,
    0x8352, 0xBBC4,
    0x8354, 0xC0F3,
    0x835A, 0xBCD4,
    0x835B, 0xDCE9,
    0x835C, 0xDCEA,
    0x835E, 0xDCF1,
    0x835F, 0xDCF6,
    0x8360, 0xDCF9,
    0x8361, 0xB5B4,
    0x8363, 0xC8D9,
    0x8364, 0xBBE7,
    0x8365, 0xDCFE,
    0x8366, 0xDCFD,
    0x8367, 0xD3AB,
    0x8368, 0xDDA1,
    0x8369, 0xDDA3,
    0x836A, 0xDDA5,
    0x836B, 0xD2F1,
    0x836C, 0xDDA4,
    0x836D, 0xDDA6,
    0x836E, 0xDDA7,
    0x836F, 0xD2A9,
    0x8377, 0xBAC9,
    0x8378, 0xDDA9,
    0x837B, 0xDDB6,
    0x837C, 0xDDB1,
    0x837D, 0xDDB4,
    0x8385, 0xDDB0,
    0x8386, 0xC6CE,
    0x8389, 0xC0F2,
    0x838E, 0xC9AF,
    0x8392, 0xDCEC,
    0x8393, 0xDDAE,
    0x8398, 0xDDB7,
    0x839B, 0xDCF0,
    0x839C, 0xDDAF,
    0x839E, 0xDDB8,
    0x83A0, 0xDDAC,
    0x83A8, 0xDDB9,
    0x83A9, 0xDDB3,
    0x83AA, 0xDDAD,
    0x83AB, 0xC4AA,
    0x83B0, 0xDDA8,
    0x83B1, 0xC0B3,
    0x83B2, 0xC1AB,
    0x83B3, 0xDDAA,
    0x83B4, 0xDDAB,
    0x83B6, 0xDDB2,
    0x83B7, 0xBBF1,
    0x83B8, 0xDDB5,
    0x83B9, 0xD3A8,
    0x83BA, 0xDDBA,
    0x83BC, 0xDDBB,
    0x83BD, 0xC3A7,
    0x83C0, 0xDDD2,
    0x83C1, 0xDDBC,
    0x83C5, 0xDDD1,
    0x83C7, 0xB9BD,
    0x83CA, 0xBED5,
    0x83CC, 0xBEFA,
    0x83CF, 0xBACA,
    0x83D4, 0xDDCA,
    0x83D6, 0xDDC5,
    0x83D8, 0xDDBF,
    0x83DC, 0xB2CB,
    0x83DD, 0xDDC3,
    0x83DF, 0xDDCB,
    0x83E0, 0xB2A4,
    0x83E1, 0xDDD5,
    0x83E5, 0xDDBE,
    0x83E9, 0xC6D0,
    0x83EA, 0xDDD0,
    0x83F0, 0xDDD4,
    0x83F1, 0xC1E2,
    0x83F2, 0xB7C6,
    0x83F8, 0xDDCE,
    0x83F9, 0xDDCF,
    0x83FD, 0xDDC4,
    0x8401, 0xDDBD,
    0x8403, 0xDDCD,
    0x8404, 0xCCD1,
    0x8406, 0xDDC9,
    0x840B, 0xDDC2,
    0x840C, 0xC3C8,
    0x840D, 0xC6BC,
    0x840E, 0xCEAE,
    0x840F, 0xDDCC,
    0x8411, 0xDDC8,
    0x8418, 0xDDC1,
    0x841C, 0xDDC6,
    0x841D, 0xC2DC,
    0x8424, 0xD3A9,
    0x8425, 0xD3AA,
    0x8426, 0xDDD3,
    0x8427, 0xCFF4,
    0x8428, 0xC8F8,
    0x8431, 0xDDE6,
    0x8438, 0xDDC7,
    0x843C, 0xDDE0,
    0x843D, 0xC2E4,
    0x8446, 0xDDE1,
    0x8451, 0xDDD7,
    0x8457, 0xD6F8,
    0x8459, 0xDDD9,
    0x845A, 0xDDD8,
    0x845B, 0xB8F0,
    0x845C, 0xDDD6,
    0x8461, 0xC6CF,
    0x8463, 0xB6AD,
    0x8469, 0xDDE2,
    0x846B, 0xBAF9,
    0x846C, 0xD4E1,
    0x846D, 0xDDE7,
    0x8471, 0xB4D0,
    0x8473, 0xDDDA,
    0x8475, 0xBFFB,
    0x8476, 0xDDE3,
    0x8478, 0xDDDF,
    0x847A, 0xDDDD,
    0x8482, 0xB5D9,
    0x8487, 0xDDDB,
    0x8488, 0xDDDC,
    0x8489, 0xDDDE,
    0x848B, 0xBDAF,
    0x848C, 0xDDE4,
    0x848E, 0xDDE5,
    0x8497, 0xDDF5,
    0x8499, 0xC3C9,
    0x849C, 0xCBE2,
    0x84A1, 0xDDF2,
    0x84AF, 0xD8E1,
    0x84B2, 0xC6D1,
    0x84B4, 0xDDF4,
    0x84B8, 0xD5F4,
    0x84B9, 0xDDF3,
    0x84BA, 0xDDF0,
    0x84BD, 0xDDEC,
    0x84BF, 0xDDEF,
    0x84C1, 0xDDE8,
    0x84C4, 0xD0EE,
    0x84C9, 0xC8D8,
    0x84CA, 0xDDEE,
    0x84CD, 0xDDE9,
    0x84D0, 0xDDEA,
    0x84D1, 0xCBF2,
    0x84D3, 0xDDED,
    0x84D6, 0xB1CD,
    0x84DD, 0xC0B6,
    0x84DF, 0xBCBB,
    0x84E0, 0xDDF1,
    0x84E3, 0xDDF7,
    0x84E5, 0xDDF6,
    0x84E6, 0xDDEB,
    0x84EC, 0xC5EE,
    0x84F0, 0xDDFB,
    0x84FC, 0xDEA4,
    0x84FF, 0xDEA3,
    0x850C, 0xDDF8,
    0x8511, 0xC3EF,
    0x8513, 0xC2FB,
    0x8517, 0xD5E1,
    0x851A, 0xCEB5,
    0x851F, 0xDDFD,
    0x8521, 0xB2CC,
    0x852B, 0xC4E8,
    0x852C, 0xCADF,
    0x8537, 0xC7BE,
    0x8538, 0xDDFA,
    0x8539, 0xDDFC,
    0x853A, 0xDDFE,
    0x853B, 0xDEA2,
    0x853C, 0xB0AA,
    0x853D, 0xB1CE,
    0x8543, 0xDEAC,
    0x8548, 0xDEA6,
    0x8549, 0xBDB6,
    0x854A, 0xC8EF,
    0x8556, 0xDEA1,
    0x8559, 0xDEA5,
    0x855E, 0xDEA9,
    0x8564, 0xDEA8,
    0x8568, 0xDEA7,
    0x8572, 0xDEAD,
    0x8574, 0xD4CC,
    0x8579, 0xDEB3,
    0x857A, 0xDEAA,
    0x857B, 0xDEAE,
    0x857E, 0xC0D9,
    0x8584, 0xB1A1,
    0x8585, 0xDEB6,
    0x8587, 0xDEB1,
    0x858F, 0xDEB2,
    0x859B, 0xD1A6,
    0x859C, 0xDEB5,
    0x85A4, 0xDEAF,
    0x85A8, 0xDEB0,
    0x85AA, 0xD0BD,
    0x85AE, 0xDEB4,
    0x85AF, 0xCAED,
    0x85B0, 0xDEB9,
    0x85B7, 0xDEB8,
    0x85B9, 0xDEB7,
    0x85C1, 0xDEBB,
    0x85C9, 0xBDE5,
    0x85CF, 0xB2D8,
    0x85D0, 0xC3EA,
    0x85D3, 0xDEBA,
    0x85D5, 0xC5BA,
    0x85DC, 0xDEBC,
    0x85E4, 0xCCD9,
    0x85E9, 0xB7AA,
    0x85FB, 0xD4E5,
    0x85FF, 0xDEBD,
    0x8605, 0xDEBF,
    0x8611, 0xC4A2,
    0x8616, 0xDEC1,
    0x8627, 0xDEBE,
    0x8629, 0xDEC0,
    0x8638, 0xD5BA,
    0x863C, 0xDEC2,
    0x864D, 0xF2AE,
    0x864E, 0xBBA2,
    0x864F, 0xC2B2,
    0x8650, 0xC5B0,
    0x8651, 0xC2C7,
    0x8654, 0xF2AF,
    0x865A, 0xD0E9,
    0x865E, 0xD3DD,
    0x8662, 0xEBBD,
    0x866B, 0xB3E6,
    0x866C, 0xF2B0,
    0x866E, 0xF2B1,
    0x8671, 0xCAAD,
    0x8679, 0xBAE7,
    0x867A, 0xF2B3,
    0x867B, 0xF2B5,
    0x867C, 0xF2B4,
    0x867D, 0xCBE4,
    0x867E, 0xCFBA,
    0x867F, 0xF2B2,
    0x8680, 0xCAB4,
    0x8681, 0xD2CF,
    0x8682, 0xC2EC,
    0x868A, 0xCEC3,
    0x868B, 0xF2B8,
    0x868C, 0xB0F6,
    0x868D, 0xF2B7,
    0x8693, 0xF2BE,
    0x8695, 0xB2CF,
    0x869C, 0xD1C1,
    0x869D, 0xF2BA,
    0x86A3, 0xF2BC,
    0x86A4, 0xD4E9,
    0x86A7, 0xF2BB,
    0x86A8, 0xF2B6,
    0x86A9, 0xF2BF,
    0x86AA, 0xF2BD,
    0x86AC, 0xF2B9,
    0x86AF, 0xF2C7,
    0x86B0, 0xF2C4,
    0x86B1, 0xF2C6,
    0x86B4, 0xF2CA,
    0x86B5, 0xF2C2,
    0x86B6, 0xF2C0,
    0x86BA, 0xF2C5,
    0x86C0, 0xD6FB,
    0x86C4, 0xF2C1,
    0x86C6, 0xC7F9,
    0x86C7, 0xC9DF,
    0x86C9, 0xF2C8,
    0x86CA, 0xB9C6,
    0x86CB, 0xB5B0,
    0x86CE, 0xF2C3,
    0x86CF, 0xF2C9,
    0x86D0, 0xF2D0,
    0x86D1, 0xF2D6,
    0x86D4, 0xBBD7,
    0x86D8, 0xF2D5,
    0x86D9, 0xCDDC,
    0x86DB, 0xD6EB,
    0x86DE, 0xF2D2,
    0x86DF, 0xF2D4,
    0x86E4, 0xB8F2,
    0x86E9, 0xF2CB,
    0x86ED, 0xF2CE,
    0x86EE, 0xC2F9,
    0x86F0, 0xD5DD,
    0x86F1, 0xF2CC,
    0x86F2, 0xF2CD,
    0x86F3, 0xF2CF,
    0x86F4, 0xF2D3,
    0x86F8, 0xF2D9,
    0x86F9, 0xD3BC,
    0x86FE, 0xB6EA,
    0x8700, 0xCAF1,
    0x8702, 0xB7E4,
    0x8703, 0xF2D7,
    0x8707, 0xF2D8,
    0x8708, 0xF2DA,
    0x8709, 0xF2DD,
    0x870A, 0xF2DB,
    0x870D, 0xF2DC,
    0x8712, 0xD1D1,
    0x8713, 0xF2D1,
    0x8715, 0xCDC9,
    0x8717, 0xCECF,
    0x8718, 0xD6A9,
    0x871A, 0xF2E3,
    0x871C, 0xC3DB,
    0x871E, 0xF2E0,
    0x8721, 0xC0AF,
    0x8722, 0xF2EC,
    0x8723, 0xF2DE,
    0x8725, 0xF2E1,
    0x8729, 0xF2E8,
    0x872E, 0xF2E2,
    0x8731, 0xF2E7,
    0x8734, 0xF2E6,
    0x8737, 0xF2E9,
    0x873B, 0xF2DF,
    0x873E, 0xF2E4,
    0x873F, 0xF2EA,
    0x8747, 0xD3AC,
    0x8748, 0xF2E5,
    0x8749, 0xB2F5,
    0x874C, 0xF2F2,
    0x874E, 0xD0AB,
    0x8753, 0xF2F5,
    0x8757, 0xBBC8,
    0x8759, 0xF2F9,
    0x8760, 0xF2F0,
    0x8763, 0xF2F6,
    0x8764, 0xF2F8,
    0x8765, 0xF2FA,
    0x876E, 0xF2F3,
    0x8770, 0xF2F1,
    0x8774, 0xBAFB,
    0x8776, 0xB5FB,
    0x877B, 0xF2EF,
    0x877C, 0xF2F7,
    0x877D, 0xF2ED,
    0x877E, 0xF2EE,
    0x8782, 0xF2EB,
    0x8783, 0xF3A6,
    0x8785, 0xF3A3,
    0x8788, 0xF3A2,
    0x878B, 0xF2F4,
    0x878D, 0xC8DA,
    0x8793, 0xF2FB,
    0x8797, 0xF3A5,
    0x879F, 0xC3F8,
    0x87A8, 0xF2FD,
    0x87AB, 0xF3A7,
    0x87AC, 0xF3A9,
    0x87AD, 0xF3A4,
    0x87AF, 0xF2FC,
    0x87B3, 0xF3AB,
    0x87B5, 0xF3AA,
    0x87BA, 0xC2DD,
    0x87BD, 0xF3AE,
    0x87C0, 0xF3B0,
    0x87C6, 0xF3A1,
    0x87CA, 0xF3B1,
    0x87CB, 0xF3AC,
    0x87D1, 0xF3AF,
    0x87D2, 0xF2FE,
    0x87D3, 0xF3AD,
    0x87DB, 0xF3B2,
    0x87E0, 0xF3B4,
    0x87E5, 0xF3A8,
    0x87EA, 0xF3B3,
    0x87EE, 0xF3B5,
    0x87F9, 0xD0B7,
    0x87FE, 0xF3B8,
    0x8803, 0xD9F9,
    0x880A, 0xF3B9,
    0x8813, 0xF3B7,
    0x8815, 0xC8E4,
    0x8816, 0xF3B6,
    0x881B, 0xF3BA,
    0x8821, 0xF3BB,
    0x8822, 0xB4C0,
    0x8832, 0xEEC3,
    0x8839, 0xF3BC,
    0x883C, 0xF3BD,
    0x8840, 0xD1AA,
    0x8844, 0xF4AC,
    0x8845, 0xD0C6,
    0x884C, 0xD0D0,
    0x884D, 0xD1DC,
    0x8854, 0xCFCE,
    0x8857, 0xBDD6,
    0x8859, 0xD1C3,
    0x8861, 0xBAE2,
    0x8862, 0xE1E9,
    0x8863, 0xD2C2,
    0x8864, 0xF1C2,
    0x8865, 0xB2B9,
    0x8868, 0xB1ED,
    0x8869, 0xF1C3,
    0x886B, 0xC9C0,
    0x886C, 0xB3C4,
    0x886E, 0xD9F2,
    0x8870, 0xCBA5,
    0x8872, 0xF1C4,
    0x8877, 0xD6D4,
    0x887D, 0xF1C5,
    0x887E, 0xF4C0,
    0x887F, 0xF1C6,
    0x8881, 0xD4AC,
    0x8882, 0xF1C7,
    0x8884, 0xB0C0,
    0x8885, 0xF4C1,
    0x8888, 0xF4C2,
    0x888B, 0xB4FC,
    0x888D, 0xC5DB,
    0x8892, 0xCCBB,
    0x8896, 0xD0E4,
    0x889C, 0xCDE0,
    0x88A2, 0xF1C8,
    0x88A4, 0xD9F3,
    0x88AB, 0xB1BB,
    0x88AD, 0xCFAE,
    0x88B1, 0xB8A4,
    0x88B7, 0xF1CA,
    0x88BC, 0xF1CB,
    0x88C1, 0xB2C3,
    0x88C2, 0xC1D1,
    0x88C5, 0xD7B0,
    0x88C6, 0xF1C9,
    0x88C9, 0xF1CC,
    0x88CE, 0xF1CE,
    0x88D2, 0xD9F6,
    0x88D4, 0xD2E1,
    0x88D5, 0xD4A3,
    0x88D8, 0xF4C3,
    0x88D9, 0xC8B9,
    0x88DF, 0xF4C4,
    0x88E2, 0xF1CD,
    0x88E3, 0xF1CF,
    0x88E4, 0xBFE3,
    0x88E5, 0xF1D0,
    0x88E8, 0xF1D4,
    0x88F0, 0xF1D6,
    0x88F1, 0xF1D1,
    0x88F3, 0xC9D1,
    0x88F4, 0xC5E1,
    0x88F8, 0xC2E3,
    0x88F9, 0xB9FC,
    0x88FC, 0xF1D3,
    0x88FE, 0xF1D5,
    0x8902, 0xB9D3,
    0x890A, 0xF1DB,
    0x8910, 0xBAD6,
    0x8912, 0xB0FD,
    0x8913, 0xF1D9,
    0x8919, 0xF1D8,
    0x891A, 0xF1D2,
    0x891B, 0xF1DA,
    0x8921, 0xF1D7,
    0x8925, 0xC8EC,
    0x892A, 0xCDCA,
    0x892B, 0xF1DD,
    0x8930, 0xE5BD,
    0x8934, 0xF1DC,
    0x8936, 0xF1DE,
    0x8941, 0xF1DF,
    0x8944, 0xCFE5,
    0x895E, 0xF4C5,
    0x895F, 0xBDF3,
    0x8966, 0xF1E0,
    0x897B, 0xF1E1,
    0x897F, 0xCEF7,
    0x8981, 0xD2AA,
    0x8983, 0xF1FB,
    0x8986, 0xB8B2,
    0x89C1, 0xBCFB,
    0x89C2, 0xB9DB,
    0x89C4, 0xB9E6,
    0x89C5, 0xC3D9,
    0x89C6, 0xCAD3,
    0x89C7, 0xEAE8,
    0x89C8, 0xC0C0,
    0x89C9, 0xBEF5,
    0x89CA, 0xEAE9,
    0x89CB, 0xEAEA,
    0x89CC, 0xEAEB,
    0x89CE, 0xEAEC,
    0x89CF, 0xEAED,
    0x89D0, 0xEAEE,
    0x89D1, 0xEAEF,
    0x89D2, 0xBDC7,
    0x89D6, 0xF5FB,
    0x89DA, 0xF5FD,
    0x89DC, 0xF5FE,
    0x89DE, 0xF5FC,
    0x89E3, 0xBDE2,
    0x89E5, 0xF6A1,
    0x89E6, 0xB4A5,
    0x89EB, 0xF6A2,
    0x89EF, 0xF6A3,
    0x89F3, 0xECB2,
    0x8A00, 0xD1D4,
    0x8A07, 0xD9EA,
    0x8A3E, 0xF6A4,
    0x8A48, 0xEEBA,
    0x8A79, 0xD5B2,
    0x8A89, 0xD3FE,
    0x8A8A, 0xCCDC,
    0x8A93, 0xCAC4,
    0x8B07, 0xE5C0,
    0x8B26, 0xF6A5,
    0x8B66, 0xBEAF,
    0x8B6C, 0xC6A9,
    0x8BA0, 0xDAA5,
    0x8BA1, 0xBCC6,
    0x8BA2, 0xB6A9,
    0x8BA3, 0xB8BC,
    0x8BA4, 0xC8CF,
    0x8BA5, 0xBCA5,
    0x8BA6, 0xDAA6,
    0x8BA7, 0xDAA7,
    0x8BA8, 0xCCD6,
    0x8BA9, 0xC8C3,
    0x8BAA, 0xDAA8,
    0x8BAB, 0xC6FD,
    0x8BAD, 0xD1B5,
    0x8BAE, 0xD2E9,
    0x8BAF, 0xD1B6,
    0x8BB0, 0xBCC7,
    0x8BB2, 0xBDB2,
    0x8BB3, 0xBBE4,
    0x8BB4, 0xDAA9,
    0x8BB5, 0xDAAA,
    0x8BB6, 0xD1C8,
    0x8BB7, 0xDAAB,
    0x8BB8, 0xD0ED,
    0x8BB9, 0xB6EF,
    0x8BBA, 0xC2DB,
    0x8BBC, 0xCBCF,
    0x8BBD, 0xB7ED,
    0x8BBE, 0xC9E8,
    0x8BBF, 0xB7C3,
    0x8BC0, 0xBEF7,
    0x8BC1, 0xD6A4,
    0x8BC2, 0xDAAC,
    0x8BC3, 0xDAAD,
    0x8BC4, 0xC6C0,
    0x8BC5, 0xD7E7,
    0x8BC6, 0xCAB6,
    0x8BC8, 0xD5A9,
    0x8BC9, 0xCBDF,
    0x8BCA, 0xD5EF,
    0x8BCB, 0xDAAE,
    0x8BCC, 0xD6DF,
    0x8BCD, 0xB4CA,
    0x8BCE, 0xDAB0,
    0x8BCF, 0xDAAF,
    0x8BD1, 0xD2EB,
    0x8BD2, 0xDAB1,
    0x8BD3, 0xDAB2,
    0x8BD4, 0xDAB3,
    0x8BD5, 0xCAD4,
    0x8BD6, 0xDAB4,
    0x8BD7, 0xCAAB,
    0x8BD8, 0xDAB5,
    0x8BD9, 0xDAB6,
    0x8BDA, 0xB3CF,
    0x8BDB, 0xD6EF,
    0x8BDC, 0xDAB7,
    0x8BDD, 0xBBB0,
    0x8BDE, 0xB5AE,
    0x8BDF, 0xDAB8,
    0x8BE0, 0xDAB9,
    0x8BE1, 0xB9EE,
    0x8BE2, 0xD1AF,
    0x8BE3, 0xD2E8,
    0x8BE4, 0xDABA,
    0x8BE5, 0xB8C3,
    0x8BE6, 0xCFEA,
    0x8BE7, 0xB2EF,
    0x8BE8, 0xDABB,
    0x8BE9, 0xDABC,
    0x8BEB, 0xBDEB,
    0x8BEC, 0xCEDC,
    0x8BED, 0xD3EF,
    0x8BEE, 0xDABD,
    0x8BEF, 0xCEF3,
    0x8BF0, 0xDABE,
    0x8BF1, 0xD3D5,
    0x8BF2, 0xBBE5,
    0x8BF3, 0xDABF,
    0x8BF4, 0xCBB5,
    0x8BF5, 0xCBD0,
    0x8BF6, 0xDAC0,
    0x8BF7, 0xC7EB,
    0x8BF8, 0xD6EE,
    0x8BF9, 0xDAC1,
    0x8BFA, 0xC5B5,
    0x8BFB, 0xB6C1,
    0x8BFC, 0xDAC2,
    0x8BFD, 0xB7CC,
    0x8BFE, 0xBFCE,
    0x8BFF, 0xDAC3,
    0x8C00, 0xDAC4,
    0x8C01, 0xCBAD,
    0x8C02, 0xDAC5,
    0x8C03, 0xB5F7,
    0x8C04, 0xDAC6,
    0x8C05, 0xC1C2,
    0x8C06, 0xD7BB,
    0x8C07, 0xDAC7,
    0x8C08, 0xCCB8,
    0x8C0A, 0xD2EA,
    0x8C0B, 0xC4B1,
    0x8C0C, 0xDAC8,
    0x8C0D, 0xB5FD,
    0x8C0E, 0xBBD1,
    0x8C0F, 0xDAC9,
    0x8C10, 0xD0B3,
    0x8C11, 0xDACA,
    0x8C12, 0xDACB,
    0x8C13, 0xCEBD,
    0x8C14, 0xDACC,
    0x8C15, 0xDACD,
    0x8C16, 0xDACE,
    0x8C17, 0xB2F7,
    0x8C18, 0xDAD1,
    0x8C19, 0xDACF,
    0x8C1A, 0xD1E8,
    0x8C1B, 0xDAD0,
    0x8C1C, 0xC3D5,
    0x8C1D, 0xDAD2,
    0x8C1F, 0xDAD3,
    0x8C20, 0xDAD4,
    0x8C21, 0xDAD5,
    0x8C22, 0xD0BB,
    0x8C23, 0xD2A5,
    0x8C24, 0xB0F9,
    0x8C25, 0xDAD6,
    0x8C26, 0xC7AB,
    0x8C27, 0xDAD7,
    0x8C28, 0xBDF7,
    0x8C29, 0xC3A1,
    0x8C2A, 0xDAD8,
    0x8C2B, 0xDAD9,
    0x8C2C, 0xC3FD,
    0x8C2D, 0xCCB7,
    0x8C2E, 0xDADA,
    0x8C2F, 0xDADB,
    0x8C30, 0xC0BE,
    0x8C31, 0xC6D7,
    0x8C32, 0xDADC,
    0x8C33, 0xDADD,
    0x8C34, 0xC7B4,
    0x8C35, 0xDADE,
    0x8C36, 0xDADF,
    0x8C37, 0xB9C8,
    0x8C41, 0xBBED,
    0x8C46, 0xB6B9,
    0x8C47, 0xF4F8,
    0x8C49, 0xF4F9,
    0x8C4C, 0xCDE3,
    0x8C55, 0xF5B9,
    0x8C5A, 0xEBE0,
    0x8C61, 0xCFF3,
    0x8C62, 0xBBBF,
    0x8C6A, 0xBAC0,
    0x8C6B, 0xD4A5,
    0x8C73, 0xE1D9,
    0x8C78, 0xF5F4,
    0x8C79, 0xB1AA,
    0x8C7A, 0xB2F2,
    0x8C82, 0xF5F5,
    0x8C85, 0xF5F7,
    0x8C89, 0xBAD1,
    0x8C8A, 0xF5F6,
    0x8C8C, 0xC3B2,
    0x8C94, 0xF5F9,
    0x8C98, 0xF5F8,
    0x8D1D, 0xB1B4,
    0x8D1E, 0xD5EA,
    0x8D1F, 0xB8BA,
    0x8D21, 0xB9B1,
    0x8D22, 0xB2C6,
    0x8D23, 0xD4F0,
    0x8D24, 0xCFCD,
    0x8D25, 0xB0DC,
    0x8D26, 0xD5CB,
    0x8D27, 0xBBF5,
    0x8D28, 0xD6CA,
    0x8D29, 0xB7B7,
    0x8D2A, 0xCCB0,
    0x8D2B, 0xC6B6,
    0x8D2C, 0xB1E1,
    0x8D2D, 0xB9BA,
    0x8D2E, 0xD6FC,
    0x8D2F, 0xB9E1,
    0x8D30, 0xB7A1,
    0x8D31, 0xBCFA,
    0x8D32, 0xEADA,
    0x8D33, 0xEADB,
    0x8D34, 0xCCF9,
    0x8D35, 0xB9F3,
    0x8D36, 0xEADC,
    0x8D37, 0xB4FB,
    0x8D38, 0xC3B3,
    0x8D39, 0xB7D1,
    0x8D3A, 0xBAD8,
    0x8D3B, 0xEADD,
    0x8D3C, 0xD4F4,
    0x8D3D, 0xEADE,
    0x8D3E, 0xBCD6,
    0x8D3F, 0xBBDF,
    0x8D40, 0xEADF,
    0x8D41, 0xC1DE,
    0x8D42, 0xC2B8,
    0x8D43, 0xD4DF,
    0x8D44, 0xD7CA,
    0x8D45, 0xEAE0,
    0x8D46, 0xEAE1,
    0x8D47, 0xEAE4,
    0x8D48, 0xEAE2,
    0x8D49, 0xEAE3,
    0x8D4A, 0xC9DE,
    0x8D4B, 0xB8B3,
    0x8D4C, 0xB6C4,
    0x8D4D, 0xEAE5,
    0x8D4E, 0xCAEA,
    0x8D4F, 0xC9CD,
    0x8D50, 0xB4CD,
    0x8D53, 0xE2D9,
    0x8D54, 0xC5E2,
    0x8D55, 0xEAE6,
    0x8D56, 0xC0B5,
    0x8D58, 0xD7B8,
    0x8D59, 0xEAE7,
    0x8D5A, 0xD7AC,
    0x8D5B, 0xC8FC,
    0x8D5C, 0xD8D3,
    0x8D5D, 0xD8CD,
    0x8D5E, 0xD4DE,
    0x8D60, 0xD4F9,
    0x8D61, 0xC9C4,
    0x8D62, 0xD3AE,
    0x8D63, 0xB8D3,
    0x8D64, 0xB3E0,
    0x8D66, 0xC9E2,
    0x8D67, 0xF4F6,
    0x8D6B, 0xBAD5,
    0x8D6D, 0xF4F7,
    0x8D70, 0xD7DF,
    0x8D73, 0xF4F1,
    0x8D74, 0xB8B0,
    0x8D75, 0xD5D4,
    0x8D76, 0xB8CF,
    0x8D77, 0xC6F0,
    0x8D81, 0xB3C3,
    0x8D84, 0xF4F2,
    0x8D85, 0xB3AC,
    0x8D8A, 0xD4BD,
    0x8D8B, 0xC7F7,
    0x8D91, 0xF4F4,
    0x8D94, 0xF4F3,
    0x8D9F, 0xCCCB,
    0x8DA3, 0xC8A4,
    0x8DB1, 0xF4F5,
    0x8DB3, 0xD7E3,
    0x8DB4, 0xC5BF,
    0x8DB5, 0xF5C0,
    0x8DB8, 0xF5BB,
    0x8DBA, 0xF5C3,
    0x8DBC, 0xF5C2,
    0x8DBE, 0xD6BA,
    0x8DBF, 0xF5C1,
    0x8DC3, 0xD4BE,
    0x8DC4, 0xF5C4,
    0x8DC6, 0xF5CC,
    0x8DCB, 0xB0CF,
    0x8DCC, 0xB5F8,
    0x8DCE, 0xF5C9,
    0x8DCF, 0xF5CA,
    0x8DD1, 0xC5DC,
    0x8DD6, 0xF5C5,
    0x8DD7, 0xF5C6,
    0x8DDA, 0xF5C7,
    0x8DDB, 0xF5CB,
    0x8DDD, 0xBEE0,
    0x8DDE, 0xF5C8,
    0x8DDF, 0xB8FA,
    0x8DE3, 0xF5D0,
    0x8DE4, 0xF5D3,
    0x8DE8, 0xBFE7,
    0x8DEA, 0xB9F2,
    0x8DEB, 0xF5BC,
    0x8DEC, 0xF5CD,
    0x8DEF, 0xC2B7,
    0x8DF3, 0xCCF8,
    0x8DF5, 0xBCF9,
    0x8DF7, 0xF5CE,
    0x8DF8, 0xF5CF,
    0x8DF9, 0xF5D1,
    0x8DFA, 0xB6E5,
    0x8DFB, 0xF5D2,
    0x8DFD, 0xF5D5,
    0x8E05, 0xF5BD,
    0x8E09, 0xF5D4,
    0x8E0A, 0xD3BB,
    0x8E0C, 0xB3EC,
    0x8E0F, 0xCCA4,
    0x8E14, 0xF5D6,
    0x8E1D, 0xF5D7,
    0x8E1E, 0xBEE1,
    0x8E1F, 0xF5D8,
    0x8E22, 0xCCDF,
    0x8E23, 0xF5DB,
    0x8E29, 0xB2C8,
    0x8E2A, 0xD7D9,
    0x8E2C, 0xF5D9,
    0x8E2E, 0xF5DA,
    0x8E2F, 0xF5DC,
    0x8E31, 0xF5E2,
    0x8E35, 0xF5E0,
    0x8E39, 0xF5DF,
    0x8E3A, 0xF5DD,
    0x8E3D, 0xF5E1,
    0x8E40, 0xF5DE,
    0x8E41, 0xF5E4,
    0x8E42, 0xF5E5,
    0x8E44, 0xCCE3,
    0x8E47, 0xE5BF,
    0x8E48, 0xB5B8,
    0x8E49, 0xF5E3,
    0x8E4A, 0xF5E8,
    0x8E4B, 0xCCA3,
    0x8E51, 0xF5E6,
    0x8E52, 0xF5E7,
    0x8E59, 0xF5BE,
    0x8E66, 0xB1C4,
    0x8E69, 0xF5BF,
    0x8E6C, 0xB5C5,
    0x8E6D, 0xB2E4,
    0x8E6F, 0xF5EC,
    0x8E70, 0xF5E9,
    0x8E72, 0xB6D7,
    0x8E74, 0xF5ED,
    0x8E76, 0xF5EA,
    0x8E7C, 0xF5EB,
    0x8E7F, 0xB4DA,
    0x8E81, 0xD4EA,
    0x8E85, 0xF5EE,
    0x8E87, 0xB3F9,
    0x8E8F, 0xF5EF,
    0x8E90, 0xF5F1,
    0x8E94, 0xF5F0,
    0x8E9C, 0xF5F2,
    0x8E9E, 0xF5F3,
    0x8EAB, 0xC9ED,
    0x8EAC, 0xB9AA,
    0x8EAF, 0xC7FB,
    0x8EB2, 0xB6E3,
    0x8EBA, 0xCCC9,
    0x8ECE, 0xEAA6,
    0x8F66, 0xB3B5,
    0x8F67, 0xD4FE,
    0x8F68, 0xB9EC,
    0x8F69, 0xD0F9,
    0x8F6B, 0xE9ED,
    0x8F6C, 0xD7AA,
    0x8F6D, 0xE9EE,
    0x8F6E, 0xC2D6,
    0x8F6F, 0xC8ED,
    0x8F70, 0xBAE4,
    0x8F71, 0xE9EF,
    0x8F72, 0xE9F0,
    0x8F73, 0xE9F1,
    0x8F74, 0xD6E1,
    0x8F75, 0xE9F2,
    0x8F76, 0xE9F3,
    0x8F77, 0xE9F5,
    0x8F78, 0xE9F4,
    0x8F79, 0xE9F6,
    0x8F7A, 0xE9F7,
    0x8F7B, 0xC7E1,
    0x8F7C, 0xE9F8,
    0x8F7D, 0xD4D8,
    0x8F7E, 0xE9F9,
    0x8F7F, 0xBDCE,
    0x8F81, 0xE9FA,
    0x8F82, 0xE9FB,
    0x8F83, 0xBDCF,
    0x8F84, 0xE9FC,
    0x8F85, 0xB8A8,
    0x8F86, 0xC1BE,
    0x8F87, 0xE9FD,
    0x8F88, 0xB1B2,
    0x8F89, 0xBBD4,
    0x8F8A, 0xB9F5,
    0x8F8B, 0xE9FE,
    0x8F8D, 0xEAA1,
    0x8F8E, 0xEAA2,
    0x8F8F, 0xEAA3,
    0x8F90, 0xB7F8,
    0x8F91, 0xBCAD,
    0x8F93, 0xCAE4,
    0x8F94, 0xE0CE,
    0x8F95, 0xD4AF,
    0x8F96, 0xCFBD,
    0x8F97, 0xD5B7,
    0x8F98, 0xEAA4,
    0x8F99, 0xD5DE,
    0x8F9A, 0xEAA5,
    0x8F9B, 0xD0C1,
    0x8F9C, 0xB9BC,
    0x8F9E, 0xB4C7,
    0x8F9F, 0xB1D9,
    0x8FA3, 0xC0B1,
    0x8FA8, 0xB1E6,
    0x8FA9, 0xB1E7,
    0x8FAB, 0xB1E8,
    0x8FB0, 0xB3BD,
    0x8FB1, 0xC8E8,
    0x8FB6, 0xE5C1,
    0x8FB9, 0xB1DF,
    0x8FBD, 0xC1C9,
    0x8FBE, 0xB4EF,
    0x8FC1, 0xC7A8,

    0x8FC2, 0xD3D8,
    0x8FC4, 0xC6F9,
    0x8FC5, 0xD1B8,
    0x8FC7, 0xB9FD,
    0x8FC8, 0xC2F5,
    0x8FCE, 0xD3AD,
    0x8FD0, 0xD4CB,
    0x8FD1, 0xBDFC,
    0x8FD3, 0xE5C2,
    0x8FD4, 0xB7B5,
    0x8FD5, 0xE5C3,
    0x8FD8, 0xBBB9,
    0x8FD9, 0xD5E2,
    0x8FDB, 0xBDF8,
    0x8FDC, 0xD4B6,
    0x8FDD, 0xCEA5,
    0x8FDE, 0xC1AC,
    0x8FDF, 0xB3D9,
    0x8FE2, 0xCCF6,
    0x8FE4, 0xE5C6,
    0x8FE5, 0xE5C4,
    0x8FE6, 0xE5C8,
    0x8FE8, 0xE5CA,
    0x8FE9, 0xE5C7,
    0x8FEA, 0xB5CF,
    0x8FEB, 0xC6C8,
    0x8FED, 0xB5FC,
    0x8FEE, 0xE5C5,
    0x8FF0, 0xCAF6,
    0x8FF3, 0xE5C9,
    0x8FF7, 0xC3D4,
    0x8FF8, 0xB1C5,
    0x8FF9, 0xBCA3,
    0x8FFD, 0xD7B7,
    0x9000, 0xCDCB,
    0x9001, 0xCBCD,
    0x9002, 0xCACA,
    0x9003, 0xCCD3,
    0x9004, 0xE5CC,
    0x9005, 0xE5CB,
    0x9006, 0xC4E6,
    0x9009, 0xD1A1,
    0x900A, 0xD1B7,
    0x900B, 0xE5CD,
    0x900D, 0xE5D0,
    0x900F, 0xCDB8,
    0x9010, 0xD6F0,
    0x9011, 0xE5CF,
    0x9012, 0xB5DD,
    0x9014, 0xCDBE,
    0x9016, 0xE5D1,
    0x9017, 0xB6BA,
    0x901A, 0xCDA8,
    0x901B, 0xB9E4,
    0x901D, 0xCAC5,
    0x901E, 0xB3D1,
    0x901F, 0xCBD9,
    0x9020, 0xD4EC,
    0x9021, 0xE5D2,
    0x9022, 0xB7EA,
    0x9026, 0xE5CE,
    0x902D, 0xE5D5,
    0x902E, 0xB4FE,
    0x902F, 0xE5D6,
    0x9035, 0xE5D3,
    0x9036, 0xE5D4,
    0x9038, 0xD2DD,
    0x903B, 0xC2DF,
    0x903C, 0xB1C6,
    0x903E, 0xD3E2,
    0x9041, 0xB6DD,
    0x9042, 0xCBEC,
    0x9044, 0xE5D7,
    0x9047, 0xD3F6,
    0x904D, 0xB1E9,
    0x904F, 0xB6F4,
    0x9050, 0xE5DA,
    0x9051, 0xE5D8,
    0x9052, 0xE5D9,
    0x9053, 0xB5C0,
    0x9057, 0xD2C5,
    0x9058, 0xE5DC,
    0x905B, 0xE5DE,
    0x9062, 0xE5DD,
    0x9063, 0xC7B2,
    0x9065, 0xD2A3,
    0x9068, 0xE5DB,
    0x906D, 0xD4E2,
    0x906E, 0xD5DA,
    0x9074, 0xE5E0,
    0x9075, 0xD7F1,
    0x907D, 0xE5E1,
    0x907F, 0xB1DC,
    0x9080, 0xD1FB,
    0x9082, 0xE5E2,
    0x9083, 0xE5E4,
    0x9088, 0xE5E3,
    0x908B, 0xE5E5,
    0x9091, 0xD2D8,
    0x9093, 0xB5CB,
    0x9095, 0xE7DF,
    0x9097, 0xDAF5,
    0x9099, 0xDAF8,
    0x909B, 0xDAF6,
    0x909D, 0xDAF7,
    0x90A1, 0xDAFA,
    0x90A2, 0xD0CF,
    0x90A3, 0xC4C7,
    0x90A6, 0xB0EE,
    0x90AA, 0xD0B0,
    0x90AC, 0xDAF9,
    0x90AE, 0xD3CA,
    0x90AF, 0xBAAA,
    0x90B0, 0xDBA2,
    0x90B1, 0xC7F1,
    0x90B3, 0xDAFC,
    0x90B4, 0xDAFB,
    0x90B5, 0xC9DB,
    0x90B6, 0xDAFD,
    0x90B8, 0xDBA1,
    0x90B9, 0xD7DE,
    0x90BA, 0xDAFE,
    0x90BB, 0xC1DA,
    0x90BE, 0xDBA5,
    0x90C1, 0xD3F4,
    0x90C4, 0xDBA7,
    0x90C5, 0xDBA4,
    0x90C7, 0xDBA8,
    0x90CA, 0xBDBC,
    0x90CE, 0xC0C9,
    0x90CF, 0xDBA3,
    0x90D0, 0xDBA6,
    0x90D1, 0xD6A3,
    0x90D3, 0xDBA9,
    0x90D7, 0xDBAD,
    0x90DB, 0xDBAE,
    0x90DC, 0xDBAC,
    0x90DD, 0xBAC2,
    0x90E1, 0xBFA4,
    0x90E2, 0xDBAB,
    0x90E6, 0xDBAA,
    0x90E7, 0xD4C7,
    0x90E8, 0xB2BF,
    0x90EB, 0xDBAF,
    0x90ED, 0xB9F9,
    0x90EF, 0xDBB0,
    0x90F4, 0xB3BB,
    0x90F8, 0xB5A6,
    0x90FD, 0xB6BC,
    0x90FE, 0xDBB1,
    0x9102, 0xB6F5,
    0x9104, 0xDBB2,
    0x9119, 0xB1C9,
    0x911E, 0xDBB4,
    0x9122, 0xDBB3,
    0x9123, 0xDBB5,
    0x912F, 0xDBB7,
    0x9131, 0xDBB6,
    0x9139, 0xDBB8,
    0x9143, 0xDBB9,
    0x9146, 0xDBBA,
    0x9149, 0xD3CF,
    0x914A, 0xF4FA,
    0x914B, 0xC7F5,
    0x914C, 0xD7C3,
    0x914D, 0xC5E4,
    0x914E, 0xF4FC,
    0x914F, 0xF4FD,
    0x9150, 0xF4FB,
    0x9152, 0xBEC6,
    0x9157, 0xD0EF,
    0x915A, 0xB7D3,
    0x915D, 0xD4CD,
    0x915E, 0xCCAA,
    0x9161, 0xF5A2,
    0x9162, 0xF5A1,
    0x9163, 0xBAA8,
    0x9164, 0xF4FE,
    0x9165, 0xCBD6,
    0x9169, 0xF5A4,
    0x916A, 0xC0D2,
    0x916C, 0xB3EA,
    0x916E, 0xCDAA,
    0x916F, 0xF5A5,
    0x9170, 0xF5A3,
    0x9171, 0xBDB4,
    0x9172, 0xF5A8,
    0x9174, 0xF5A9,
    0x9175, 0xBDCD,
    0x9176, 0xC3B8,
    0x9177, 0xBFE1,
    0x9178, 0xCBE1,
    0x9179, 0xF5AA,
    0x917D, 0xF5A6,
    0x917E, 0xF5A7,
    0x917F, 0xC4F0,
    0x9185, 0xF5AC,
    0x9187, 0xB4BC,
    0x9189, 0xD7ED,
    0x918B, 0xB4D7,
    0x918C, 0xF5AB,
    0x918D, 0xF5AE,
    0x9190, 0xF5AD,
    0x9191, 0xF5AF,
    0x9192, 0xD0D1,
    0x919A, 0xC3D1,
    0x919B, 0xC8A9,
    0x91A2, 0xF5B0,
    0x91A3, 0xF5B1,
    0x91AA, 0xF5B2,
    0x91AD, 0xF5B3,
    0x91AE, 0xF5B4,
    0x91AF, 0xF5B5,
    0x91B4, 0xF5B7,
    0x91B5, 0xF5B6,
    0x91BA, 0xF5B8,
    0x91C7, 0xB2C9,
    0x91C9, 0xD3D4,
    0x91CA, 0xCACD,
    0x91CC, 0xC0EF,
    0x91CD, 0xD6D8,
    0x91CE, 0xD2B0,
    0x91CF, 0xC1BF,
    0x91D1, 0xBDF0,
    0x91DC, 0xB8AA,
    0x9274, 0xBCF8,
    0x928E, 0xF6C6,
    0x92AE, 0xF6C7,
    0x92C8, 0xF6C8,
    0x933E, 0xF6C9,
    0x936A, 0xF6CA,
    0x938F, 0xF6CC,
    0x93CA, 0xF6CB,
    0x93D6, 0xF7E9,
    0x943E, 0xF6CD,
    0x946B, 0xF6CE,
    0x9485, 0xEEC4,
    0x9486, 0xEEC5,
    0x9487, 0xEEC6,
    0x9488, 0xD5EB,
    0x9489, 0xB6A4,
    0x948A, 0xEEC8,
    0x948B, 0xEEC7,
    0x948C, 0xEEC9,
    0x948D, 0xEECA,
    0x948E, 0xC7A5,
    0x948F, 0xEECB,
    0x9490, 0xEECC,
    0x9492, 0xB7B0,
    0x9493, 0xB5F6,
    0x9494, 0xEECD,
    0x9495, 0xEECF,
    0x9497, 0xEECE,
    0x9499, 0xB8C6,
    0x949A, 0xEED0,
    0x949B, 0xEED1,
    0x949C, 0xEED2,
    0x949D, 0xB6DB,
    0x949E, 0xB3AE,
    0x949F, 0xD6D3,
    0x94A0, 0xC4C6,
    0x94A1, 0xB1B5,
    0x94A2, 0xB8D6,
    0x94A3, 0xEED3,
    0x94A4, 0xEED4,
    0x94A5, 0xD4BF,
    0x94A6, 0xC7D5,
    0x94A7, 0xBEFB,
    0x94A8, 0xCED9,
    0x94A9, 0xB9B3,
    0x94AA, 0xEED6,
    0x94AB, 0xEED5,
    0x94AC, 0xEED8,
    0x94AD, 0xEED7,
    0x94AE, 0xC5A5,
    0x94AF, 0xEED9,
    0x94B0, 0xEEDA,
    0x94B1, 0xC7AE,
    0x94B2, 0xEEDB,
    0x94B3, 0xC7AF,
    0x94B4, 0xEEDC,
    0x94B5, 0xB2A7,
    0x94B6, 0xEEDD,
    0x94B7, 0xEEDE,
    0x94B8, 0xEEDF,
    0x94B9, 0xEEE0,
    0x94BA, 0xEEE1,
    0x94BB, 0xD7EA,
    0x94BC, 0xEEE2,
    0x94BD, 0xEEE3,
    0x94BE, 0xBCD8,
    0x94BF, 0xEEE4,
    0x94C0, 0xD3CB,
    0x94C1, 0xCCFA,
    0x94C2, 0xB2AC,
    0x94C3, 0xC1E5,
    0x94C4, 0xEEE5,
    0x94C5, 0xC7A6,
    0x94C6, 0xC3AD,
    0x94C8, 0xEEE6,
    0x94C9, 0xEEE7,
    0x94CA, 0xEEE8,
    0x94CB, 0xEEE9,
    0x94CC, 0xEEEA,
    0x94CD, 0xEEEB,
    0x94CE, 0xEEEC,
    0x94D0, 0xEEED,
    0x94D1, 0xEEEE,
    0x94D2, 0xEEEF,
    0x94D5, 0xEEF0,
    0x94D6, 0xEEF1,
    0x94D7, 0xEEF2,
    0x94D8, 0xEEF4,
    0x94D9, 0xEEF3,
    0x94DB, 0xEEF5,
    0x94DC, 0xCDAD,
    0x94DD, 0xC2C1,
    0x94DE, 0xEEF6,
    0x94DF, 0xEEF7,
    0x94E0, 0xEEF8,
    0x94E1, 0xD5A1,
    0x94E2, 0xEEF9,
    0x94E3, 0xCFB3,
    0x94E4, 0xEEFA,
    0x94E5, 0xEEFB,
    0x94E7, 0xEEFC,
    0x94E8, 0xEEFD,
    0x94E9, 0xEFA1,
    0x94EA, 0xEEFE,
    0x94EB, 0xEFA2,
    0x94EC, 0xB8F5,
    0x94ED, 0xC3FA,
    0x94EE, 0xEFA3,
    0x94EF, 0xEFA4,
    0x94F0, 0xBDC2,
    0x94F1, 0xD2BF,
    0x94F2, 0xB2F9,
    0x94F3, 0xEFA5,
    0x94F4, 0xEFA6,
    0x94F5, 0xEFA7,
    0x94F6, 0xD2F8,
    0x94F7, 0xEFA8,
    0x94F8, 0xD6FD,
    0x94F9, 0xEFA9,
    0x94FA, 0xC6CC,
    0x94FC, 0xEFAA,
    0x94FD, 0xEFAB,
    0x94FE, 0xC1B4,
    0x94FF, 0xEFAC,
    0x9500, 0xCFFA,
    0x9501, 0xCBF8,
    0x9502, 0xEFAE,
    0x9503, 0xEFAD,
    0x9504, 0xB3FA,
    0x9505, 0xB9F8,
    0x9506, 0xEFAF,
    0x9507, 0xEFB0,
    0x9508, 0xD0E2,
    0x9509, 0xEFB1,
    0x950A, 0xEFB2,
    0x950B, 0xB7E6,
    0x950C, 0xD0BF,
    0x950D, 0xEFB3,
    0x950E, 0xEFB4,
    0x950F, 0xEFB5,
    0x9510, 0xC8F1,
    0x9511, 0xCCE0,
    0x9512, 0xEFB6,
    0x9513, 0xEFB7,
    0x9514, 0xEFB8,
    0x9515, 0xEFB9,
    0x9516, 0xEFBA,
    0x9517, 0xD5E0,
    0x9518, 0xEFBB,
    0x9519, 0xB4ED,
    0x951A, 0xC3AA,
    0x951B, 0xEFBC,
    0x951D, 0xEFBD,
    0x951E, 0xEFBE,
    0x951F, 0xEFBF,
    0x9521, 0xCEFD,
    0x9522, 0xEFC0,
    0x9523, 0xC2E0,
    0x9524, 0xB4B8,
    0x9525, 0xD7B6,
    0x9526, 0xBDF5,
    0x9528, 0xCFC7,
    0x9529, 0xEFC3,
    0x952A, 0xEFC1,
    0x952B, 0xEFC2,
    0x952C, 0xEFC4,
    0x952D, 0xB6A7,
    0x952E, 0xBCFC,
    0x952F, 0xBEE2,
    0x9530, 0xC3CC,
    0x9531, 0xEFC5,
    0x9532, 0xEFC6,
    0x9534, 0xEFC7,
    0x9535, 0xEFCF,
    0x9536, 0xEFC8,
    0x9537, 0xEFC9,
    0x9538, 0xEFCA,
    0x9539, 0xC7C2,
    0x953A, 0xEFF1,
    0x953B, 0xB6CD,
    0x953C, 0xEFCB,
    0x953E, 0xEFCC,
    0x953F, 0xEFCD,
    0x9540, 0xB6C6,
    0x9541, 0xC3BE,
    0x9542, 0xEFCE,
    0x9544, 0xEFD0,
    0x9545, 0xEFD1,
    0x9546, 0xEFD2,
    0x9547, 0xD5F2,
    0x9549, 0xEFD3,
    0x954A, 0xC4F7,
    0x954C, 0xEFD4,
    0x954D, 0xC4F8,
    0x954E, 0xEFD5,
    0x954F, 0xEFD6,
    0x9550, 0xB8E4,
    0x9551, 0xB0F7,
    0x9552, 0xEFD7,
    0x9553, 0xEFD8,
    0x9554, 0xEFD9,
    0x9556, 0xEFDA,
    0x9557, 0xEFDB,
    0x9558, 0xEFDC,
    0x9559, 0xEFDD,
    0x955B, 0xEFDE,
    0x955C, 0xBEB5,
    0x955D, 0xEFE1,
    0x955E, 0xEFDF,
    0x955F, 0xEFE0,
    0x9561, 0xEFE2,
    0x9562, 0xEFE3,
    0x9563, 0xC1CD,
    0x9564, 0xEFE4,
    0x9565, 0xEFE5,
    0x9566, 0xEFE6,
    0x9567, 0xEFE7,
    0x9568, 0xEFE8,
    0x9569, 0xEFE9,
    0x956A, 0xEFEA,
    0x956B, 0xEFEB,
    0x956C, 0xEFEC,
    0x956D, 0xC0D8,
    0x956F, 0xEFED,
    0x9570, 0xC1AD,
    0x9571, 0xEFEE,
    0x9572, 0xEFEF,
    0x9573, 0xEFF0,
    0x9576, 0xCFE2,
    0x957F, 0xB3A4,
    0x95E8, 0xC3C5,
    0x95E9, 0xE3C5,
    0x95EA, 0xC9C1,
    0x95EB, 0xE3C6,
    0x95ED, 0xB1D5,
    0x95EE, 0xCECA,
    0x95EF, 0xB4B3,
    0x95F0, 0xC8F2,
    0x95F1, 0xE3C7,
    0x95F2, 0xCFD0,
    0x95F3, 0xE3C8,
    0x95F4, 0xBCE4,
    0x95F5, 0xE3C9,
    0x95F6, 0xE3CA,
    0x95F7, 0xC3C6,
    0x95F8, 0xD5A2,
    0x95F9, 0xC4D6,
    0x95FA, 0xB9EB,
    0x95FB, 0xCEC5,
    0x95FC, 0xE3CB,
    0x95FD, 0xC3F6,
    0x95FE, 0xE3CC,
    0x9600, 0xB7A7,
    0x9601, 0xB8F3,
    0x9602, 0xBAD2,
    0x9603, 0xE3CD,
    0x9604, 0xE3CE,
    0x9605, 0xD4C4,
    0x9606, 0xE3CF,
    0x9608, 0xE3D0,
    0x9609, 0xD1CB,
    0x960A, 0xE3D1,
    0x960B, 0xE3D2,
    0x960C, 0xE3D3,
    0x960D, 0xE3D4,
    0x960E, 0xD1D6,
    0x960F, 0xE3D5,
    0x9610, 0xB2FB,
    0x9611, 0xC0BB,
    0x9612, 0xE3D6,
    0x9614, 0xC0AB,
    0x9615, 0xE3D7,
    0x9616, 0xE3D8,
    0x9617, 0xE3D9,
    0x9619, 0xE3DA,
    0x961A, 0xE3DB,
    0x961C, 0xB8B7,
    0x961D, 0xDAE2,
    0x961F, 0xB6D3,
    0x9621, 0xDAE4,
    0x9622, 0xDAE3,
    0x962A, 0xDAE6,
    0x962E, 0xC8EE,
    0x9631, 0xDAE5,
    0x9632, 0xB7C0,
    0x9633, 0xD1F4,
    0x9634, 0xD2F5,
    0x9635, 0xD5F3,
    0x9636, 0xBDD7,
    0x963B, 0xD7E8,
    0x963C, 0xDAE8,
    0x963D, 0xDAE7,
    0x963F, 0xB0A2,
    0x9640, 0xCDD3,
    0x9642, 0xDAE9,
    0x9644, 0xB8BD,
    0x9645, 0xBCCA,
    0x9646, 0xC2BD,
    0x9647, 0xC2A4,
    0x9648, 0xB3C2,
    0x9649, 0xDAEA,
    0x964B, 0xC2AA,
    0x964C, 0xC4B0,
    0x964D, 0xBDB5,
    0x9650, 0xCFDE,
    0x9654, 0xDAEB,
    0x9655, 0xC9C2,
    0x965B, 0xB1DD,
    0x965F, 0xDAEC,
    0x9661, 0xB6B8,
    0x9662, 0xD4BA,
    0x9664, 0xB3FD,
    0x9667, 0xDAED,
    0x9668, 0xD4C9,
    0x9669, 0xCFD5,
    0x966A, 0xC5E3,
    0x966C, 0xDAEE,
    0x9672, 0xDAEF,
    0x9674, 0xDAF0,
    0x9675, 0xC1EA,
    0x9676, 0xCCD5,
    0x9677, 0xCFDD,
    0x9685, 0xD3E7,
    0x9686, 0xC2A1,
    0x9688, 0xDAF1,
    0x968B, 0xCBE5,
    0x968D, 0xDAF2,
    0x968F, 0xCBE6,
    0x9690, 0xD2FE,
    0x9694, 0xB8F4,
    0x9697, 0xDAF3,
    0x9698, 0xB0AF,
    0x9699, 0xCFB6,
    0x969C, 0xD5CF,
    0x96A7, 0xCBED,
    0x96B0, 0xDAF4,
    0x96B3, 0xE3C4,
    0x96B6, 0xC1A5,
    0x96B9, 0xF6BF,
    0x96BC, 0xF6C0,
    0x96BD, 0xF6C1,
    0x96BE, 0xC4D1,
    0x96C0, 0xC8B8,
    0x96C1, 0xD1E3,
    0x96C4, 0xD0DB,
    0x96C5, 0xD1C5,
    0x96C6, 0xBCAF,
    0x96C7, 0xB9CD,
    0x96C9, 0xEFF4,
    0x96CC, 0xB4C6,
    0x96CD, 0xD3BA,
    0x96CE, 0xF6C2,
    0x96CF, 0xB3FB,
    0x96D2, 0xF6C3,
    0x96D5, 0xB5F1,
    0x96E0, 0xF6C5,
    0x96E8, 0xD3EA,
    0x96E9, 0xF6A7,
    0x96EA, 0xD1A9,
    0x96EF, 0xF6A9,
    0x96F3, 0xF6A8,
    0x96F6, 0xC1E3,
    0x96F7, 0xC0D7,
    0x96F9, 0xB1A2,
    0x96FE, 0xCEED,
    0x9700, 0xD0E8,
    0x9701, 0xF6AB,
    0x9704, 0xCFF6,
    0x9706, 0xF6AA,
    0x9707, 0xD5F0,
    0x9708, 0xF6AC,
    0x9709, 0xC3B9,
    0x970D, 0xBBF4,
    0x970E, 0xF6AE,
    0x970F, 0xF6AD,
    0x9713, 0xC4DE,
    0x9716, 0xC1D8,
    0x971C, 0xCBAA,
    0x971E, 0xCFBC,
    0x972A, 0xF6AF,
    0x972D, 0xF6B0,
    0x9730, 0xF6B1,
    0x9732, 0xC2B6,
    0x9738, 0xB0D4,
    0x9739, 0xC5F9,
    0x973E, 0xF6B2,
    0x9752, 0xC7E0,
    0x9753, 0xF6A6,
    0x9756, 0xBEB8,
    0x9759, 0xBEB2,
    0x975B, 0xB5E5,
    0x975E, 0xB7C7,
    0x9760, 0xBFBF,
    0x9761, 0xC3D2,
    0x9762, 0xC3E6,
    0x9765, 0xD8CC,
    0x9769, 0xB8EF,
    0x9773, 0xBDF9,
    0x9774, 0xD1A5,
    0x9776, 0xB0D0,
    0x977C, 0xF7B0,
    0x9785, 0xF7B1,
    0x978B, 0xD0AC,
    0x978D, 0xB0B0,
    0x9791, 0xF7B2,
    0x9792, 0xF7B3,
    0x9794, 0xF7B4,
    0x9798, 0xC7CA,
    0x97A0, 0xBECF,
    0x97A3, 0xF7B7,
    0x97AB, 0xF7B6,
    0x97AD, 0xB1DE,
    0x97AF, 0xF7B5,
    0x97B2, 0xF7B8,
    0x97B4, 0xF7B9,
    0x97E6, 0xCEA4,
    0x97E7, 0xC8CD,
    0x97E9, 0xBAAB,
    0x97EA, 0xE8B8,
    0x97EB, 0xE8B9,
    0x97EC, 0xE8BA,
    0x97ED, 0xBEC2,
    0x97F3, 0xD2F4,
    0x97F5, 0xD4CF,
    0x97F6, 0xC9D8,
    0x9875, 0xD2B3,
    0x9876, 0xB6A5,
    0x9877, 0xC7EA,
    0x9878, 0xF1FC,
    0x9879, 0xCFEE,
    0x987A, 0xCBB3,
    0x987B, 0xD0EB,
    0x987C, 0xE7EF,
    0x987D, 0xCDE7,
    0x987E, 0xB9CB,
    0x987F, 0xB6D9,
    0x9880, 0xF1FD,
    0x9881, 0xB0E4,
    0x9882, 0xCBCC,
    0x9883, 0xF1FE,
    0x9884, 0xD4A4,
    0x9885, 0xC2AD,
    0x9886, 0xC1EC,
    0x9887, 0xC6C4,
    0x9888, 0xBEB1,
    0x9889, 0xF2A1,
    0x988A, 0xBCD5,
    0x988C, 0xF2A2,
    0x988D, 0xF2A3,
    0x988F, 0xF2A4,
    0x9890, 0xD2C3,
    0x9891, 0xC6B5,
    0x9893, 0xCDC7,
    0x9894, 0xF2A5,
    0x9896, 0xD3B1,
    0x9897, 0xBFC5,
    0x9898, 0xCCE2,
    0x989A, 0xF2A6,
    0x989B, 0xF2A7,
    0x989C, 0xD1D5,
    0x989D, 0xB6EE,
    0x989E, 0xF2A8,
    0x989F, 0xF2A9,
    0x98A0, 0xB5DF,
    0x98A1, 0xF2AA,
    0x98A2, 0xF2AB,
    0x98A4, 0xB2FC,
    0x98A5, 0xF2AC,
    0x98A6, 0xF2AD,
    0x98A7, 0xC8A7,
    0x98CE, 0xB7E7,
    0x98D1, 0xECA9,
    0x98D2, 0xECAA,
    0x98D3, 0xECAB,
    0x98D5, 0xECAC,
    0x98D8, 0xC6AE,
    0x98D9, 0xECAD,
    0x98DA, 0xECAE,
    0x98DE, 0xB7C9,
    0x98DF, 0xCAB3,
    0x98E7, 0xE2B8,
    0x98E8, 0xF7CF,
    0x990D, 0xF7D0,
    0x9910, 0xB2CD,
    0x992E, 0xF7D1,
    0x9954, 0xF7D3,
    0x9955, 0xF7D2,
    0x9963, 0xE2BB,
    0x9965, 0xBCA2,
    0x9967, 0xE2BC,
    0x9968, 0xE2BD,
    0x9969, 0xE2BE,
    0x996A, 0xE2BF,
    0x996B, 0xE2C0,
    0x996C, 0xE2C1,
    0x996D, 0xB7B9,
    0x996E, 0xD2FB,
    0x996F, 0xBDA4,
    0x9970, 0xCACE,
    0x9971, 0xB1A5,
    0x9972, 0xCBC7,
    0x9974, 0xE2C2,
    0x9975, 0xB6FC,
    0x9976, 0xC8C4,
    0x9977, 0xE2C3,
    0x997A, 0xBDC8,
    0x997C, 0xB1FD,
    0x997D, 0xE2C4,
    0x997F, 0xB6F6,
    0x9980, 0xE2C5,
    0x9981, 0xC4D9,
    0x9984, 0xE2C6,
    0x9985, 0xCFDA,
    0x9986, 0xB9DD,
    0x9987, 0xE2C7,
    0x9988, 0xC0A1,
    0x998A, 0xE2C8,
    0x998B, 0xB2F6,
    0x998D, 0xE2C9,
    0x998F, 0xC1F3,
    0x9990, 0xE2CA,
    0x9991, 0xE2CB,
    0x9992, 0xC2F8,
    0x9993, 0xE2CC,
    0x9994, 0xE2CD,
    0x9995, 0xE2CE,
    0x9996, 0xCAD7,
    0x9997, 0xD8B8,
    0x9998, 0xD9E5,
    0x9999, 0xCFE3,
    0x99A5, 0xF0A5,
    0x99A8, 0xDCB0,
    0x9A6C, 0xC2ED,
    0x9A6D, 0xD4A6,
    0x9A6E, 0xCDD4,
    0x9A6F, 0xD1B1,
    0x9A70, 0xB3DB,
    0x9A71, 0xC7FD,
    0x9A73, 0xB2B5,
    0x9A74, 0xC2BF,
    0x9A75, 0xE6E0,
    0x9A76, 0xCABB,
    0x9A77, 0xE6E1,
    0x9A78, 0xE6E2,
    0x9A79, 0xBED4,
    0x9A7A, 0xE6E3,
    0x9A7B, 0xD7A4,
    0x9A7C, 0xCDD5,
    0x9A7D, 0xE6E5,
    0x9A7E, 0xBCDD,
    0x9A7F, 0xE6E4,
    0x9A80, 0xE6E6,
    0x9A81, 0xE6E7,
    0x9A82, 0xC2EE,
    0x9A84, 0xBDBE,
    0x9A85, 0xE6E8,
    0x9A86, 0xC2E6,
    0x9A87, 0xBAA7,
    0x9A88, 0xE6E9,
    0x9A8A, 0xE6EA,
    0x9A8B, 0xB3D2,
    0x9A8C, 0xD1E9,
    0x9A8F, 0xBFA5,
    0x9A90, 0xE6EB,
    0x9A91, 0xC6EF,
    0x9A92, 0xE6EC,
    0x9A93, 0xE6ED,
    0x9A96, 0xE6EE,
    0x9A97, 0xC6AD,
    0x9A98, 0xE6EF,
    0x9A9A, 0xC9A7,
    0x9A9B, 0xE6F0,
    0x9A9C, 0xE6F1,
    0x9A9D, 0xE6F2,
    0x9A9E, 0xE5B9,
    0x9A9F, 0xE6F3,
    0x9AA0, 0xE6F4,
    0x9AA1, 0xC2E2,
    0x9AA2, 0xE6F5,
    0x9AA3, 0xE6F6,
    0x9AA4, 0xD6E8,
    0x9AA5, 0xE6F7,
    0x9AA7, 0xE6F8,
    0x9AA8, 0xB9C7,
    0x9AB0, 0xF7BB,
    0x9AB1, 0xF7BA,
    0x9AB6, 0xF7BE,
    0x9AB7, 0xF7BC,
    0x9AB8, 0xBAA1,
    0x9ABA, 0xF7BF,
    0x9ABC, 0xF7C0,
    0x9AC0, 0xF7C2,
    0x9AC1, 0xF7C1,
    0x9AC2, 0xF7C4,
    0x9AC5, 0xF7C3,
    0x9ACB, 0xF7C5,
    0x9ACC, 0xF7C6,
    0x9AD1, 0xF7C7,
    0x9AD3, 0xCBE8,
    0x9AD8, 0xB8DF,
    0x9ADF, 0xF7D4,
    0x9AE1, 0xF7D5,
    0x9AE6, 0xF7D6,
    0x9AEB, 0xF7D8,
    0x9AED, 0xF7DA,
    0x9AEF, 0xF7D7,
    0x9AF9, 0xF7DB,
    0x9AFB, 0xF7D9,
    0x9B03, 0xD7D7,
    0x9B08, 0xF7DC,
    0x9B0F, 0xF7DD,
    0x9B13, 0xF7DE,
    0x9B1F, 0xF7DF,
    0x9B23, 0xF7E0,
    0x9B2F, 0xDBCB,
    0x9B32, 0xD8AA,
    0x9B3B, 0xE5F7,
    0x9B3C, 0xB9ED,
    0x9B41, 0xBFFD,
    0x9B42, 0xBBEA,
    0x9B43, 0xF7C9,
    0x9B44, 0xC6C7,
    0x9B45, 0xF7C8,
    0x9B47, 0xF7CA,
    0x9B48, 0xF7CC,
    0x9B49, 0xF7CB,
    0x9B4D, 0xF7CD,
    0x9B4F, 0xCEBA,
    0x9B51, 0xF7CE,
    0x9B54, 0xC4A7,
    0x9C7C, 0xD3E3,
    0x9C7F, 0xF6CF,
    0x9C81, 0xC2B3,
    0x9C82, 0xF6D0,
    0x9C85, 0xF6D1,
    0x9C86, 0xF6D2,
    0x9C87, 0xF6D3,
    0x9C88, 0xF6D4,
    0x9C8B, 0xF6D6,
    0x9C8D, 0xB1AB,
    0x9C8E, 0xF6D7,
    0x9C90, 0xF6D8,
    0x9C91, 0xF6D9,
    0x9C92, 0xF6DA,
    0x9C94, 0xF6DB,
    0x9C95, 0xF6DC,
    0x9C9A, 0xF6DD,
    0x9C9B, 0xF6DE,
    0x9C9C, 0xCFCA,
    0x9C9E, 0xF6DF,
    0x9C9F, 0xF6E0,
    0x9CA0, 0xF6E1,
    0x9CA1, 0xF6E2,
    0x9CA2, 0xF6E3,
    0x9CA3, 0xF6E4,
    0x9CA4, 0xC0F0,
    0x9CA5, 0xF6E5,
    0x9CA6, 0xF6E6,
    0x9CA7, 0xF6E7,
    0x9CA8, 0xF6E8,
    0x9CA9, 0xF6E9,
    0x9CAB, 0xF6EA,
    0x9CAD, 0xF6EB,
    0x9CAE, 0xF6EC,
    0x9CB0, 0xF6ED,
    0x9CB1, 0xF6EE,
    0x9CB2, 0xF6EF,
    0x9CB3, 0xF6F0,
    0x9CB4, 0xF6F1,
    0x9CB5, 0xF6F2,
    0x9CB6, 0xF6F3,
    0x9CB7, 0xF6F4,
    0x9CB8, 0xBEA8,
    0x9CBA, 0xF6F5,
    0x9CBB, 0xF6F6,
    0x9CBC, 0xF6F7,
    0x9CBD, 0xF6F8,
    0x9CC3, 0xC8FA,
    0x9CC4, 0xF6F9,
    0x9CC5, 0xF6FA,
    0x9CC6, 0xF6FB,
    0x9CC7, 0xF6FC,
    0x9CCA, 0xF6FD,
    0x9CCB, 0xF6FE,
    0x9CCC, 0xF7A1,
    0x9CCD, 0xF7A2,
    0x9CCE, 0xF7A3,
    0x9CCF, 0xF7A4,
    0x9CD0, 0xF7A5,
    0x9CD3, 0xF7A6,
    0x9CD4, 0xF7A7,
    0x9CD5, 0xF7A8,
    0x9CD6, 0xB1EE,
    0x9CD7, 0xF7A9,
    0x9CD8, 0xF7AA,
    0x9CD9, 0xF7AB,
    0x9CDC, 0xF7AC,
    0x9CDD, 0xF7AD,
    0x9CDE, 0xC1DB,
    0x9CDF, 0xF7AE,
    0x9CE2, 0xF7AF,
    0x9E1F, 0xC4F1,
    0x9E20, 0xF0AF,
    0x9E21, 0xBCA6,
    0x9E22, 0xF0B0,
    0x9E23, 0xC3F9,
    0x9E25, 0xC5B8,
    0x9E26, 0xD1BB,
    0x9E28, 0xF0B1,
    0x9E29, 0xF0B2,
    0x9E2A, 0xF0B3,
    0x9E2B, 0xF0B4,
    0x9E2C, 0xF0B5,
    0x9E2D, 0xD1BC,
    0x9E2F, 0xD1EC,
    0x9E31, 0xF0B7,
    0x9E32, 0xF0B6,
    0x9E33, 0xD4A7,
    0x9E35, 0xCDD2,
    0x9E36, 0xF0B8,
    0x9E37, 0xF0BA,
    0x9E38, 0xF0B9,
    0x9E39, 0xF0BB,
    0x9E3A, 0xF0BC,
    0x9E3D, 0xB8EB,
    0x9E3E, 0xF0BD,
    0x9E3F, 0xBAE8,
    0x9E41, 0xF0BE,
    0x9E42, 0xF0BF,
    0x9E43, 0xBEE9,
    0x9E44, 0xF0C0,
    0x9E45, 0xB6EC,
    0x9E46, 0xF0C1,
    0x9E47, 0xF0C2,
    0x9E48, 0xF0C3,
    0x9E49, 0xF0C4,
    0x9E4A, 0xC8B5,
    0x9E4B, 0xF0C5,
    0x9E4C, 0xF0C6,
    0x9E4E, 0xF0C7,
    0x9E4F, 0xC5F4,
    0x9E51, 0xF0C8,
    0x9E55, 0xF0C9,
    0x9E57, 0xF0CA,
    0x9E58, 0xF7BD,
    0x9E5A, 0xF0CB,
    0x9E5B, 0xF0CC,
    0x9E5C, 0xF0CD,
    0x9E5E, 0xF0CE,
    0x9E63, 0xF0CF,
    0x9E64, 0xBAD7,
    0x9E66, 0xF0D0,
    0x9E67, 0xF0D1,
    0x9E68, 0xF0D2,
    0x9E69, 0xF0D3,
    0x9E6A, 0xF0D4,
    0x9E6B, 0xF0D5,
    0x9E6C, 0xF0D6,
    0x9E6D, 0xF0D8,
    0x9E70, 0xD3A5,
    0x9E71, 0xF0D7,
    0x9E73, 0xF0D9,
    0x9E7E, 0xF5BA,
    0x9E7F, 0xC2B9,
    0x9E82, 0xF7E4,
    0x9E87, 0xF7E5,
    0x9E88, 0xF7E6,
    0x9E8B, 0xF7E7,
    0x9E92, 0xF7E8,
    0x9E93, 0xC2B4,
    0x9E9D, 0xF7EA,
    0x9E9F, 0xF7EB,
    0x9EA6, 0xC2F3,
    0x9EB4, 0xF4F0,
    0x9EB8, 0xF4EF,
    0x9EBB, 0xC2E9,
    0x9EBD, 0xF7E1,
    0x9EBE, 0xF7E2,
    0x9EC4, 0xBBC6,
    0x9EC9, 0xD9E4,
    0x9ECD, 0xCAF2,
    0x9ECE, 0xC0E8,
    0x9ECF, 0xF0A4,
    0x9ED1, 0xBADA,
    0x9ED4, 0xC7AD,
    0x9ED8, 0xC4AC,
    0x9EDB, 0xF7EC,
    0x9EDC, 0xF7ED,
    0x9EDD, 0xF7EE,
    0x9EDF, 0xF7F0,
    0x9EE0, 0xF7EF,
    0x9EE2, 0xF7F1,
    0x9EE5, 0xF7F4,
    0x9EE7, 0xF7F3,
    0x9EE9, 0xF7F2,
    0x9EEA, 0xF7F5,
    0x9EEF, 0xF7F6,
    0x9EF9, 0xEDE9,
    0x9EFB, 0xEDEA,
    0x9EFC, 0xEDEB,
    0x9EFE, 0xF6BC,
    0x9F0B, 0xF6BD,
    0x9F0D, 0xF6BE,
    0x9F0E, 0xB6A6,
    0x9F10, 0xD8BE,
    0x9F13, 0xB9C4,
    0x9F17, 0xD8BB,
    0x9F19, 0xDCB1,
    0x9F20, 0xCAF3,
    0x9F22, 0xF7F7,
    0x9F2C, 0xF7F8,
    0x9F2F, 0xF7F9,
    0x9F37, 0xF7FB,
    0x9F39, 0xF7FA,
    0x9F3B, 0xB1C7,
    0x9F3D, 0xF7FC,
    0x9F3E, 0xF7FD,
    0x9F44, 0xF7FE,
    0x9F50, 0xC6EB,
    0x9F51, 0xECB4,
    0x9F7F, 0xB3DD,
    0x9F80, 0xF6B3,
    0x9F83, 0xF6B4,
    0x9F84, 0xC1E4,
    0x9F85, 0xF6B5,
    0x9F86, 0xF6B6,
    0x9F87, 0xF6B7,
    0x9F88, 0xF6B8,
    0x9F89, 0xF6B9,
    0x9F8A, 0xF6BA,
    0x9F8B, 0xC8A3,
    0x9F8C, 0xF6BB,
    0x9F99, 0xC1FA,
    0x9F9A, 0xB9A8,
    0x9F9B, 0xEDE8,
    0x9F9F, 0xB9EA,
    0x9FA0, 0xD9DF,
    0xFF01, 0xA3A1,
    0xFF02, 0xA3A2,
    0xFF03, 0xA3A3,
    0xFF04, 0xA1E7,
    0xFF05, 0xA3A5,
    0xFF06, 0xA3A6,
    0xFF07, 0xA3A7,
    0xFF08, 0xA3A8,
    0xFF09, 0xA3A9,
    0xFF0A, 0xA3AA,
    0xFF0B, 0xA3AB,
    0xFF0C, 0xA3AC,
    0xFF0D, 0xA3AD,
    0xFF0E, 0xA3AE,
    0xFF0F, 0xA3AF,
    0xFF10, 0xA3B0,
    0xFF11, 0xA3B1,
    0xFF12, 0xA3B2,
    0xFF13, 0xA3B3,
    0xFF14, 0xA3B4,
    0xFF15, 0xA3B5,
    0xFF16, 0xA3B6,
    0xFF17, 0xA3B7,
    0xFF18, 0xA3B8,
    0xFF19, 0xA3B9,
    0xFF1A, 0xA3BA,
    0xFF1B, 0xA3BB,
    0xFF1C, 0xA3BC,
    0xFF1D, 0xA3BD,
    0xFF1E, 0xA3BE,
    0xFF1F, 0xA3BF,
    0xFF20, 0xA3C0,
    0xFF21, 0xA3C1,
    0xFF22, 0xA3C2,
    0xFF23, 0xA3C3,
    0xFF24, 0xA3C4,
    0xFF25, 0xA3C5,
    0xFF26, 0xA3C6,
    0xFF27, 0xA3C7,
    0xFF28, 0xA3C8,
    0xFF29, 0xA3C9,
    0xFF2A, 0xA3CA,
    0xFF2B, 0xA3CB,
    0xFF2C, 0xA3CC,
    0xFF2D, 0xA3CD,
    0xFF2E, 0xA3CE,
    0xFF2F, 0xA3CF,
    0xFF30, 0xA3D0,
    0xFF31, 0xA3D1,
    0xFF32, 0xA3D2,
    0xFF33, 0xA3D3,
    0xFF34, 0xA3D4,
    0xFF35, 0xA3D5,
    0xFF36, 0xA3D6,
    0xFF37, 0xA3D7,
    0xFF38, 0xA3D8,
    0xFF39, 0xA3D9,
    0xFF3A, 0xA3DA,
    0xFF3B, 0xA3DB,
    0xFF3C, 0xA3DC,
    0xFF3D, 0xA3DD,
    0xFF3E, 0xA3DE,
    0xFF3F, 0xA3DF,
    0xFF40, 0xA3E0,
    0xFF41, 0xA3E1,
    0xFF42, 0xA3E2,
    0xFF43, 0xA3E3,
    0xFF44, 0xA3E4,
    0xFF45, 0xA3E5,
    0xFF46, 0xA3E6,
    0xFF47, 0xA3E7,
    0xFF48, 0xA3E8,
    0xFF49, 0xA3E9,
    0xFF4A, 0xA3EA,
    0xFF4B, 0xA3EB,
    0xFF4C, 0xA3EC,
    0xFF4D, 0xA3ED,
    0xFF4E, 0xA3EE,
    0xFF4F, 0xA3EF,
    0xFF50, 0xA3F0,
    0xFF51, 0xA3F1,
    0xFF52, 0xA3F2,
    0xFF53, 0xA3F3,
    0xFF54, 0xA3F4,
    0xFF55, 0xA3F5,
    0xFF56, 0xA3F6,
    0xFF57, 0xA3F7,
    0xFF58, 0xA3F8,
    0xFF59, 0xA3F9,
    0xFF5A, 0xA3FA,
    0xFF5B, 0xA3FB,
    0xFF5C, 0xA3FC,
    0xFF5D, 0xA3FD,
    0xFF5E, 0xA1AB,
    0xFFE0, 0xA1E9,
    0xFFE1, 0xA1EA,
    0xFFE3, 0xA3FE,
    0xFFE5, 0xA3A4
};









|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
>
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

>
24
25
26
27
28
29
30
31




























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































32

















33















34



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































35
36
37
38


































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































39
40
41
42
43






























































































































































































































































































































































































































































































































































































































































































































































































































































































































































44
45

46
47








































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































48
49
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */














































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#ifndef GB2312_H















#define GB2312_H




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































INTERNAL int gb2312_wctomb_zint(unsigned int* r, unsigned int wc);
INTERNAL int gb2312_utf8tomb(struct zint_symbol *symbol, const unsigned char source[], size_t* p_length, unsigned int* gbdata);
INTERNAL int gb2312_utf8tosb(int eci, const unsigned char source[], size_t* p_length, unsigned int* gbdata);
INTERNAL void gb2312_cpy(const unsigned char source[], size_t* p_length, unsigned int* gbdata);































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#ifdef __cplusplus

}
#endif /* __cplusplus */









































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#endif /* GB2312_H */
Added jni/zint/backend/general_field.c.






















































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/* general_field.c - Handles general field compaction (GS1 DataBar and composites) */

/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <string.h>
#include "common.h"
#include "general_field.h"

static char alphanum_puncs[] = "*,-./";
static char isoiec_puncs[] = "!\"%&'()*+,-./:;<=>?_ ";

/* Returns type of char at `i`. FNC1 counted as NUMERIC. Returns 0 if invalid char */
static int general_field_type(char* general_field, int i) {
    if (general_field[i] == '[' || (general_field[i] >= '0' && general_field[i] <= '9')) {
        return NUMERIC;
    }
    if ((general_field[i] >= 'A' && general_field[i] <= 'Z') || strchr(alphanum_puncs, general_field[i])) {
        return ALPHA;
    }
    if ((general_field[i] >= 'a' && general_field[i] <= 'z') || strchr(isoiec_puncs, general_field[i])) {
        return ISOIEC;
    }
    return 0;
}

/* Returns true if next (including `i`) `num` chars of type `type`, or if given (non-zero), `type2` */
static int general_field_next(char* general_field, int i, int general_field_len, int num, int type, int type2) {
    if (i + num > general_field_len) {
        return 0;
    }
    for (; i < general_field_len && num; i++, num--) {
        int type_i = general_field_type(general_field, i);
        if ((type_i != type && !type2) || (type_i != type && type_i != type2)) {
            return 0;
        }
    }
    return num == 0;
}

/* Returns true if next (including `i`) `num` up to `max_num` chars of type `type` and occur at end */
static int general_field_next_terminate(char* general_field, int i, int general_field_len, int num, int max_num, int type) {
    if (i + max_num < general_field_len) {
        return 0;
    }
    for (; i < general_field_len; i++, num--) {
        if (general_field_type(general_field, i) != type) {
            return 0;
        }
    }
    return i == general_field_len && num <= 0;
}

/* Returns true if none of the next (including `i`) `num` chars (or end occurs) of type `type` */
static int general_field_next_none(char* general_field, int i, int general_field_len, int num, int type) {
    for (; i < general_field_len && num; i++, num--) {
        if (general_field_type(general_field, i) == type) {
            return 0;
        }
    }
    return num == 0 || i == general_field_len;
}

/* Attempts to apply encoding rules from sections 7.2.5.5.1 to 7.2.5.5.3
 * of ISO/IEC 24724:2011 (same as sections 5.4.1 to 5.4.3 of ISO/IEC 24723:2010) */
INTERNAL int general_field_encode(char* general_field, int* p_mode, int* p_last_digit, char binary_string[]) {
    int i, d1, d2;
    int mode = *p_mode;
    int last_digit = 0; /* Set to odd remaining digit at end if any */
    int general_field_len = strlen(general_field);

    for (i = 0; i < general_field_len; ) {
        int type = general_field_type(general_field, i);
        if (!type) {
            return 0;
        }
        switch (mode) {
            case NUMERIC:
                if (i < general_field_len - 1) { /* If at least 2 characters remain */
                    if (type != NUMERIC || general_field_type(general_field, i + 1) != NUMERIC) { /* 7.2.5.5.1/5.4.1 a) */
                        strcat(binary_string, "0000"); /* Alphanumeric latch */
                        mode = ALPHA;
                    } else {
                        d1 = general_field[i] == '[' ? 10 : ctoi(general_field[i]);
                        d2 = general_field[i + 1] == '[' ? 10 : ctoi(general_field[i + 1]);
                        bin_append((11 * d1) + d2 + 8, 7, binary_string);
                        i += 2;
                    }
                } else { /* If 1 character remains */
                    if (type != NUMERIC) { /* 7.2.5.5.1/5.4.1 b) */
                        strcat(binary_string, "0000"); /* Alphanumeric latch */
                        mode = ALPHA;
                    } else {
                        last_digit = general_field[i]; /* Ending with single digit. 7.2.5.5.1 c) and 5.4.1 c) dealt with separately outside this procedure */
                        i++;
                    }
                }
                break;
            case ALPHA:
                if (general_field[i] == '[') { /* 7.2.5.5.2/5.4.2 a) */
                    strcat(binary_string, "01111");
                    mode = NUMERIC;
                    i++;
                } else if (type == ISOIEC) { /* 7.2.5.5.2/5.4.2 b) */
                    strcat(binary_string, "00100"); /* ISO/IEC 646 latch */
                    mode = ISOIEC;
                } else if (general_field_next(general_field, i, general_field_len, 6, NUMERIC, 0)) { /* 7.2.5.5.2/5.4.2 c) */
                    strcat(binary_string, "000"); /* Numeric latch */
                    mode = NUMERIC;
                } else if (general_field_next_terminate(general_field, i, general_field_len, 4, 5 /*Can limit to 5 max due to above*/, NUMERIC)) { /* 7.2.5.5.2/5.4.2 d) */
                    strcat(binary_string, "000"); /* Numeric latch */
                    mode = NUMERIC;
                } else if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
                    bin_append(general_field[i] - 43, 5, binary_string);
                    i++;
                } else if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
                    bin_append(general_field[i] - 33, 6, binary_string);
                    i++;
                } else {
                    bin_append(posn(alphanum_puncs, general_field[i]) + 58, 6, binary_string);
                    i++;
                }
                break;
            case ISOIEC:
                if (general_field[i] == '[') { /* 7.2.5.5.3/5.4.3 a) */
                    strcat(binary_string, "01111");
                    mode = NUMERIC;
                    i++;
                } else {
                    int next_10_not_isoiec = general_field_next_none(general_field, i, general_field_len, 10, ISOIEC);
                    if (next_10_not_isoiec && general_field_next(general_field, i, general_field_len, 4, NUMERIC, 0)) { /* 7.2.5.5.3/5.4.3 b) */
                        strcat(binary_string, "000"); /* Numeric latch */
                        mode = NUMERIC;
                    } else if (next_10_not_isoiec && general_field_next(general_field, i, general_field_len, 5, ALPHA, NUMERIC)) { /* 7.2.5.5.3/5.4.3 c) */
                        /* Note this rule can produce longer bitstreams if most of the alphanumerics are numeric */
                        strcat(binary_string, "00100"); /* Alphanumeric latch */
                        mode = ALPHA;
                    } else if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
                        bin_append(general_field[i] - 43, 5, binary_string);
                        i++;
                    } else if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
                        bin_append(general_field[i] - 1, 7, binary_string);
                        i++;
                    } else if ((general_field[i] >= 'a') && (general_field[i] <= 'z')) {
                        bin_append(general_field[i] - 7, 7, binary_string);
                        i++;
                    } else {
                        bin_append(posn(isoiec_puncs, general_field[i]) + 232, 8, binary_string);
                        i++;
                    }
                }
                break;
        }
    }

    *p_mode = mode;
    *p_last_digit = last_digit;
    return 1;
}
Added jni/zint/backend/general_field.h.






























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*
    libzint - the open source barcode library
    Copyright (C) 2007-2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#ifndef __GENERAL_FIELD_H
#define __GENERAL_FIELD_H

#define NUMERIC         110
#define ALPHA           97
#define ISOIEC          105

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
    INTERNAL int general_field_encode(char* general_field, int* p_mode, int* p_last_digit, char binary_string[]);
#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __GENERAL_FIELD_H */
Changes to jni/zint/backend/gif.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include <math.h>
#ifdef _MSC_VER







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include <math.h>
#ifdef _MSC_VER
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
static void FlushStringTable(statestruct *pState) {
    unsigned short Pos;
    for (Pos = 0; Pos < pState->ClearCode; Pos++) {
        (pState->NodeAxon)[Pos] = 0;
    }
}

unsigned short FindPixelOutlet(statestruct *pState, unsigned short HeadNode, unsigned char Byte) {
    unsigned short Outlet;

    Outlet = (pState->NodeAxon)[HeadNode];
    while (Outlet) {
        if ((pState->NodePix)[Outlet] == Byte)
            return Outlet;
        Outlet = (pState->NodeNext)[Outlet];







|







120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
static void FlushStringTable(statestruct *pState) {
    unsigned short Pos;
    for (Pos = 0; Pos < pState->ClearCode; Pos++) {
        (pState->NodeAxon)[Pos] = 0;
    }
}

static unsigned short FindPixelOutlet(statestruct *pState, unsigned short HeadNode, unsigned char Byte) {
    unsigned short Outlet;

    Outlet = (pState->NodeAxon)[HeadNode];
    while (Outlet) {
        if ((pState->NodePix)[Outlet] == Byte)
            return Outlet;
        Outlet = (pState->NodeNext)[Outlet];
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
            DownNode = (pState->NodeNext)[DownNode];
        }
        (pState->NodeNext)[DownNode] = pState->FreeCode;
    }
    return 1;
}

int gif_lzw(unsigned char *pOut, int OutLength, unsigned char *pIn, int InLen) {
    unsigned char PixelValueCur;
    unsigned char CodeBits;
    unsigned short Pos;
    statestruct State;

    State.pIn = pIn;
    State.InLen = InLen;







|







173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
            DownNode = (pState->NodeNext)[DownNode];
        }
        (pState->NodeNext)[DownNode] = pState->FreeCode;
    }
    return 1;
}

static int gif_lzw(unsigned char *pOut, int OutLength, unsigned char *pIn, int InLen) {
    unsigned char PixelValueCur;
    unsigned char CodeBits;
    unsigned short Pos;
    statestruct State;

    State.pIn = pIn;
    State.InLen = InLen;
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270

            CodeBits = (unsigned char) (1 + 2);
            State.FreeCode = (unsigned short) (State.ClearCode + 2);
        }
    }
}

int gif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    char outbuf[10];
    FILE *gif_file;
    unsigned short usTemp;
    int byte_out;
#ifdef _MSC_VER
    char * lzwoutbuf;
#endif







|







257
258
259
260
261
262
263
264
265
266
267
268
269
270
271

            CodeBits = (unsigned char) (1 + 2);
            State.FreeCode = (unsigned short) (State.ClearCode + 2);
        }
    }
}

INTERNAL int gif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    char outbuf[10];
    FILE *gif_file;
    unsigned short usTemp;
    int byte_out;
#ifdef _MSC_VER
    char * lzwoutbuf;
#endif
Changes to jni/zint/backend/gridmtx.c.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

46


47











48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96


97
98
99
100
101
102
103
104
105
106
107
108

109
110
111

112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

135
136
137

138
139
140


141
142
143
144
145
146
147
148
149
150
151
152


153
154
155
156
157

158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181


182
183
184
185
186
187
188
189
190
191
192
193

194
195
196


197



198
199
200
201
202
203
204
205
206
207
208


209
210
211


212
213
214
215
216
217

218
219
220
221

222
223
224
225
226
227
228
229
230
231

232
233
234
235
236
237
238
239
240
241

242
243
244
245
246
247
248
249
250
251
252
253

254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276

277
278
279




280
281

282
283
284
285
286
287
288
289
290
291
292
293

294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309



310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335

336
337
338
339
340
341
342
343
344
345
346
347
348
349
350

351
352
353
354
355
356





357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384


385
386
387
388
389
390
391
392
393
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* This file impliments Grid Matrix as specified in
   AIM Global Document Number AIMD014 Rev. 1.63 Revised 9 Dec 2008 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "reedsol.h"
#include "gridmtx.h"
#include "gb2312.h"


int number_lat(int gbdata[], const size_t length, const size_t position) {


    /* Attempt to calculate the 'cost' of using numeric mode from a given position in number of bits */











    /* Also ensures that numeric mode is not selected when it cannot be used: for example in
       a string which has "2.2.0" (cannot have more than one non-numeric character for each
       block of three numeric characters) */
    size_t sp;
    int numb = 0, nonum = 0;
    int tally = 0;

    sp = position;

    do {
        int done = 0;

        if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
            numb++;
            done = 1;
        }

        switch (gbdata[sp]) {
            case ' ':
            case '+':
            case '-':
            case '.':
            case ',':
                nonum++;
                done = 1;
        }
        if ((sp + 1) < length) {
            if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) {
                nonum++;
                done = 1;
                sp++;
            }
        }

        if (done == 0) {
            tally += 80;
        } else {
            if (numb == 3) {
                if (nonum == 0) {
                    tally += 10;
                }
                if (nonum == 1) {
                    tally += 20;
                }
                if (nonum > 1) {
                    tally += 80;
                }
                numb = 0;
                nonum = 0;
            }


        }

        sp++;
    } while ((sp < length) && (sp <= (position + 8)));

    if (numb == 0) {
        tally += 80;
    }

    if (numb > 1) {
        if (nonum == 0) {
            tally += 10;

        }
        if (nonum == 1) {
            tally += 20;

        }
        if (nonum > 1) {
            tally += 80;
        }
    }

    return tally;
}

static int seek_forward(int gbdata[], const size_t length, const size_t position, int current_mode) {
    /* In complete contrast to the method recommended in Annex D of the ANSI standard this
       code uses a look-ahead test in the same manner as Data Matrix. This decision was made
       because the "official" algorithm does not provide clear methods for dealing with all
       possible combinations of input data */

    int number_count, byte_count, mixed_count, upper_count, lower_count, chinese_count;
    int    best_mode;
   size_t sp;
    int best_count, last = -1;
    int debug = 0;

    if (gbdata[position] > 0xff) {
        return GM_CHINESE;

    }

    switch (current_mode) {

        case GM_CHINESE:
            number_count = 13;
            byte_count = 13;


            mixed_count = 13;
            upper_count = 13;
            lower_count = 13;
            chinese_count = 0;
            break;
        case GM_NUMBER:
            number_count = 0;
            byte_count = 10;
            mixed_count = 10;
            upper_count = 10;
            lower_count = 10;
            chinese_count = 10;


            break;
        case GM_LOWER:
            number_count = 5;
            byte_count = 7;
            mixed_count = 7;

            upper_count = 5;
            lower_count = 0;
            chinese_count = 5;
            break;
        case GM_UPPER:
            number_count = 5;
            byte_count = 7;
            mixed_count = 7;
            upper_count = 0;
            lower_count = 5;
            chinese_count = 5;
            break;
        case GM_MIXED:
            number_count = 10;
            byte_count = 10;
            mixed_count = 0;
            upper_count = 10;
            lower_count = 10;
            chinese_count = 10;
            break;
        case GM_BYTE:
            number_count = 4;
            byte_count = 0;
            mixed_count = 4;


            upper_count = 4;
            lower_count = 4;
            chinese_count = 4;
            break;
        default: /* Start of symbol */
            number_count = 4;
            byte_count = 4;
            mixed_count = 4;
            upper_count = 4;
            lower_count = 4;
            chinese_count = 4;
    }


    for (sp = position; (sp < length) && (sp <= (position + 8)); sp++) {



        int done = 0;




        if (gbdata[sp] >= 0xff) {
            byte_count += 17;
            mixed_count += 23;
            upper_count += 18;
            lower_count += 18;
            chinese_count += 13;
            done = 1;
        }

        if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) {


            byte_count += 8;
            mixed_count += 6;
            upper_count += 10;


            lower_count += 5;
            chinese_count += 13;
            done = 1;
        }

        if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) {

            byte_count += 8;
            mixed_count += 6;
            upper_count += 5;
            lower_count += 10;

            chinese_count += 13;
            done = 1;
        }

        if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
            byte_count += 8;
            mixed_count += 6;
            upper_count += 8;
            lower_count += 8;
            chinese_count += 13;

            done = 1;
        }

        if (gbdata[sp] == ' ') {
            byte_count += 8;
            mixed_count += 6;
            upper_count += 5;
            lower_count += 5;
            chinese_count += 13;
            done = 1;

        }

        if (done == 0) {
            /* Control character */
            byte_count += 8;
            mixed_count += 16;
            upper_count += 13;
            lower_count += 13;
            chinese_count += 13;
        }

        if (gbdata[sp] >= 0x7f) {

            mixed_count += 20;
            upper_count += 20;
            lower_count += 20;
        }
    }

    /* Adjust for <end of line> */
    for (sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) {
        if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) {
            chinese_count -= 13;
        }
    }

    /* Adjust for double digits */
    for (sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) {
        if (sp != last) {
            if (((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) {
                chinese_count -= 13;
                last = (int)(sp + 1);
            }
        }
    }


    /* Numeric mode is more complex */
    number_count += number_lat(gbdata, length, position);





    if (debug) {
        printf("C %d / B %d / M %d / U %d / L %d / N %d\n", chinese_count, byte_count, mixed_count, upper_count, lower_count, number_count);

    }

    best_count = chinese_count;
    best_mode = GM_CHINESE;

    if (byte_count <= best_count) {
        best_count = byte_count;
        best_mode = GM_BYTE;
    }

    if (mixed_count <= best_count) {
        best_count = mixed_count;

        best_mode = GM_MIXED;
    }

    if (upper_count <= best_count) {
        best_count = upper_count;
        best_mode = GM_UPPER;
    }

    if (lower_count <= best_count) {
        best_count = lower_count;
        best_mode = GM_LOWER;
    }

    if (number_count <= best_count) {
        best_count = number_count;
        best_mode = GM_NUMBER;



    }

    return best_mode;
}

/* Add the length indicator for byte encoded blocks */
static void add_byte_count(char binary[], const size_t byte_count_posn, const int byte_count) {
    int p;

    for (p = 0; p < 8; p++) {
        if (byte_count & (0x100 >> p)) {
            binary[byte_count_posn + p] = '0';
        } else {
            binary[byte_count_posn + p] = '1';
        }
    }
}

/* Add a control character to the data stream */
void add_shift_char(char binary[], int shifty) {
    int i, debug = 0;
    int glyph = 0;

    for (i = 0; i < 64; i++) {
        if (shift_set[i] == shifty) {
            glyph = i;

        }
    }

    if (debug) {
        printf("SHIFT [%d] ", glyph);
    }

    bin_append(glyph, 6, binary);
}

static int gm_encode(int gbdata[], const size_t length, char binary[],const int reader,const int eci, int debug) {
    /* Create a binary stream representation of the input data.
       7 sets are defined - Chinese characters, Numerals, Lower case letters, Upper case letters,
       Mixed numerals and latters, Control characters and 8-bit binary data */
    int sp, current_mode, last_mode, glyph = 0;

    int c1, c2, done;
    int p = 0, ppos;
    int numbuf[3], punt = 0;
    size_t number_pad_posn, byte_count_posn = 0;
    int byte_count = 0;
    int shift;






    strcpy(binary, "");

    sp = 0;
    current_mode = 0;
    last_mode = 0;
    number_pad_posn = 0;

    if (reader) {
        bin_append(10, 4, binary); /* FNC3 - Reader Initialisation */
    }

    if (eci != 3) {
        /* ECI assignment according to Table 8 */
        bin_append(12, 4, binary); /* ECI */
        if (eci <= 1023) {
            bin_append(eci, 11, binary);
        }
        if ((eci >= 1024) && (eci <= 32767)) {
            strcat(binary, "10");
            bin_append(eci, 15, binary);
        }
        if (eci >= 32768) {
            strcat(binary, "11");
            bin_append(eci, 20, binary);
        }
    }



    do {
        int next_mode = seek_forward(gbdata, length, sp, current_mode);

        if (next_mode != current_mode) {
            switch (current_mode) {
                case 0:
                    switch (next_mode) {
                        case GM_CHINESE: bin_append(1, 4, binary);
                            break;







>

|













>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>



|
<
<
|
|
|
|
|
|
<
<
|
<
>
|
<
<
<
<
<
|
|
|
<
<
<
<
|
<
<
|
<
|

<
<
|
|
<
<
|
|
<
<
|
|
|
>
>
|
|
<
<
|
|
<
<
|
|
<
<
>
|
<
<
>
|
|
<
|
|
|
<
<
|
<
<
<
<
<
|
<
|
<
<
|
|
<
|
>
|
|
<
>
|
<
<
>
>
|
<
<
|
|
|
<
<
|
|
|
|
>
>
|
<
<
|
|
>
|
<
|
|
|
|
|
|
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
>
>
<
<
<
<
<
<
<
<
<
<
<
|
>
|
<

>
>
|
>
>
>

<
<
|
<
<
<
<
|

<
>
>
|
<
|
>
>
|
<
<
|
|
|
>
|
<
|
|
>
|
<
|
|
<
<
<
<
<
<
>
|
|
|
<
|
|
|
|
<
<
>

<
<
<
<
<
<
<
|
|
|
<
>
|
<
<
|
<
|
<
<
<
<
<
<
|
<
<
<
<
<
|
|
|
<
|
>
|
<
|
>
>
>
>
|
|
>
|
|
<
<
|
<
<
|
|
|
<
<
>
|
|
|
<
<
<
|

<
<
<
<
|
<
<
<
>
>
>
|
|
<




<
|
<
<
<
<
<
<
<



|
|





>



|






|



|
>






>
>
>
>
>












|















>
>

|







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66


67
68
69
70
71
72


73

74
75





76
77
78




79


80

81
82


83
84


85
86


87
88
89
90
91
92
93


94
95


96
97


98
99


100
101
102

103
104
105


106





107

108


109
110

111
112
113
114

115
116


117
118
119


120
121
122


123
124
125
126
127
128
129


130
131
132
133

134
135
136
137
138
139
140
141
142













143
144











145
146
147

148
149
150
151
152
153
154
155


156




157
158

159
160
161

162
163
164
165


166
167
168
169
170

171
172
173
174

175
176






177
178
179
180

181
182
183
184


185
186







187
188
189

190
191


192

193






194





195
196
197

198
199
200

201
202
203
204
205
206
207
208
209
210


211


212
213
214


215
216
217
218



219
220




221



222
223
224
225
226

227
228
229
230

231







232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* This file implements Grid Matrix as specified in
   AIM Global Document Number AIMD014 Rev. 1.63 Revised 9 Dec 2008 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "reedsol.h"
#include "gridmtx.h"
#include "gb2312.h"

/* define_mode() stuff */

/* Bits multiplied by this for costs, so as to be whole integer divisible by 2 and 3 */
#define GM_MULT 6

static const char numeral_nondigits[] = " +-.,"; /* Non-digit numeral set, excluding EOL (carriage return/linefeed) */

/* Whether in numeral or not. If in numeral, *p_numeral_end is set to position after numeral, and *p_numeral_cost is set to per-numeral cost */
static int in_numeral(const unsigned int gbdata[], const size_t length, const int posn, unsigned int* p_numeral_end, unsigned int* p_numeral_cost) {
    int i, digit_cnt, nondigit, nondigit_posn;

    if (posn < *p_numeral_end) {
        return 1;
    }

    /* Attempt to calculate the average 'cost' of using numeric mode in number of bits (times GM_MULT) */
    /* Also ensures that numeric mode is not selected when it cannot be used: for example in
       a string which has "2.2.0" (cannot have more than one non-numeric character for each
       block of three numeric characters) */
    for (i = posn, digit_cnt = 0, nondigit = 0, nondigit_posn = 0; i < length && i < posn + 4 && digit_cnt < 3; i++) {


        if (gbdata[i] >= '0' && gbdata[i] <= '9') {
            digit_cnt++;
        } else if (strchr(numeral_nondigits, gbdata[i])) {
            if (nondigit) {
                break;
            }


            nondigit = 1;

            nondigit_posn = i;
        } else if (i < length - 1 && gbdata[i] == 13 && gbdata[i + 1] == 10) {





            if (nondigit) {
                break;
            }




            i++;


            nondigit = 2;

            nondigit_posn = i;
        } else {


            break;
        }


    }
    if (digit_cnt == 0) { /* Must have at least one digit */


        *p_numeral_end = 0;
        return 0;
    }
    if (nondigit && nondigit_posn == i - 1) { /* Non-digit can't be at end */
        nondigit = 0;
    }
    *p_numeral_end = posn + digit_cnt + nondigit;


    /* Calculate per-numeral cost where 120 == (10 + 10) * GM_MULT, 60 == 10 * GM_MULT */
    if (digit_cnt == 3) {


        *p_numeral_cost = nondigit == 2 ? 24 /* (120 / 5) */ : nondigit == 1 ? 30 /* (120 / 4) */ : 20 /* (60 / 3) */;
    } else if (digit_cnt == 2) {


        *p_numeral_cost = nondigit == 2 ? 30 /* (120 / 4) */ : nondigit == 1 ? 40 /* (120 / 3) */ : 30 /* (60 / 2) */;
    } else {


        *p_numeral_cost = nondigit == 2 ? 40 /* (120 / 3) */ : nondigit == 1 ? 60 /* (120 / 2) */ : 60 /* (60 / 1) */;
    }
    return 1;

}

/* Encoding modes */


#define GM_CHINESE  'H'





#define GM_NUMBER   'N'

#define GM_LOWER    'L'


#define GM_UPPER    'U'
#define GM_MIXED    'M'

#define GM_BYTE     'B'
/* Note Control is a submode of Lower, Upper and Mixed modes */

/* Indexes into mode_types array */

#define GM_H   0 /* Chinese (Hanzi) */
#define GM_N   1 /* Numeral */


#define GM_L   2 /* Lower case */
#define GM_U   3 /* Upper case */
#define GM_M   4 /* Mixed */


#define GM_B   5 /* Byte */

#define GM_NUM_MODES 6



/* Initial mode costs */
static unsigned int head_costs[GM_NUM_MODES] = {
/*  H            N (+pad prefix)    L            U            M            B (+byte count) */
    4 * GM_MULT, (4 + 2) * GM_MULT, 4 * GM_MULT, 4 * GM_MULT, 4 * GM_MULT, (4 + 9) * GM_MULT
};



static unsigned int* gm_head_costs(unsigned int state[]) {
    return head_costs;
}


/* Cost of switching modes from k to j - see AIMD014 Rev. 1.63 Table 9 – Type conversion codes */
static unsigned int gm_switch_cost(unsigned int state[], const int k, const int j) {
    static const unsigned int switch_costs[GM_NUM_MODES][GM_NUM_MODES] = {
        /*      H             N                   L             U             M             B  */
        /*H*/ {            0, (13 + 2) * GM_MULT, 13 * GM_MULT, 13 * GM_MULT, 13 * GM_MULT, (13 + 9) * GM_MULT },
        /*N*/ { 10 * GM_MULT,                  0, 10 * GM_MULT, 10 * GM_MULT, 10 * GM_MULT, (10 + 9) * GM_MULT },
        /*L*/ {  5 * GM_MULT,  (5 + 2) * GM_MULT,            0,  5 * GM_MULT,  7 * GM_MULT,  (7 + 9) * GM_MULT },
        /*U*/ {  5 * GM_MULT,  (5 + 2) * GM_MULT,  5 * GM_MULT,            0,  7 * GM_MULT,  (7 + 9) * GM_MULT },
        /*M*/ { 10 * GM_MULT, (10 + 2) * GM_MULT, 10 * GM_MULT, 10 * GM_MULT,            0, (10 + 9) * GM_MULT },













        /*B*/ {  4 * GM_MULT,  (4 + 2) * GM_MULT,  4 * GM_MULT,  4 * GM_MULT,  4 * GM_MULT,                  0 },
    };












    return switch_costs[k][j];
}


/* Final end-of-data cost - see AIMD014 Rev. 1.63 Table 9 – Type conversion codes */
static unsigned int gm_eod_cost(unsigned int state[], const int k) {
    static const unsigned int eod_costs[GM_NUM_MODES] = {
    /*  H             N             L            U            M             B  */
        13 * GM_MULT, 10 * GM_MULT, 5 * GM_MULT, 5 * GM_MULT, 10 * GM_MULT, 4 * GM_MULT
    };



    return eod_costs[k];




}


/* Calculate cost of encoding current character */
static void gm_cur_cost(unsigned int state[], const unsigned int gbdata[], const size_t length, const int i, char* char_modes, unsigned int prev_costs[], unsigned int cur_costs[]) {
    int cm_i = i * GM_NUM_MODES;

    int double_byte, space, numeric, lower, upper, control, double_digit, eol;
    unsigned int* p_numeral_end = &state[0];
    unsigned int* p_numeral_cost = &state[1];
    unsigned int* p_byte_count = &state[2];



    double_byte = gbdata[i] > 0xFF;
    space = gbdata[i] == ' ';
    numeric = gbdata[i] >= '0' && gbdata[i] <= '9';
    lower = gbdata[i] >= 'a' && gbdata[i] <= 'z';

    upper = gbdata[i] >= 'A' && gbdata[i] <= 'Z';
    control = !space && !numeric && !lower && !upper && gbdata[i] < 0x7F; /* Exclude DEL */
    double_digit = i < length - 1 && numeric && gbdata[i + 1] >= '0' && gbdata[i + 1] <= '9';
    eol = i < length - 1 && gbdata[i] == 13 && gbdata[i + 1] == 10;


    /* Hanzi mode can encode anything */






    cur_costs[GM_H] = prev_costs[GM_H] + (double_digit || eol ? 39 : 78); /* (6.5 : 13) * GM_MULT */
    char_modes[cm_i + GM_H] = GM_CHINESE;

    /* Byte mode can encode anything */

    if (*p_byte_count == 512 || (double_byte && *p_byte_count == 511)) {
        cur_costs[GM_B] = head_costs[GM_B];
        if (double_byte && *p_byte_count == 511) {
            cur_costs[GM_B] += 48; /* 8 * GM_MULT */


            double_byte = 0; /* Splitting double-byte so mark as single */
        }







        *p_byte_count = 0;
    }
    cur_costs[GM_B] += prev_costs[GM_B] + (double_byte ? 96 : 48); /* (16 : 8) * GM_MULT */

    char_modes[cm_i + GM_B] = GM_BYTE;
    *p_byte_count += double_byte ? 2 : 1;




    if (in_numeral(gbdata, length, i, p_numeral_end, p_numeral_cost)) {






        cur_costs[GM_N] = prev_costs[GM_N] + *p_numeral_cost;





        char_modes[cm_i + GM_N] = GM_NUMBER;
    }


    if (control) {
        cur_costs[GM_L] = prev_costs[GM_L] + 78; /* (7 + 6) * GM_MULT */
        char_modes[cm_i + GM_L] = GM_LOWER;

        cur_costs[GM_U] = prev_costs[GM_U] + 78; /* (7 + 6) * GM_MULT */
        char_modes[cm_i + GM_U] = GM_UPPER;
        cur_costs[GM_M] = prev_costs[GM_M] + 96; /* (10 + 6) * GM_MULT */
        char_modes[cm_i + GM_M] = GM_MIXED;
    } else {
        if (lower || space) {
            cur_costs[GM_L] = prev_costs[GM_L] + 30; /* 5 * GM_MULT */
            char_modes[cm_i + GM_L] = GM_LOWER;
        }
        if (upper || space) {


            cur_costs[GM_U] = prev_costs[GM_U] + 30; /* 5 * GM_MULT */


            char_modes[cm_i + GM_U] = GM_UPPER;
        }
        if (numeric || lower || upper || space) {


            cur_costs[GM_M] = prev_costs[GM_M] + 36; /* 6 * GM_MULT */
            char_modes[cm_i + GM_M] = GM_MIXED;
        }
    }



}





/* Calculate optimized encoding modes */



static void define_mode(char* mode, const unsigned int gbdata[], const size_t length, const int debug) {
    static const char mode_types[] = { GM_CHINESE, GM_NUMBER, GM_LOWER, GM_UPPER, GM_MIXED, GM_BYTE }; /* Must be in same order as GM_H etc */
    unsigned int state[3] = { 0 /*numeral_end*/, 0 /*numeral_cost*/, 0 /*byte_count*/ };

    pn_define_mode(mode, gbdata, length, debug, state, mode_types, GM_NUM_MODES, gm_head_costs, gm_switch_cost, gm_eod_cost, gm_cur_cost);

}

/* Add the length indicator for byte encoded blocks */
static void add_byte_count(char binary[], const size_t byte_count_posn, const int byte_count) {

    bin_append_posn(byte_count - 1, 9, binary, byte_count_posn);







}

/* Add a control character to the data stream */
static void add_shift_char(char binary[], int shifty, int debug) {
    int i;
    int glyph = 0;

    for (i = 0; i < 64; i++) {
        if (shift_set[i] == shifty) {
            glyph = i;
            break;
        }
    }

    if (debug & ZINT_DEBUG_PRINT) {
        printf("SHIFT [%d] ", glyph);
    }

    bin_append(glyph, 6, binary);
}

static int gm_encode(unsigned int gbdata[], const size_t length, char binary[], const int reader, const int eci, int debug) {
    /* Create a binary stream representation of the input data.
       7 sets are defined - Chinese characters, Numerals, Lower case letters, Upper case letters,
       Mixed numerals and latters, Control characters and 8-bit binary data */
    int sp, current_mode, last_mode;
    unsigned int glyph = 0;
    int c1, c2, done;
    int p = 0, ppos;
    int numbuf[3], punt = 0;
    size_t number_pad_posn, byte_count_posn = 0;
    int byte_count = 0;
    int shift;
#ifndef _MSC_VER
    char mode[length];
#else
    char* mode = (char*) _alloca(length);
#endif

    strcpy(binary, "");

    sp = 0;
    current_mode = 0;
    last_mode = 0;
    number_pad_posn = 0;

    if (reader) {
        bin_append(10, 4, binary); /* FNC3 - Reader Initialisation */
    }

    if (eci != 0) {
        /* ECI assignment according to Table 8 */
        bin_append(12, 4, binary); /* ECI */
        if (eci <= 1023) {
            bin_append(eci, 11, binary);
        }
        if ((eci >= 1024) && (eci <= 32767)) {
            strcat(binary, "10");
            bin_append(eci, 15, binary);
        }
        if (eci >= 32768) {
            strcat(binary, "11");
            bin_append(eci, 20, binary);
        }
    }

    define_mode(mode, gbdata, length, debug);

    do {
        int next_mode = mode[sp];

        if (next_mode != current_mode) {
            switch (current_mode) {
                case 0:
                    switch (next_mode) {
                        case GM_CHINESE: bin_append(1, 4, binary);
                            break;
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
                        case GM_UPPER: bin_append(4, 4, binary);
                            break;
                        case GM_MIXED: bin_append(5, 4, binary);
                            break;
                    }
                    break;
            }
            if (debug) {
                switch (next_mode) {
                    case GM_CHINESE: printf("CHIN ");
                        break;
                    case GM_NUMBER: printf("NUMB ");
                        break;
                    case GM_LOWER: printf("LOWR ");
                        break;







|







402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
                        case GM_UPPER: bin_append(4, 4, binary);
                            break;
                        case GM_MIXED: bin_append(5, 4, binary);
                            break;
                    }
                    break;
            }
            if (debug & ZINT_DEBUG_PRINT) {
                switch (next_mode) {
                    case GM_CHINESE: printf("CHIN ");
                        break;
                    case GM_NUMBER: printf("NUMB ");
                        break;
                    case GM_LOWER: printf("LOWR ");
                        break;
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537

538
539
540
541
542
543
544
545
546

547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
            case GM_CHINESE:
                done = 0;
                if (gbdata[sp] > 0xff) {
                    /* GB2312 character */
                    c1 = (gbdata[sp] & 0xff00) >> 8;
                    c2 = gbdata[sp] & 0xff;

                    if ((c1 >= 0xa0) && (c1 <= 0xa9)) {
                        glyph = (0x60 * (c1 - 0xa1)) + (c2 - 0xa0);
                    }
                    if ((c1 >= 0xb0) && (c1 <= 0xf7)) {
                        glyph = (0x60 * (c1 - 0xb0 + 9)) + (c2 - 0xa0);
                    }
                    done = 1;
                }
                if (!(done)) {
                    if (sp != (length - 1)) {
                        if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) {
                            /* End of Line */
                            glyph = 7776;
                            sp++;
                        }
                        done = 1;

                    }
                }
                if (!(done)) {
                    if (sp != (length - 1)) {
                        if (((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) &&
                                ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) {
                            /* Two digits */
                            glyph = 8033 + (10 * (gbdata[sp] - '0')) + (gbdata[sp + 1] - '0');
                            sp++;

                        }
                    }
                }
                if (!(done)) {
                    /* Byte value */
                    glyph = 7777 + gbdata[sp];
                }

                if (debug) {
                    printf("[%d] ", glyph);
                }

                bin_append(glyph, 13, binary);
                sp++;
                break;








|

<
|


|



|



<
|
>









>








|







430
431
432
433
434
435
436
437
438

439
440
441
442
443
444
445
446
447
448
449

450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
            case GM_CHINESE:
                done = 0;
                if (gbdata[sp] > 0xff) {
                    /* GB2312 character */
                    c1 = (gbdata[sp] & 0xff00) >> 8;
                    c2 = gbdata[sp] & 0xff;

                    if ((c1 >= 0xa1) && (c1 <= 0xa9)) {
                        glyph = (0x60 * (c1 - 0xa1)) + (c2 - 0xa0);

                    } else if ((c1 >= 0xb0) && (c1 <= 0xf7)) {
                        glyph = (0x60 * (c1 - 0xb0 + 9)) + (c2 - 0xa0);
                    }
                    done = 1; /* GB 2312 always within above ranges */
                }
                if (!(done)) {
                    if (sp != (length - 1)) {
                        if ((gbdata[sp] == 13) && (gbdata[sp + 1] == 10)) {
                            /* End of Line */
                            glyph = 7776;
                            sp++;

                            done = 1;
                        }
                    }
                }
                if (!(done)) {
                    if (sp != (length - 1)) {
                        if (((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) &&
                                ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) {
                            /* Two digits */
                            glyph = 8033 + (10 * (gbdata[sp] - '0')) + (gbdata[sp + 1] - '0');
                            sp++;
                            done = 1;
                        }
                    }
                }
                if (!(done)) {
                    /* Byte value */
                    glyph = 7777 + gbdata[sp];
                }

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("[%d] ", glyph);
                }

                bin_append(glyph, 13, binary);
                sp++;
                break;

574
575
576
577
578
579
580
581

582

583
584
585
586
587
588
589
590
591
592



593
594
595
596
597
598
599
600
601

602

603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643

644
645





646
647
648
649
650
651
652
653
654
655
656
657
658
659



660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747

                numbuf[0] = '0';
                numbuf[1] = '0';
                numbuf[2] = '0';
                do {
                    if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
                        numbuf[p] = gbdata[sp];
                        sp++;

                        p++;

                    }
                    switch (gbdata[sp]) {
                        case ' ':
                        case '+':
                        case '-':
                        case '.':
                        case ',':
                            punt = gbdata[sp];
                            sp++;
                            ppos = p;



                            break;
                    }
                    if (sp < (length - 1)) {
                        if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) {
                            /* <end of line> */
                            punt = gbdata[sp];
                            sp += 2;
                            ppos = p;
                        }

                    }

                } while ((p < 3) && (sp < length));

                if (ppos != -1) {
                    switch (punt) {
                        case ' ': glyph = 0;
                            break;
                        case '+': glyph = 3;
                            break;
                        case '-': glyph = 6;
                            break;
                        case '.': glyph = 9;
                            break;
                        case ',': glyph = 12;
                            break;
                        case 0x13: glyph = 15;
                            break;
                    }
                    glyph += ppos;
                    glyph += 1000;

                    if (debug) {
                        printf("[%d] ", glyph);
                    }

                    bin_append(glyph, 10, binary);
                }

                glyph = (100 * (numbuf[0] - '0')) + (10 * (numbuf[1] - '0')) + (numbuf[2] - '0');
                if (debug) {
                    printf("[%d] ", glyph);
                }

                bin_append(glyph, 10, binary);
                break;

            case GM_BYTE:
                if (last_mode != current_mode) {
                    /* Reserve space for byte block length indicator (9 bits) */
                    byte_count_posn = strlen(binary);
                    strcat(binary, "LLLLLLLLL");
                }

                if (byte_count == 512) {
                    /* Maximum byte block size is 512 bytes. If longer is needed then start a new block */





                    add_byte_count(binary, byte_count_posn, byte_count);
                    bin_append(7, 4, binary);
                    byte_count_posn = strlen(binary);
                    strcat(binary, "LLLLLLLLL");
                    byte_count = 0;
                }

                glyph = gbdata[sp];
                if (debug) {
                    printf("[%d] ", glyph);
                }
                bin_append(glyph, 8, binary);
                sp++;
                byte_count++;



                break;

            case GM_MIXED:
                shift = 1;
                if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
                    shift = 0;
                }
                if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) {
                    shift = 0;
                }
                if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) {
                    shift = 0;
                }
                if (gbdata[sp] == ' ') {
                    shift = 0;
                }

                if (shift == 0) {
                    /* Mixed Mode character */
                    glyph = posn(EUROPIUM, gbdata[sp]);
                    if (debug) {
                        printf("[%d] ", glyph);
                    }

                    bin_append(glyph, 6, binary);
                } else {
                    /* Shift Mode character */
                    bin_append(1014, 10, binary); /* shift indicator */
                    add_shift_char(binary, gbdata[sp]);
                }

                sp++;
                break;

            case GM_UPPER:
                shift = 1;
                if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) {
                    shift = 0;
                }
                if (gbdata[sp] == ' ') {
                    shift = 0;
                }

                if (shift == 0) {
                    /* Upper Case character */
                    glyph = posn("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", gbdata[sp]);
                    if (debug) {
                        printf("[%d] ", glyph);
                    }

                    bin_append(glyph, 5, binary);
                } else {
                    /* Shift Mode character */
                    bin_append(125, 7, binary); /* shift indicator */
                    add_shift_char(binary, gbdata[sp]);
                }

                sp++;
                break;

            case GM_LOWER:
                shift = 1;
                if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) {
                    shift = 0;
                }
                if (gbdata[sp] == ' ') {
                    shift = 0;
                }

                if (shift == 0) {
                    /* Lower Case character */
                    glyph = posn("abcdefghijklmnopqrstuvwxyz ", gbdata[sp]);
                    if (debug) {
                        printf("[%d] ", glyph);
                    }

                    bin_append(glyph, 5, binary);
                } else {
                    /* Shift Mode character */
                    bin_append(125, 7, binary); /* shift indicator */
                    add_shift_char(binary, gbdata[sp]);
                }

                sp++;
                break;
        }
        if (strlen(binary) > 9191) {
            return ZINT_ERROR_TOO_LONG;







|
>
|
>
|
<
<
<
<
<
<
|
<
|
>
>
>

|
<
<
<
|
|
|
|
>

>
|













|





|







|












>
|

>
>
>
>
>







<
|


|


>
>
>




















|







|

















|







|

















|







|







489
490
491
492
493
494
495
496
497
498
499
500






501

502
503
504
505
506
507



508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570

571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667

                numbuf[0] = '0';
                numbuf[1] = '0';
                numbuf[2] = '0';
                do {
                    if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
                        numbuf[p] = gbdata[sp];
                        p++;
                    } else if (strchr(numeral_nondigits, gbdata[sp])) {
                        if (ppos != -1) {
                            break;
                        }






                        punt = gbdata[sp];

                        ppos = p;
                    } else if (sp < (length - 1) && (gbdata[sp] == 13) && (gbdata[sp + 1] == 10)) {
                        /* <end of line> */
                        if (ppos != -1) {
                            break;
                        }



                        punt = gbdata[sp];
                        sp++;
                        ppos = p;
                    } else {
                        break;
                    }
                    sp++;
                } while ((p < 3) && (sp < length) && mode[sp] == GM_NUMBER);

                if (ppos != -1) {
                    switch (punt) {
                        case ' ': glyph = 0;
                            break;
                        case '+': glyph = 3;
                            break;
                        case '-': glyph = 6;
                            break;
                        case '.': glyph = 9;
                            break;
                        case ',': glyph = 12;
                            break;
                        case 13: glyph = 15;
                            break;
                    }
                    glyph += ppos;
                    glyph += 1000;

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("[%d] ", glyph);
                    }

                    bin_append(glyph, 10, binary);
                }

                glyph = (100 * (numbuf[0] - '0')) + (10 * (numbuf[1] - '0')) + (numbuf[2] - '0');
                if (debug & ZINT_DEBUG_PRINT) {
                    printf("[%d] ", glyph);
                }

                bin_append(glyph, 10, binary);
                break;

            case GM_BYTE:
                if (last_mode != current_mode) {
                    /* Reserve space for byte block length indicator (9 bits) */
                    byte_count_posn = strlen(binary);
                    strcat(binary, "LLLLLLLLL");
                }
                glyph = gbdata[sp];
                if (byte_count == 512 || (glyph > 0xFF && byte_count == 511)) {
                    /* Maximum byte block size is 512 bytes. If longer is needed then start a new block */
                    if (glyph > 0xFF && byte_count == 511) { /* Split double-byte */
                        bin_append(glyph >> 8, 8, binary);
                        glyph &= 0xFF;
                        byte_count++;
                    }
                    add_byte_count(binary, byte_count_posn, byte_count);
                    bin_append(7, 4, binary);
                    byte_count_posn = strlen(binary);
                    strcat(binary, "LLLLLLLLL");
                    byte_count = 0;
                }


                if (debug & ZINT_DEBUG_PRINT) {
                    printf("[%d] ", glyph);
                }
                bin_append(glyph, glyph > 0xFF ? 16 : 8, binary);
                sp++;
                byte_count++;
                if (glyph > 0xFF) {
                    byte_count++;
                }
                break;

            case GM_MIXED:
                shift = 1;
                if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) {
                    shift = 0;
                }
                if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) {
                    shift = 0;
                }
                if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) {
                    shift = 0;
                }
                if (gbdata[sp] == ' ') {
                    shift = 0;
                }

                if (shift == 0) {
                    /* Mixed Mode character */
                    glyph = posn(EUROPIUM, gbdata[sp]);
                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("[%d] ", glyph);
                    }

                    bin_append(glyph, 6, binary);
                } else {
                    /* Shift Mode character */
                    bin_append(1014, 10, binary); /* shift indicator */
                    add_shift_char(binary, gbdata[sp], debug);
                }

                sp++;
                break;

            case GM_UPPER:
                shift = 1;
                if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) {
                    shift = 0;
                }
                if (gbdata[sp] == ' ') {
                    shift = 0;
                }

                if (shift == 0) {
                    /* Upper Case character */
                    glyph = posn("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", gbdata[sp]);
                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("[%d] ", glyph);
                    }

                    bin_append(glyph, 5, binary);
                } else {
                    /* Shift Mode character */
                    bin_append(125, 7, binary); /* shift indicator */
                    add_shift_char(binary, gbdata[sp], debug);
                }

                sp++;
                break;

            case GM_LOWER:
                shift = 1;
                if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) {
                    shift = 0;
                }
                if (gbdata[sp] == ' ') {
                    shift = 0;
                }

                if (shift == 0) {
                    /* Lower Case character */
                    glyph = posn("abcdefghijklmnopqrstuvwxyz ", gbdata[sp]);
                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("[%d] ", glyph);
                    }

                    bin_append(glyph, 5, binary);
                } else {
                    /* Shift Mode character */
                    bin_append(125, 7, binary); /* shift indicator */
                    add_shift_char(binary, gbdata[sp], debug);
                }

                sp++;
                break;
        }
        if (strlen(binary) > 9191) {
            return ZINT_ERROR_TOO_LONG;
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
            break;
        case GM_BYTE: bin_append(0, 4, binary);
            break;
    }

    /* Add padding bits if required */
    p = 7 - (strlen(binary) % 7);
    if (p == 7) {
        p = 0;
    }
    bin_append(0, p, binary);

    if (strlen(binary) > 9191) {
        return ZINT_ERROR_TOO_LONG;
    }
    return 0;
}

static void gm_add_ecc(const char binary[], const size_t data_posn, const int layers, const int ecc_level, int word[]) {
    int data_cw, i, j, wp, p;
    int n1, b1, n2, b2, e1, b3, e2;
    int block_size, ecc_size;
    int data[1320], block[130];
    unsigned char data_block[115], ecc_block[70];

    data_cw = gm_data_codewords[((layers - 1) * 5) + (ecc_level - 1)];

    for (i = 0; i < 1320; i++) {
        data[i] = 0;
    }

    /* Convert from binary sream to 7-bit codewords */
    for (i = 0; i < data_posn; i++) {
        for (p = 0; p < 7; p++) {
            if (binary[i * 7 + p] == '1') {
                data[i] += (0x40 >> p);
            }
        }
    }







|
|

<







|



|








|







702
703
704
705
706
707
708
709
710
711

712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
            break;
        case GM_BYTE: bin_append(0, 4, binary);
            break;
    }

    /* Add padding bits if required */
    p = 7 - (strlen(binary) % 7);
    if (p % 7) {
        bin_append(0, p, binary);
    }


    if (strlen(binary) > 9191) {
        return ZINT_ERROR_TOO_LONG;
    }
    return 0;
}

static void gm_add_ecc(const char binary[], const size_t data_posn, const int layers, const int ecc_level, unsigned char word[]) {
    int data_cw, i, j, wp, p;
    int n1, b1, n2, b2, e1, b3, e2;
    int block_size, ecc_size;
    unsigned char data[1320], block[130];
    unsigned char data_block[115], ecc_block[70];

    data_cw = gm_data_codewords[((layers - 1) * 5) + (ecc_level - 1)];

    for (i = 0; i < 1320; i++) {
        data[i] = 0;
    }

    /* Convert from binary stream to 7-bit codewords */
    for (i = 0; i < data_posn; i++) {
        for (p = 0; p < 7; p++) {
            if (binary[i * 7 + p] == '1') {
                data[i] += (0x40 >> p);
            }
        }
    }
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
        }
        if (block_size == n1) {
            word[((b1 + b2) * (n1 - 1)) + i] = block[(n1 - 1)];
        }
    }
}

void place_macromodule(char grid[], int x, int y, int word1, int word2, int size) {
    int i, j;

    i = (x * 6) + 1;
    j = (y * 6) + 1;

    if (word2 & 0x40) {
        grid[(j * size) + i + 2] = '1';







|







799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
        }
        if (block_size == n1) {
            word[((b1 + b2) * (n1 - 1)) + i] = block[(n1 - 1)];
        }
    }
}

static void place_macromodule(char grid[], int x, int y, int word1, int word2, int size) {
    int i, j;

    i = (x * 6) + 1;
    j = (y * 6) + 1;

    if (word2 & 0x40) {
        grid[(j * size) + i + 2] = '1';
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
        grid[((j + 3) * size) + i + 2] = '1';
    }
    if (word1 & 0x01) {
        grid[((j + 3) * size) + i + 3] = '1';
    }
}

void place_data_in_grid(int word[], char grid[], int modules, int size) {
    int x, y, macromodule, offset;

    offset = 13 - ((modules - 1) / 2);
    for (y = 0; y < modules; y++) {
        for (x = 0; x < modules; x++) {
            macromodule = gm_macro_matrix[((y + offset) * 27) + (x + offset)];
            place_macromodule(grid, x, y, word[macromodule * 2], word[(macromodule * 2) + 1], size);
        }
    }
}

/* Place the layer ID into each macromodule */
void place_layer_id(char* grid, int size, int layers, int modules, int ecc_level) {
    int i, j, layer, start, stop;

#ifndef _MSC_VER
    int layerid[layers + 1];
    int id[modules * modules];
#else
    int* layerid = (int *) _alloca((layers + 1) * sizeof (int));







|












|







849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
        grid[((j + 3) * size) + i + 2] = '1';
    }
    if (word1 & 0x01) {
        grid[((j + 3) * size) + i + 3] = '1';
    }
}

static void place_data_in_grid(unsigned char word[], char grid[], int modules, int size) {
    int x, y, macromodule, offset;

    offset = 13 - ((modules - 1) / 2);
    for (y = 0; y < modules; y++) {
        for (x = 0; x < modules; x++) {
            macromodule = gm_macro_matrix[((y + offset) * 27) + (x + offset)];
            place_macromodule(grid, x, y, word[macromodule * 2], word[(macromodule * 2) + 1], size);
        }
    }
}

/* Place the layer ID into each macromodule */
static void place_layer_id(char* grid, int size, int layers, int modules, int ecc_level) {
    int i, j, layer, start, stop;

#ifndef _MSC_VER
    int layerid[layers + 1];
    int id[modules * modules];
#else
    int* layerid = (int *) _alloca((layers + 1) * sizeof (int));
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008

1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028


1029
1030
1031



1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
            if (id[(i * modules) + j] & 0x01) {
                grid[(((i * 6) + 1) * size) + (j * 6) + 2] = '1';
            }
        }
    }
}

int grid_matrix(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    int size, modules, error_number;
    int auto_layers, min_layers, layers, auto_ecc_level, min_ecc_level, ecc_level;
    int x, y, i;
    char binary[9300];
    int data_cw, input_latch = 0;

    int word[1460], data_max, reader = 0;

#ifndef _MSC_VER
    int utfdata[length + 1];
    int gbdata[length + 1];
#else
    char* grid;
    int* utfdata = (int *) _alloca((length + 1) * sizeof (int));
    int* gbdata = (int *) _alloca((length + 1) * sizeof (int));
#endif

    for (i = 0; i < 1460; i++) {
        word[i] = 0;
    }

    if ((symbol->input_mode == DATA_MODE) || (symbol->eci != 3)) {
        for (i = 0; i < length; i++) {
            gbdata[i] = (int) source[i];
        }
    } else {


        /* Convert Unicode input to GB-2312 */
        error_number = utf8toutf16(symbol, source, utfdata, &length);
        if (error_number != 0) {



            return error_number;
        }

        for (i = 0; i < length; i++) {
            if (utfdata[i] <= 0xff) {
                gbdata[i] = utfdata[i];
            } else {
                int j = 0;
                int glyph = 0;
                do {
                    if (gb2312_lookup[j * 2] == utfdata[i]) {
                        glyph = gb2312_lookup[(j * 2) + 1];
                    }
                    j++;
                } while ((j < 7445) && (glyph == 0));
                if (glyph == 0) {
                    strcpy(symbol->errtxt, "530: Invalid character in input data");
                    return ZINT_ERROR_INVALID_DATA;
                }
                gbdata[i] = glyph;
            }
        }
    }

    if (symbol->output_options & READER_INIT) reader = 1;

    if (symbol->eci > 811799) {







|





>
|


<
|


<
|






|
|
<
<

>
>
|
|
|
>
>
>
|
|
|
<
<
<
<
<
<
|
|
|
<
<
<
|
<
|
<
<







915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931

932
933
934

935
936
937
938
939
940
941
942
943


944
945
946
947
948
949
950
951
952
953
954
955






956
957
958



959

960


961
962
963
964
965
966
967
            if (id[(i * modules) + j] & 0x01) {
                grid[(((i * 6) + 1) * size) + (j * 6) + 2] = '1';
            }
        }
    }
}

INTERNAL int grid_matrix(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    int size, modules, error_number;
    int auto_layers, min_layers, layers, auto_ecc_level, min_ecc_level, ecc_level;
    int x, y, i;
    char binary[9300];
    int data_cw, input_latch = 0;
    unsigned char word[1460];
    int data_max, reader = 0;

#ifndef _MSC_VER

    unsigned int gbdata[length + 1];
#else
    char* grid;

    unsigned int* gbdata = (unsigned int *) _alloca((length + 1) * sizeof (unsigned int));
#endif

    for (i = 0; i < 1460; i++) {
        word[i] = 0;
    }

    if ((symbol->input_mode & 0x07) == DATA_MODE) {
        gb2312_cpy(source, &length, gbdata);


    } else {
        int done = 0;
        if (symbol->eci != 29) { /* Unless ECI 29 (GB) */
            /* Try single byte (Latin) conversion first */
            int error_number = gb2312_utf8tosb(symbol->eci && symbol->eci <= 899 ? symbol->eci : 3, source, &length, gbdata);
            if (error_number == 0) {
                done = 1;
            } else if (symbol->eci && symbol->eci <= 899) {
                strcpy(symbol->errtxt, "575: Invalid characters in input data");
                return error_number;
            }
        }






        if (!done) {
            /* Try GB 2312 (EUC-CN) */
            int error_number = gb2312_utf8tomb(symbol, source, &length, gbdata);



            if (error_number != 0) {

                return error_number;


            }
        }
    }

    if (symbol->output_options & READER_INIT) reader = 1;

    if (symbol->eci > 811799) {
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120

1121

1122


1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133

1134




1135

1136

1137
1138
1139
1140
1141
1142
1143
    min_layers = 13;
    for (i = 12; i > 0; i--) {
        if (gm_max_cw[(i - 1)] >= data_cw) {
            min_layers = i;
        }
    }
    layers = auto_layers;
    auto_ecc_level = 3;
    if (layers == 1) {
        auto_ecc_level = 5;
    }
    if ((layers == 2) || (layers == 3)) {
        auto_ecc_level = 4;
    }
    min_ecc_level = 1;
    if (layers == 1) {
        min_ecc_level = 4;
    }
    if ((layers == 2) || (layers == 3)) {
        min_ecc_level = 2;
    }
    ecc_level = auto_ecc_level;

    if ((symbol->option_2 >= 1) && (symbol->option_2 <= 13)) {
        input_latch = 1;
        if (symbol->option_2 > min_layers) {
            layers = symbol->option_2;
        } else {
            strcpy(symbol->errtxt, "534: Input data too long for selected symbol size");
            return ZINT_ERROR_TOO_LONG;
        }
    }

    if (input_latch == 1) {
        auto_ecc_level = 3;
        if (layers == 1) {
            auto_ecc_level = 5;
        }
        if ((layers == 2) || (layers == 3)) {
            auto_ecc_level = 4;
        }
        ecc_level = auto_ecc_level;
        if (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) {

            layers++;

        }


    }

    if (input_latch == 0) {
        if ((symbol->option_1 >= 1) && (symbol->option_1 <= 5)) {
            if (symbol->option_1 > min_ecc_level) {
                ecc_level = symbol->option_1;
            } else {
                ecc_level = min_ecc_level;
            }
        }
        if (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) {

            do {




                layers++;

            } while ((data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) && (layers <= 13));

        }
    }

    data_max = 1313;
    switch (ecc_level) {
        case 2: data_max = 1167;
            break;







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<



|







<
|
|
|
|
|
|
|
|
|
>
|
>
|
>
>


<
|
|
|
|
|
|
|
|
>

>
>
>
>
|
>
|
>







987
988
989
990
991
992
993















994
995
996
997
998
999
1000
1001
1002
1003
1004

1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021

1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
    min_layers = 13;
    for (i = 12; i > 0; i--) {
        if (gm_max_cw[(i - 1)] >= data_cw) {
            min_layers = i;
        }
    }
    layers = auto_layers;
















    if ((symbol->option_2 >= 1) && (symbol->option_2 <= 13)) {
        input_latch = 1;
        if (symbol->option_2 >= min_layers) {
            layers = symbol->option_2;
        } else {
            strcpy(symbol->errtxt, "534: Input data too long for selected symbol size");
            return ZINT_ERROR_TOO_LONG;
        }
    }


    auto_ecc_level = 3;
    if (layers == 1) {
        auto_ecc_level = 5;
    }
    if ((layers == 2) || (layers == 3)) {
        auto_ecc_level = 4;
    }
    ecc_level = auto_ecc_level;

    min_ecc_level = 1;
    if (layers == 1) {
        min_ecc_level = 4;
    }
    if (layers == 2) {
        min_ecc_level = 2;
    }


    if ((symbol->option_1 >= 1) && (symbol->option_1 <= 5)) {
        if (symbol->option_1 >= min_ecc_level) {
            ecc_level = symbol->option_1;
        } else {
            ecc_level = min_ecc_level;
        }
    }
    if (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) {
        if (input_latch && ecc_level > min_ecc_level) { /* If layers user-specified (option_2), try reducing ECC level first */
            do {
                ecc_level--;
            } while ((data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) && (ecc_level > min_ecc_level));
        }
        while (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)] && (layers < 13)) {
            layers++;
        }
        while (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)] && ecc_level > 1) { /* ECC min level 1 for layers > 2 */
            ecc_level--;
        }
    }

    data_max = 1313;
    switch (ecc_level) {
        case 2: data_max = 1167;
            break;
1151
1152
1153
1154
1155
1156
1157



1158
1159
1160
1161
1162
1163
1164

    if (data_cw > data_max) {
        strcpy(symbol->errtxt, "532: Input data too long");
        return ZINT_ERROR_TOO_LONG;
    }

    gm_add_ecc(binary, data_cw, layers, ecc_level, word);



    size = 6 + (layers * 12);
    modules = 1 + (layers * 2);

#ifndef _MSC_VER
    char grid[size * size];
#else
    grid = (char *) _alloca((size * size) * sizeof (char));







>
>
>







1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070

    if (data_cw > data_max) {
        strcpy(symbol->errtxt, "532: Input data too long");
        return ZINT_ERROR_TOO_LONG;
    }

    gm_add_ecc(binary, data_cw, layers, ecc_level, word);
#ifdef ZINT_TEST
    if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, word, data_cw);
#endif
    size = 6 + (layers * 12);
    modules = 1 + (layers * 2);

#ifndef _MSC_VER
    char grid[size * size];
#else
    grid = (char *) _alloca((size * size) * sizeof (char));
1203
1204
1205
1206
1207
1208
1209
1210
1211
            }
        }
        symbol->row_height[x] = 1;
    }

    return 0;
}









<
<
1109
1110
1111
1112
1113
1114
1115


            }
        }
        symbol->row_height[x] = 1;
    }

    return 0;
}


Changes to jni/zint/backend/gridmtx.h.
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#define GM_NUMBER	1
#define GM_LOWER	2
#define GM_UPPER	3
#define GM_MIXED	4
#define GM_CONTROL	5
#define GM_BYTE		6
#define GM_CHINESE	7

#define EUROPIUM	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "

static const char shift_set[] = {
    /* From Table 7 - Encoding of control characters */
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* NULL -> SI */
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* DLE -> US */







|
<
<
<
<
<
<
<







24
25
26
27
28
29
30
31







32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */








#define EUROPIUM	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "

static const char shift_set[] = {
    /* From Table 7 - Encoding of control characters */
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* NULL -> SI */
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* DLE -> US */
Changes to jni/zint/backend/gs1.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "gs1.h"

/* This code does some checks on the integrity of GS1 data. It is not intended
   to be bulletproof, nor does it report very accurately what problem was found
   or where, but should prevent some of the more common encoding errors */

void itostr(char ai_string[], int ai_value) {
    int thou, hund, ten, unit;
    char temp[2];

    strcpy(ai_string, "(");
    thou = ai_value / 1000;
    hund = (ai_value - (1000 * thou)) / 100;
    ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10;







>














|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "gs1.h"

/* This code does some checks on the integrity of GS1 data. It is not intended
   to be bulletproof, nor does it report very accurately what problem was found
   or where, but should prevent some of the more common encoding errors */

static void itostr(char ai_string[], int ai_value) {
    int thou, hund, ten, unit;
    char temp[2];

    strcpy(ai_string, "(");
    thou = ai_value / 1000;
    hund = (ai_value - (1000 * thou)) / 100;
    ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10;
65
66
67
68
69
70
71
72
73
74
75
76
77















78
79
80
81
82
83
84




85
86
87
88
89
90
91
92
93
    temp[0] = itoc(ten);
    strcat(ai_string, temp);
    temp[0] = itoc(unit);
    strcat(ai_string, temp);
    strcat(ai_string, ")");
}

int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]) {
    int i, j, last_ai, ai_latch;
    char ai_string[6];
    int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length;
    int ai_value[100], ai_location[100], ai_count, data_location[100], data_length[100];
    int error_latch;
















    /* Detect extended ASCII characters */
    for (i = 0; i < src_len; i++) {
        if (source[i] >= 128) {
            strcpy(symbol->errtxt, "250: Extended ASCII characters are not supported by GS1");
            return ZINT_ERROR_INVALID_DATA;
        }




        if (source[i] < 32) {
            strcpy(symbol->errtxt, "251: Control characters are not supported by GS1 ");
            return ZINT_ERROR_INVALID_DATA;
        }
    }

    if (source[0] != '[') {
        strcpy(symbol->errtxt, "252: Data does not start with an AI");
        return ZINT_ERROR_INVALID_DATA;







|

|

|

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







>
>
>
>

|







66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
    temp[0] = itoc(ten);
    strcat(ai_string, temp);
    temp[0] = itoc(unit);
    strcat(ai_string, temp);
    strcat(ai_string, ")");
}

INTERNAL int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]) {
    int i, j, last_ai, ai_latch;
    char ai_string[7]; /* 6 char max "(NNNN)" */
    int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length;
    int ai_count;
    int error_latch;
#ifdef _MSC_VER
    int *ai_value;
    int *ai_location;
    int *data_location;
    int *data_length;
#endif
    int ai_max = ustrchr_cnt(source, src_len, '[') + 1; /* Plus 1 so non-zero */
#ifndef _MSC_VER
    int ai_value[ai_max], ai_location[ai_max], data_location[ai_max], data_length[ai_max];
#else
    ai_value = (int*) _alloca(ai_max * sizeof(int));
    ai_location = (int*) _alloca(ai_max * sizeof(int));
    data_location = (int*) _alloca(ai_max * sizeof(int));
    data_length = (int*) _alloca(ai_max * sizeof(int));
#endif

    /* Detect extended ASCII characters */
    for (i = 0; i < src_len; i++) {
        if (source[i] >= 128) {
            strcpy(symbol->errtxt, "250: Extended ASCII characters are not supported by GS1");
            return ZINT_ERROR_INVALID_DATA;
        }
        if (source[i] == '\0') {
            strcpy(symbol->errtxt, "262: NUL characters not permitted in GS1 mode");
            return ZINT_ERROR_INVALID_DATA;
        }
        if (source[i] < 32) {
            strcpy(symbol->errtxt, "251: Control characters are not supported by GS1");
            return ZINT_ERROR_INVALID_DATA;
        }
    }

    if (source[0] != '[') {
        strcpy(symbol->errtxt, "252: Data does not start with an AI");
        return ZINT_ERROR_INVALID_DATA;
220
221
222
223
224
225
226

227
228
229
230
231
232
233
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
                
            // Length 4 Fixed

            case 8111: // POINTS
                if (data_length[i] != 4) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;







>







240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
                
            // Length 4 Fixed
            case 7040: // UIC+EXT
            case 8111: // POINTS
                if (data_length[i] != 4) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
261
262
263
264
265
266
267

268
269
270
271
272
273
274
            case 410: // SHIP TO LOC
            case 411: // BILL TO
            case 412: // PURCHASE FROM
            case 413: // SHIP FOR LOC
            case 414: // LOC NO
            case 415: // PAY TO
            case 416: // PROD/SERV LOC

            case 7001: // NSN
                if (data_length[i] != 13) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;







>







282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
            case 410: // SHIP TO LOC
            case 411: // BILL TO
            case 412: // PURCHASE FROM
            case 413: // SHIP FOR LOC
            case 414: // LOC NO
            case 415: // PAY TO
            case 416: // PROD/SERV LOC
            case 417: // PARTY GLN
            case 7001: // NSN
                if (data_length[i] != 13) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
294
295
296
297
298
299
300

301
302
303
304
305
306
307
                break;
                
            // Length 18 Fixed
            case 0: // SSCC
            case 8006: // ITIP
            case 8017: // GSRN PROVIDER
            case 8018: // GSRN RECIPIENT

                if (data_length[i] != 18) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
                







>







316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
                break;
                
            // Length 18 Fixed
            case 0: // SSCC
            case 8006: // ITIP
            case 8017: // GSRN PROVIDER
            case 8018: // GSRN RECIPIENT
            case 8026: // ITIP CONTENT
                if (data_length[i] != 18) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
                
383
384
385
386
387
388
389

390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407









408
409
410
411
412
413
414
            case 7021: // FUNC STAT
            case 7022: // REV STAT
            case 710: // NHRN PZN
            case 711: // NHRN CIP
            case 712: // NHRN CN
            case 713: // NHRN DRN
            case 714: // NHRN AIM

            case 8002: // CMT NO
            case 8012: // VERSION
                if (data_length[i] > 20) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
                
            // Length 25 Max
            case 8020: // REF NO
                if (data_length[i] > 25) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
                









            // Length 30 Max
            case 240: // ADDITIONAL ID
            case 241: // CUST PART NO
            case 250: // SECONDARY SERIAL
            case 251: // REF TO SOURCE
            case 400: // ORDER NUMBER
            case 401: // GINC







>


















>
>
>
>
>
>
>
>
>







406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
            case 7021: // FUNC STAT
            case 7022: // REV STAT
            case 710: // NHRN PZN
            case 711: // NHRN CIP
            case 712: // NHRN CN
            case 713: // NHRN DRN
            case 714: // NHRN AIM
            case 7240: // PROTOCOL
            case 8002: // CMT NO
            case 8012: // VERSION
                if (data_length[i] > 20) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
                
            // Length 25 Max
            case 8020: // REF NO
                if (data_length[i] > 25) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;
                
            // Length 28 Max
            case 235: // TPX
                if (data_length[i] > 28) {
                    error_latch = 1;
                } else {
                    error_latch = 0;
                }
                break;

            // Length 30 Max
            case 240: // ADDITIONAL ID
            case 241: // CUST PART NO
            case 250: // SECONDARY SERIAL
            case 251: // REF TO SOURCE
            case 400: // ORDER NUMBER
            case 401: // GINC
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
                error_latch = 1;
            } else {
                error_latch = 0;
            }
        }
        
        if (ai_value[i] == 7007) { // HARVEST DATE
            if ((data_length[i] < 6) || (data_length[i] > 12)) {
                error_latch = 1;
            } else {
                error_latch = 0;
            }
        }
        
        if ((ai_value[i] >= 7030) && (ai_value[i] <= 7039)) { // PROCESSOR #







|







592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
                error_latch = 1;
            } else {
                error_latch = 0;
            }
        }
        
        if (ai_value[i] == 7007) { // HARVEST DATE
            if ((data_length[i] != 6) && (data_length[i] != 12)) {
                error_latch = 1;
            } else {
                error_latch = 0;
            }
        }
        
        if ((ai_value[i] >= 7030) && (ai_value[i] <= 7039)) { // PROCESSOR #
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
                error_latch = 1;
            } else {
                error_latch = 0;
            }
        }
        
        if (ai_value[i] == 8008) { // PROD TIME
            if ((data_length[i] < 9) || (data_length[i] > 12)) {
                error_latch = 1;
            } else {
                error_latch = 0;
            }
        }
        
        if ((ai_value[i] >= 91) && (ai_value[i] <= 99)) { // INTERNAL







|







624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
                error_latch = 1;
            } else {
                error_latch = 0;
            }
        }
        
        if (ai_value[i] == 8008) { // PROD TIME
            if ((data_length[i] != 8) && (data_length[i] != 10) && (data_length[i] != 12)) {
                error_latch = 1;
            } else {
                error_latch = 0;
            }
        }
        
        if ((ai_value[i] >= 91) && (ai_value[i] <= 99)) { // INTERNAL
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
        /* The ']' character is simply dropped from the input */
    }
    reduced[j] = '\0';

    /* the character '[' in the reduced string refers to the FNC1 character */
    return 0;
}

int ugs1_verify(struct zint_symbol *symbol, const unsigned char source[], const unsigned int src_len, unsigned char reduced[]) {
    /* Only to keep the compiler happy */
#ifndef _MSC_VER
    char temp[src_len + 5];
#else
    char* temp = (char*) _alloca(src_len + 5);
#endif
    int error_number;

    error_number = gs1_verify(symbol, source, src_len, temp);
    if (error_number != 0) {
        return error_number;
    }

    if (strlen(temp) < src_len + 5) {
        ustrcpy(reduced, (unsigned char*) temp);
        return 0;
    }
    strcpy(symbol->errtxt, "261: ugs1_verify overflow");
    return ZINT_ERROR_INVALID_DATA;
}








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
691
692
693
694
695
696
697























        /* The ']' character is simply dropped from the input */
    }
    reduced[j] = '\0';

    /* the character '[' in the reduced string refers to the FNC1 character */
    return 0;
}























Changes to jni/zint/backend/gs1.h.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#ifndef __GS1_H
#define __GS1_H

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

    extern int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]);
    extern int ugs1_verify(struct zint_symbol *symbol, const unsigned char source[], const unsigned int src_len, unsigned char reduced[]);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __GS1_H */







>








<






25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

41
42
43
44
45
46
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */
#ifndef __GS1_H
#define __GS1_H

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

    extern int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]);


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __GS1_H */
Changes to jni/zint/backend/hanxin.c.
1
2
3
4
5
6
7
8
9
10
11
/*  hanxin.c - Han Xin Code

    libzint - the open source barcode library
    Copyright (C) 2009-2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.



|







1
2
3
4
5
6
7
8
9
10
11
/*  hanxin.c - Han Xin Code

    libzint - the open source barcode library
    Copyright (C) 2009-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65























66
67
68
69
70
71

72
73
74







75
76
77
78
79
80
81
82
83
84



85
86
87

88
89

90
91

92








93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138


139
140
141
142
143
144
145
146
147
148
149
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* This code attempts to implement Han Xin Code according to AIMD-015:2010 (Rev 0.8) */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "reedsol.h"
#include "hanxin.h"
#include "gb2312.h"
#include "gb18030.h"
#include "assert.h"

/* Find which submode to use for a text character */
int getsubmode(char input) {
    int submode = 2;

    if ((input >= '0') && (input <= '9')) {
        submode = 1;
    }

    if ((input >= 'A') && (input <= 'Z')) {
        submode = 1;
    }

    if ((input >= 'a') && (input <= 'z')) {
        submode = 1;
    }

    return submode;
}
























/* Calculate the approximate length of the binary string */
static int calculate_binlength(char mode[], int source[], const size_t length, int eci) {
    size_t i;
    char lastmode = 't';
    int est_binlen = 0;
    int submode = 1;


    if (eci != 3) {
        est_binlen += 12;







    }

    i = 0;
    do {
        switch (mode[i]) {
            case 'n':
                if (lastmode != 'n') {
                    est_binlen += 14;
                    lastmode = 'n';
                }



                est_binlen += 4;
                break;
            case 't':

                if (lastmode != 't') {
                    est_binlen += 10;

                    lastmode = 't';
                    submode = 1;

                }








                if (getsubmode((char) source[i]) != submode) {
                    est_binlen += 6;
                    submode = getsubmode((char) source[i]);
                }
                est_binlen += 6;
                break;
            case 'b':
                if (lastmode != 'b') {
                    est_binlen += 17;
                    lastmode = 'b';
                }
                est_binlen += 8;
                break;
            case '1':
                if (lastmode != '1') {
                    est_binlen += 16;
                    lastmode = '1';
                }
                est_binlen += 12;
                break;
            case '2':
                if (lastmode != '2') {
                    est_binlen += 16;
                    lastmode = '2';
                }
                est_binlen += 12;
                break;
            case 'd':
                if (lastmode != 'd') {
                    est_binlen += 16;
                    lastmode = 'd';
                }
                est_binlen += 15;
                break;
            case 'f':
                if (lastmode != 'f') {
                    est_binlen += 4;
                    lastmode = 'f';
                }
                est_binlen += 21;
                i++;
                break;
        }
        i++;
    } while (i < length);



    return est_binlen;
}

int isRegion1(int glyph) {
    int first_byte, second_byte;
    int valid = 0;

    first_byte = (glyph & 0xff00) >> 8;
    second_byte = glyph & 0xff;

    if ((first_byte >= 0xb0) && (first_byte <= 0xd7)) {







>

|















|

















>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|

|


>

|
|
>
>
>
>
>
>
>




|
<
|
|
<
|
>
>
>

<
<
>
|
|
>
|
|
>
|
>
>
>
>
>
>
>
>
|

|




<
|
<
<
<


<
<
<
<
<
<

<
<
<
<



<
<
<
<



<
|
<
<
<






>
>



|







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

112
113

114
115
116
117
118


119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141

142



143
144






145




146
147
148




149
150
151

152



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* This code attempts to implement Han Xin Code according to ISO/IEC 20830 (draft 2019-10-10) (previously AIMD-015:2010 (Rev 0.8)) */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "reedsol.h"
#include "hanxin.h"
#include "gb2312.h"
#include "gb18030.h"
#include "assert.h"

/* Find which submode to use for a text character */
static int getsubmode(unsigned int input) {
    int submode = 2;

    if ((input >= '0') && (input <= '9')) {
        submode = 1;
    }

    if ((input >= 'A') && (input <= 'Z')) {
        submode = 1;
    }

    if ((input >= 'a') && (input <= 'z')) {
        submode = 1;
    }

    return submode;
}

/* Return length of terminator for encoding mode */
static int terminator_length(char mode) {
    int result = 0;

    switch (mode) {
        case 'n':
            result = 10;
            break;
        case 't':
            result = 6;
            break;
        case '1':
        case '2':
            result = 12;
            break;
        case 'd':
            result = 15;
            break;
    }

    return result;
}

/* Calculate the length of the binary string */
static int calculate_binlength(char mode[], unsigned int source[], const size_t length, int eci) {
    size_t i;
    char lastmode = '\0';
    int est_binlen = 0;
    int submode = 1;
    int numeric_run = 0;

    if (eci != 0) {
        est_binlen += 4;
        if (eci <= 127) {
            est_binlen += 8;
        } else if ((eci >= 128) && (eci <= 16383)) {
            est_binlen += 16;
        } else {
            est_binlen += 24;
        }
    }

    i = 0;
    do {
        if (mode[i] != lastmode) {

            if (i > 0) {
                est_binlen += terminator_length(lastmode);

            }
            /* GB 4-byte has indicator for each character (and no terminator) so not included here */
            /* Region1/Region2 have special terminator to go directly into each other's mode so not included here */
            if (mode[i] != 'f' || ((mode[i] == '1' && lastmode == '2') || (mode[i] == '2' && lastmode == '1'))) {
                est_binlen += 4;


            }
            if (mode[i] == 'b') { /* Byte mode has byte count (and no terminator) */
                est_binlen += 13;
            }
            lastmode = mode[i];
            submode = 1;
            numeric_run = 0;
        }
        switch (mode[i]) {
            case 'n':
                if (numeric_run % 3 == 0) {
                    est_binlen += 10;
                }
                numeric_run++;
                break;
            case 't':
                if (getsubmode(source[i]) != submode) {
                    est_binlen += 6;
                    submode = getsubmode(source[i]);
                }
                est_binlen += 6;
                break;
            case 'b':

                est_binlen += source[i] > 0xFF ? 16 : 8;



                break;
            case '1':






            case '2':




                est_binlen += 12;
                break;
            case 'd':




                est_binlen += 15;
                break;
            case 'f':

                est_binlen += 25;



                i++;
                break;
        }
        i++;
    } while (i < length);

    est_binlen += terminator_length(lastmode);

    return est_binlen;
}

static int isRegion1(unsigned int glyph) {
    int first_byte, second_byte;
    int valid = 0;

    first_byte = (glyph & 0xff00) >> 8;
    second_byte = glyph & 0xff;

    if ((first_byte >= 0xb0) && (first_byte <= 0xd7)) {
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
    if ((glyph >= 0xa8a1) && (glyph <= 0xa8c0)) {
        valid = 1;
    }

    return valid;
}

int isRegion2(int glyph) {
    int first_byte, second_byte;
    int valid = 0;

    first_byte = (glyph & 0xff00) >> 8;
    second_byte = glyph & 0xff;

    if ((first_byte >= 0xd8) && (first_byte <= 0xf7)) {
        if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) {
            valid = 1;
        }
    }

    return valid;
}

int isDoubleByte(int glyph) {
    int first_byte, second_byte;
    int valid = 0;

    first_byte = (glyph & 0xff00) >> 8;
    second_byte = glyph & 0xff;

    if ((first_byte >= 0x81) && (first_byte <= 0xfe)) {
        if ((second_byte >= 0x40) && (second_byte <= 0x7e)) {
            valid = 1;
        }

        if ((second_byte >= 0x80) && (second_byte <= 0xfe)) {
            valid = 1;
        }
    }

    return valid;
}

int isFourByte(int glyph, int glyph2) {
    int first_byte, second_byte;
    int third_byte, fourth_byte;
    int valid = 0;

    first_byte = (glyph & 0xff00) >> 8;
    second_byte = glyph & 0xff;
    third_byte = (glyph2 & 0xff00) >> 8;







|















|



















|







183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
    if ((glyph >= 0xa8a1) && (glyph <= 0xa8c0)) {
        valid = 1;
    }

    return valid;
}

static int isRegion2(unsigned int glyph) {
    int first_byte, second_byte;
    int valid = 0;

    first_byte = (glyph & 0xff00) >> 8;
    second_byte = glyph & 0xff;

    if ((first_byte >= 0xd8) && (first_byte <= 0xf7)) {
        if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) {
            valid = 1;
        }
    }

    return valid;
}

static int isDoubleByte(unsigned int glyph) {
    int first_byte, second_byte;
    int valid = 0;

    first_byte = (glyph & 0xff00) >> 8;
    second_byte = glyph & 0xff;

    if ((first_byte >= 0x81) && (first_byte <= 0xfe)) {
        if ((second_byte >= 0x40) && (second_byte <= 0x7e)) {
            valid = 1;
        }

        if ((second_byte >= 0x80) && (second_byte <= 0xfe)) {
            valid = 1;
        }
    }

    return valid;
}

static int isFourByte(unsigned int glyph, unsigned int glyph2) {
    int first_byte, second_byte;
    int third_byte, fourth_byte;
    int valid = 0;

    first_byte = (glyph & 0xff00) >> 8;
    second_byte = glyph & 0xff;
    third_byte = (glyph2 & 0xff00) >> 8;
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317




318
319
320
321
322
323
324
325
326
327
328
329






















































































































































330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356

357



358
359
360
361
362
363
364
365
366
367
368
369
370

371
372
373
374
375
376
377
            }
        }
    }

    return valid;
}

/* Calculate mode switching */
static void hx_define_mode(char mode[], int source[], const size_t length) {
    size_t i;
    char lastmode = 't';

    i = 0;
    do {
        int done = 0;

        if (isRegion1(source[i])) {
            mode[i] = '1';
            done = 1;
            i++;
        }

        if ((done == 0) && (isRegion2(source[i]))) {
            mode[i] = '2';
            done = 1;
            i++;
        }

        if ((done == 0) && (isDoubleByte(source[i]))) {
            mode[i] = 'd';
            done = 1;
            i++;
        }

        if ((done == 0) && (i < length - 1)) {
            if (isFourByte(source[i], source[i + 1])) {
                mode[i] = 'f';
                mode[i + 1] = 'f';
                done = 1;
                i += 2;
            }
        }

        if (done == 0) {
            if ((source[i] >= '0') && (source[i] <= '9')) {
                mode[i] = 'n';
                if (lastmode != 'n') {
                    lastmode = 'n';
                }
            } else {
                if ((source[i] <= 127) && ((source[i] <= 27) || (source[i] >= 32))) {
                    mode[i] = 't';
                    if (lastmode != 't') {
                        lastmode = 't';
                    }
                } else {
                    mode[i] = 'b';
                    if (lastmode != 'b') {
                        lastmode = 'b';
                    }
                }
            }
            i++;
        }
    } while (i < length);
    mode[length] = '\0';
}

/* Convert Text 1 sub-mode character to encoding value, as given in table 3 */
int lookup_text1(char input) {
    int encoding_value = 0;

    if ((input >= '0') && (input <= '9')) {
        encoding_value = input - '0';
    }

    if ((input >= 'A') && (input <= 'Z')) {
        encoding_value = input - 'A' + 10;
    }

    if ((input >= 'a') && (input <= 'z')) {
        encoding_value = input - 'a' + 36;
    }

    return encoding_value;
}

/* Convert Text 2 sub-mode character to encoding value, as given in table 4 */
int lookup_text2(char input) {
    int encoding_value = 0;

    if ((input >= 0) && (input <= 27)) {
        encoding_value = input;
    }

    if ((input >= ' ') && (input <= '/')) {
        encoding_value = input - ' ' + 28;
    }





    if ((input >= '[') && (input <= 96)) {
        encoding_value = input - '[' + 51;
    }

    if ((input >= '{') && (input <= 127)) {
        encoding_value = input - '{' + 57;
    }

    return encoding_value;
}























































































































































/* Convert input data to binary stream */
static void calculate_binary(char binary[], char mode[], int source[], const size_t length, const int eci, int debug) {
    int position = 0;
    int i, count, encoding_value;
    int first_byte, second_byte;
    int third_byte, fourth_byte;
    int glyph;
    int submode;

    if (eci != 3) {
        /* Encoding ECI assignment number, according to Table 5 */
        bin_append(8, 4, binary); // ECI
        if (eci <= 127) {
            bin_append(eci, 8, binary);
        }
        if ((eci >= 128) && (eci <= 16383)) {
            strcat(binary, "10");
            bin_append(eci, 14, binary);
        }
        if (eci >= 16384) {
            strcat(binary, "110");
            bin_append(eci, 21, binary);
        }
    }

    do {
        int block_length = 0;

        do {



            block_length++;
        } while (mode[position + block_length] == mode[position]);

        switch (mode[position]) {
            case 'n':
                /* Numeric mode */
                /* Mode indicator */
                bin_append(1, 4, binary);

                if (debug) {
                    printf("Numeric\n");
                }


                i = 0;

                while (i < block_length) {
                    int first = 0;

                    first = posn(NEON, (char) source[position + i]);
                    count = 1;







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
|

















|
|

|






>
>
>
>












>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|







|

















>

>
>
>

|







|



>







242
243
244
245
246
247
248





























































249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
            }
        }
    }

    return valid;
}






























































/* Convert Text 1 sub-mode character to encoding value, as given in table 3 */
static int lookup_text1(unsigned int input) {
    int encoding_value = -1;

    if ((input >= '0') && (input <= '9')) {
        encoding_value = input - '0';
    }

    if ((input >= 'A') && (input <= 'Z')) {
        encoding_value = input - 'A' + 10;
    }

    if ((input >= 'a') && (input <= 'z')) {
        encoding_value = input - 'a' + 36;
    }

    return encoding_value;
}

/* Convert Text 2 sub-mode character to encoding value, as given in table 4 */
static int lookup_text2(unsigned int input) {
    int encoding_value = -1;

    if (input <= 27) {
        encoding_value = input;
    }

    if ((input >= ' ') && (input <= '/')) {
        encoding_value = input - ' ' + 28;
    }

    if ((input >= ':') && (input <= '@')) {
        encoding_value = input - ':' + 44;
    }

    if ((input >= '[') && (input <= 96)) {
        encoding_value = input - '[' + 51;
    }

    if ((input >= '{') && (input <= 127)) {
        encoding_value = input - '{' + 57;
    }

    return encoding_value;
}

/* hx_define_mode() stuff */

/* Bits multiplied by this for costs, so as to be whole integer divisible by 2 and 3 */
#define HX_MULT 6

/* Whether in numeric or not. If in numeric, *p_end is set to position after numeric, and *p_cost is set to per-numeric cost */
static int in_numeric(const unsigned int gbdata[], const size_t length, const int posn, unsigned int* p_end, unsigned int* p_cost) {
    int i, digit_cnt;

    if (posn < *p_end) {
        return 1;
    }

    /* Attempt to calculate the average 'cost' of using numeric mode in number of bits (times HX_MULT) */
    for (i = posn; i < length && i < posn + 4 && gbdata[i] >= '0' && gbdata[i] <= '9'; i++);

    digit_cnt = i - posn;

    if (digit_cnt == 0) {
        *p_end = 0;
        return 0;
    }
    *p_end = i;
    *p_cost = digit_cnt == 1 ? 60 /* 10 * HX_MULT */ : digit_cnt == 2 ? 30 /* (10 / 2) * HX_MULT */ : 20 /* (10 / 3) * HX_MULT */;
    return 1;
}

/* Whether in four-byte or not. If in four-byte, *p_fourbyte is set to position after four-byte, and *p_fourbyte_cost is set to per-position cost */
static int in_fourbyte(const unsigned int gbdata[], const size_t length, const int posn, unsigned int* p_end, unsigned int* p_cost) {
    if (posn < *p_end) {
        return 1;
    }

    if (posn == length - 1 || !isFourByte(gbdata[posn], gbdata[posn + 1])) {
        *p_end = 0;
        return 0;
    }
    *p_end = posn + 2;
    *p_cost = 75; /* ((4 + 21) / 2) * HX_MULT */
    return 1;
}

/* Indexes into mode_types array */
#define HX_N   0 /* Numeric */
#define HX_T   1 /* Text */
#define HX_B   2 /* Binary */
#define HX_1   3 /* Common Chinese Region One */
#define HX_2   4 /* Common Chinese Region Two */
#define HX_D   5 /* GB 18030 2-byte Region */
#define HX_F   6 /* GB 18030 4-byte Region */
/* Note Unicode, GS1 and URI modes not implemented */

#define HX_NUM_MODES 7

/* Initial mode costs */
static unsigned int* hx_head_costs(unsigned int state[]) {
    static unsigned int head_costs[HX_NUM_MODES] = {
    /*  N            T            B                   1            2            D            F */
        4 * HX_MULT, 4 * HX_MULT, (4 + 13) * HX_MULT, 4 * HX_MULT, 4 * HX_MULT, 4 * HX_MULT, 0
    };

    return head_costs;
}

/* Cost of switching modes from k to j */
static unsigned int hx_switch_cost(unsigned int state[], const int k, const int j) {
    static const unsigned int switch_costs[HX_NUM_MODES][HX_NUM_MODES] = {
        /*      N                   T                   B                        1                   2                   D                   F */
        /*N*/ {                  0, (10 + 4) * HX_MULT, (10 + 4 + 13) * HX_MULT, (10 + 4) * HX_MULT, (10 + 4) * HX_MULT, (10 + 4) * HX_MULT, 10 * HX_MULT },
        /*T*/ {  (6 + 4) * HX_MULT,                  0,  (6 + 4 + 13) * HX_MULT,  (6 + 4) * HX_MULT,  (6 + 4) * HX_MULT,  (6 + 4) * HX_MULT,  6 * HX_MULT },
        /*B*/ {        4 * HX_MULT,        4 * HX_MULT,                       0,        4 * HX_MULT,        4 * HX_MULT,        4 * HX_MULT,  0 },
        /*1*/ { (12 + 4) * HX_MULT, (12 + 4) * HX_MULT, (12 + 4 + 13) * HX_MULT,                  0,       12 * HX_MULT, (12 + 4) * HX_MULT, 12 * HX_MULT },
        /*2*/ { (12 + 4) * HX_MULT, (12 + 4) * HX_MULT, (12 + 4 + 13) * HX_MULT,       12 * HX_MULT,                  0, (12 + 4) * HX_MULT, 12 * HX_MULT },
        /*D*/ { (15 + 4) * HX_MULT, (15 + 4) * HX_MULT, (15 + 4 + 13) * HX_MULT, (15 + 4) * HX_MULT, (15 + 4) * HX_MULT,                  0, 15 * HX_MULT },
        /*F*/ {        4 * HX_MULT,        4 * HX_MULT,      (4 + 13) * HX_MULT,        4 * HX_MULT,        4 * HX_MULT,        4 * HX_MULT,  0 },
    };

    return switch_costs[k][j];
}

/* Final end-of-data costs */
static unsigned int hx_eod_cost(unsigned int state[], const int k) {
    static const unsigned int eod_costs[HX_NUM_MODES] = {
    /*  N             T            B  1             2             D             F */
        10 * HX_MULT, 6 * HX_MULT, 0, 12 * HX_MULT, 12 * HX_MULT, 15 * HX_MULT, 0
    };

    return eod_costs[k];
}

/* Calculate cost of encoding character */
static void hx_cur_cost(unsigned int state[], const unsigned int gbdata[], const size_t length, const int i, char* char_modes, unsigned int prev_costs[], unsigned int cur_costs[]) {
    int cm_i = i * HX_NUM_MODES;
    int text1, text2;
    unsigned int* p_numeric_end = &state[0];
    unsigned int* p_numeric_cost = &state[1];
    unsigned int* p_text_submode = &state[2];
    unsigned int* p_fourbyte_end = &state[3];
    unsigned int* p_fourbyte_cost = &state[4];

    if (in_numeric(gbdata, length, i, p_numeric_end, p_numeric_cost)) {
        cur_costs[HX_N] = prev_costs[HX_N] + *p_numeric_cost;
        char_modes[cm_i + HX_N] = 'n';
    }

    text1 = lookup_text1(gbdata[i]) != -1;
    text2 = lookup_text2(gbdata[i]) != -1;

    if (text1 || text2) {
        if ((*p_text_submode == 1 && text2) || (*p_text_submode == 2 && text1)) {
            cur_costs[HX_T] = prev_costs[HX_T] + 72; /* (6 + 6) * HX_MULT */
            *p_text_submode = text2 ? 2 : 1;
        } else {
            cur_costs[HX_T] = prev_costs[HX_T] + 36; /* 6 * HX_MULT */
        }
        char_modes[cm_i + HX_T] = 't';
    } else {
        *p_text_submode = 1;
    }

    /* Binary mode can encode anything */
    cur_costs[HX_B] = prev_costs[HX_B] + (gbdata[i] > 0xFF ? 96 : 48); /* (16 : 8) * HX_MULT */
    char_modes[cm_i + HX_B] = 'b';

    if (isRegion1(gbdata[i])) {
        cur_costs[HX_1] = prev_costs[HX_1] + 72; /* 12 * HX_MULT */
        char_modes[cm_i + HX_1] = '1';
    }
    if (isRegion2(gbdata[i])) {
        cur_costs[HX_2] = prev_costs[HX_2] + 72; /* 12 * HX_MULT */
        char_modes[cm_i + HX_2] = '2';
    }
    if (isDoubleByte(gbdata[i])) {
        cur_costs[HX_D] = prev_costs[HX_D] + 90; /* 15 * HX_MULT */
        char_modes[cm_i + HX_D] = 'd';
    }
    if (in_fourbyte(gbdata, length, i, p_fourbyte_end, p_fourbyte_cost)) {
        cur_costs[HX_F] = prev_costs[HX_F] + *p_fourbyte_cost;
        char_modes[cm_i + HX_F] = 'f';
    }
}

/* Calculate optimized encoding modes */
static void hx_define_mode(char* mode, const unsigned int gbdata[], const size_t length, const int debug) {
    static const char mode_types[] = { 'n', 't', 'b', '1', '2', 'd', 'f' }; /* Must be in same order as HX_N etc */
    unsigned int state[5] = { 0 /*numeric_end*/, 0 /*numeric_cost*/, 1 /*text_submode*/, 0 /*fourbyte_end*/, 0 /*fourbyte_cost*/ };

    pn_define_mode(mode, gbdata, length, debug, state, mode_types, HX_NUM_MODES, hx_head_costs, hx_switch_cost, hx_eod_cost, hx_cur_cost);
}

/* Convert input data to binary stream */
static void calculate_binary(char binary[], char mode[], unsigned int source[], const size_t length, const int eci, int debug) {
    int position = 0;
    int i, count, encoding_value;
    int first_byte, second_byte;
    int third_byte, fourth_byte;
    int glyph;
    int submode;

    if (eci != 0) {
        /* Encoding ECI assignment number, according to Table 5 */
        bin_append(8, 4, binary); // ECI
        if (eci <= 127) {
            bin_append(eci, 8, binary);
        }
        if ((eci >= 128) && (eci <= 16383)) {
            strcat(binary, "10");
            bin_append(eci, 14, binary);
        }
        if (eci >= 16384) {
            strcat(binary, "110");
            bin_append(eci, 21, binary);
        }
    }

    do {
        int block_length = 0;
        int double_byte = 0;
        do {
            if (mode[position] == 'b' && source[position + block_length] > 0xFF) {
                double_byte++;
            }
            block_length++;
        } while (position + block_length < length && mode[position + block_length] == mode[position]);

        switch (mode[position]) {
            case 'n':
                /* Numeric mode */
                /* Mode indicator */
                bin_append(1, 4, binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Numeric\n");
                }

                count = 0; /* Suppress gcc -Wmaybe-uninitialized */
                i = 0;

                while (i < block_length) {
                    int first = 0;

                    first = posn(NEON, (char) source[position + i]);
                    count = 1;
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498

499
500

501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544

545
546

547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
                            count = 3;
                            encoding_value = (encoding_value * 10) + third;
                        }
                    }

                    bin_append(encoding_value, 10, binary);

                    if (debug) {
                        printf("0x%4x (%d)", encoding_value, encoding_value);
                    }

                    i += count;
                }

                /* Mode terminator depends on number of characters in last group (Table 2) */
                switch (count) {
                    case 1:
                        bin_append(1021, 10, binary);
                        break;
                    case 2:
                        bin_append(1022, 10, binary);
                        break;
                    case 3:
                        bin_append(1023, 10, binary);
                        break;
                }

                if (debug) {
                    printf(" (TERM %d)\n", count);
                }

                break;
            case 't':
                /* Text mode */
                if (position != 0) {
                    /* Mode indicator */
                    bin_append(2, 4, binary);

                    if (debug) {
                        printf("Text\n");
                    }
                }

                submode = 1;

                i = 0;

                while (i < block_length) {

                    if (getsubmode((char) source[i + position]) != submode) {
                        /* Change submode */
                        bin_append(62, 6, binary);
                        submode = getsubmode((char) source[i + position]);
                        if (debug) {
                            printf("SWITCH ");
                        }
                    }

                    if (submode == 1) {
                        encoding_value = lookup_text1((char) source[i + position]);
                    } else {
                        encoding_value = lookup_text2((char) source[i + position]);
                    }

                    bin_append(encoding_value, 6, binary);

                    if (debug) {
                        printf("%c (%d) ", (char) source[i], encoding_value);
                    }
                    i++;
                }

                /* Terminator */
                bin_append(63, 6, binary);

                if (debug) {
                    printf("\n");
                }
                break;
            case 'b':
                /* Binary Mode */
                /* Mode indicator */
                bin_append(3, 4, binary);

                /* Count indicator */
                bin_append(block_length, 13, binary);

                if (debug) {
                    printf("Binary (length %d)\n", block_length);
                }

                i = 0;

                while (i < block_length) {

                    /* 8-bit bytes with no conversion */
                    bin_append(source[i + position], 8, binary);

                    if (debug) {
                        printf("%d ", source[i + position]);
                    }

                    i++;
                }

                if (debug) {
                    printf("\n");
                }
                break;
            case '1':
                /* Region 1 encoding */
                /* Mode indicator */

                bin_append(4, 4, binary);


                if (debug) {
                    printf("Region 1\n");
                }

                i = 0;

                while (i < block_length) {
                    first_byte = (source[i + position] & 0xff00) >> 8;
                    second_byte = source[i + position] & 0xff;

                    /* Subset 1 */
                    glyph = (0x5e * (first_byte - 0xb0)) + (second_byte - 0xa1);

                    /* Subset 2 */
                    if ((first_byte >= 0xa1) && (first_byte <= 0xa3)) {
                        if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) {
                            glyph = (0x5e * first_byte - 0xa1) + (second_byte - 0xa1) + 0xeb0;
                        }
                    }

                    /* Subset 3 */
                    if ((source[i + position] >= 0xa8a1) && (source[i + position] <= 0xa8c0)) {
                        glyph = (second_byte - 0xa1) + 0xfca;
                    }

                    if (debug) {
                        printf("%d ", glyph);
                    }

                    bin_append(glyph, 12, binary);
                    i++;
                }

                /* Terminator */
                bin_append(4095, 12, binary);

                if (debug) {
                    printf("\n");
                }

                break;
            case '2':
                /* Region 2 encoding */
                /* Mode indicator */

                bin_append(5, 4, binary);


                if (debug) {
                    printf("Region 2\n");
                }

                i = 0;

                while (i < block_length) {
                    first_byte = (source[i + position] & 0xff00) >> 8;
                    second_byte = source[i + position] & 0xff;

                    glyph = (0x5e * (first_byte - 0xd8)) + (second_byte - 0xa1);

                    if (debug) {
                        printf("%d ", glyph);
                    }

                    bin_append(glyph, 12, binary);
                    i++;
                }

                /* Terminator */
                bin_append(4095, 12, binary);

                if (debug) {
                    printf("\n");
                }
                break;
            case 'd':
                /* Double byte encoding */
                /* Mode indicator */
                bin_append(6, 4, binary);

                if (debug) {
                    printf("Double byte\n");
                }

                i = 0;

                while (i < block_length) {
                    first_byte = (source[i + position] & 0xff00) >> 8;
                    second_byte = source[i + position] & 0xff;

                    if (second_byte <= 0x7e) {
                        glyph = (0xbe * (first_byte - 0x81)) + (second_byte - 0x40);
                    } else {
                        glyph = (0xbe * (first_byte - 0x81)) + (second_byte - 0x41);
                    }

                    if (debug) {
                        printf("%d ", glyph);
                    }

                    bin_append(glyph, 15, binary);
                    i++;
                }

                /* Terminator */
                bin_append(32767, 15, binary);
                /* Terminator sequence of length 12 is a mistake
                   - confirmed by Wang Yi */

                if (debug) {
                    printf("\n");
                }
                break;
            case 'f':
                /* Four-byte encoding */
                if (debug) {
                    printf("Four byte\n");
                }

                i = 0;

                while (i < block_length) {

                    /* Mode indicator */
                    bin_append(7, 4, binary);

                    first_byte = (source[i + position] & 0xff00) >> 8;
                    second_byte = source[i + position] & 0xff;
                    third_byte = (source[i + position + 1] & 0xff00) >> 8;
                    fourth_byte = source[i + position + 1] & 0xff;

                    glyph = (0x3138 * (first_byte - 0x81)) + (0x04ec * (second_byte - 0x30)) +
                            (0x0a * (third_byte - 0x81)) + (fourth_byte - 0x30);

                    if (debug) {
                        printf("%d ", glyph);
                    }

                    bin_append(glyph, 15, binary);
                    i += 2;
                }

                /* No terminator */

                if (debug) {
                    printf("\n");
                }
                break;

        }

        position += block_length;

    } while (position < length);
}

/* Finder pattern for top left of symbol */
void hx_place_finder_top_left(unsigned char* grid, int size) {
    int xp, yp;
    int x = 0, y = 0;
    char finder[] = {0x7F, 0x40, 0x5F, 0x50, 0x57, 0x57, 0x57};

    for (xp = 0; xp < 7; xp++) {
        for (yp = 0; yp < 7; yp++) {
            if (finder[yp] & 0x40 >> xp) {
                grid[((yp + y) * size) + (xp + x)] = 0x11;
            } else {
                grid[((yp + y) * size) + (xp + x)] = 0x10;
            }
        }
    }
}

/* Finder pattern for top right and bottom left of symbol */
void hx_place_finder(unsigned char* grid, int size, int x, int y) {
    int xp, yp;
    char finder[] = {0x7F, 0x01, 0x7D, 0x05, 0x75, 0x75, 0x75};

    for (xp = 0; xp < 7; xp++) {
        for (yp = 0; yp < 7; yp++) {
            if (finder[yp] & 0x40 >> xp) {
                grid[((yp + y) * size) + (xp + x)] = 0x11;
            } else {
                grid[((yp + y) * size) + (xp + x)] = 0x10;
            }
        }
    }
}

/* Finder pattern for bottom right of symbol */
void hx_place_finder_bottom_right(unsigned char* grid, int size) {
    int xp, yp;
    int x = size - 7, y = size - 7;
    char finder[] = {0x75, 0x75, 0x75, 0x05, 0x7D, 0x01, 0x7F};

    for (xp = 0; xp < 7; xp++) {
        for (yp = 0; yp < 7; yp++) {
            if (finder[yp] & 0x40 >> xp) {
                grid[((yp + y) * size) + (xp + x)] = 0x11;
            } else {
                grid[((yp + y) * size) + (xp + x)] = 0x10;
            }
        }
    }
}

/* Avoid plotting outside symbol or over finder patterns */
void hx_safe_plot(unsigned char *grid, int size, int x, int y, int value) {
    if ((x >= 0) && (x < size)) {
        if ((y >= 0) && (y < size)) {
            if (grid[(y * size) + x] == 0) {
                grid[(y * size) + x] = value;
            }
        }
    }
}

/* Plot an alignment pattern around top and right of a module */
void hx_plot_alignment(unsigned char *grid, int size, int x, int y, int w, int h) {
    int i;
    hx_safe_plot(grid, size, x, y, 0x11);
    hx_safe_plot(grid, size, x - 1, y + 1, 0x10);

    for (i = 1; i <= w; i++) {
        /* Top */
        hx_safe_plot(grid, size, x - i, y, 0x11);
        hx_safe_plot(grid, size, x - i - 1, y + 1, 0x10);
    }

    for (i = 1; i < h; i++) {
        /* Right */
        hx_safe_plot(grid, size, x, y + i, 0x11);
        hx_safe_plot(grid, size, x - 1, y + i + 1, 0x10);
    }
}

/* Plot assistant alignment patterns */
void hx_plot_assistant(unsigned char *grid, int size, int x, int y) {
    hx_safe_plot(grid, size, x - 1, y - 1, 0x10);
    hx_safe_plot(grid, size, x, y - 1, 0x10);
    hx_safe_plot(grid, size, x + 1, y - 1, 0x10);
    hx_safe_plot(grid, size, x - 1, y, 0x10);
    hx_safe_plot(grid, size, x, y, 0x11);
    hx_safe_plot(grid, size, x + 1, y, 0x10);
    hx_safe_plot(grid, size, x - 1, y + 1, 0x10);
    hx_safe_plot(grid, size, x, y + 1, 0x10);
    hx_safe_plot(grid, size, x + 1, y + 1, 0x10);
}

/* Put static elements in the grid */
void hx_setup_grid(unsigned char* grid, int size, int version) {
    int i, j;

    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            grid[(i * size) + j] = 0;
        }
    }







|



















|






<
|
|

|
|
<








|


|
|





|

|




|
|







|









|

|
|







|

|






|






>
|
|
>
|















|








|
|







|

|







>
|
|
>
|











|
|







|

|








|















|
|











|





|


















|



|





|












|
















|















|
















|










|


















|












|







507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540

541
542
543
544
545

546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
                            count = 3;
                            encoding_value = (encoding_value * 10) + third;
                        }
                    }

                    bin_append(encoding_value, 10, binary);

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("0x%4x (%d)", encoding_value, encoding_value);
                    }

                    i += count;
                }

                /* Mode terminator depends on number of characters in last group (Table 2) */
                switch (count) {
                    case 1:
                        bin_append(1021, 10, binary);
                        break;
                    case 2:
                        bin_append(1022, 10, binary);
                        break;
                    case 3:
                        bin_append(1023, 10, binary);
                        break;
                }

                if (debug & ZINT_DEBUG_PRINT) {
                    printf(" (TERM %d)\n", count);
                }

                break;
            case 't':
                /* Text mode */

                /* Mode indicator */
                bin_append(2, 4, binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Text\n");

                }

                submode = 1;

                i = 0;

                while (i < block_length) {

                    if (getsubmode(source[i + position]) != submode) {
                        /* Change submode */
                        bin_append(62, 6, binary);
                        submode = getsubmode(source[i + position]);
                        if (debug & ZINT_DEBUG_PRINT) {
                            printf("SWITCH ");
                        }
                    }

                    if (submode == 1) {
                        encoding_value = lookup_text1(source[i + position]);
                    } else {
                        encoding_value = lookup_text2(source[i + position]);
                    }

                    bin_append(encoding_value, 6, binary);

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("%.2x [ASC %.2x] ", encoding_value, source[i + position]);
                    }
                    i++;
                }

                /* Terminator */
                bin_append(63, 6, binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }
                break;
            case 'b':
                /* Binary Mode */
                /* Mode indicator */
                bin_append(3, 4, binary);

                /* Count indicator */
                bin_append(block_length + double_byte, 13, binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Binary (length %d)\n", block_length + double_byte);
                }

                i = 0;

                while (i < block_length) {

                    /* 8-bit bytes with no conversion */
                    bin_append(source[i + position], source[i + position] > 0xFF ? 16 : 8, binary);

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("%d ", source[i + position]);
                    }

                    i++;
                }

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }
                break;
            case '1':
                /* Region 1 encoding */
                /* Mode indicator */
                if (position == 0 || mode[position - 1] != '2') { /* Unless previous mode Region 2 */
                    bin_append(4, 4, binary);
                }

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Region 1\n");
                }

                i = 0;

                while (i < block_length) {
                    first_byte = (source[i + position] & 0xff00) >> 8;
                    second_byte = source[i + position] & 0xff;

                    /* Subset 1 */
                    glyph = (0x5e * (first_byte - 0xb0)) + (second_byte - 0xa1);

                    /* Subset 2 */
                    if ((first_byte >= 0xa1) && (first_byte <= 0xa3)) {
                        if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) {
                            glyph = (0x5e * (first_byte - 0xa1)) + (second_byte - 0xa1) + 0xeb0;
                        }
                    }

                    /* Subset 3 */
                    if ((source[i + position] >= 0xa8a1) && (source[i + position] <= 0xa8c0)) {
                        glyph = (second_byte - 0xa1) + 0xfca;
                    }

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("%.4x [GB %.4x] ", glyph, source[i + position]);
                    }

                    bin_append(glyph, 12, binary);
                    i++;
                }

                /* Terminator */
                bin_append(position == length - 1 || mode[position + 1] != '2' ? 4095 : 4094, 12, binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }

                break;
            case '2':
                /* Region 2 encoding */
                /* Mode indicator */
                if (position == 0 || mode[position - 1] != '1') { /* Unless previous mode Region 1 */
                    bin_append(5, 4, binary);
                }

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Region 2\n");
                }

                i = 0;

                while (i < block_length) {
                    first_byte = (source[i + position] & 0xff00) >> 8;
                    second_byte = source[i + position] & 0xff;

                    glyph = (0x5e * (first_byte - 0xd8)) + (second_byte - 0xa1);

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("%.4x [GB %.4x] ", glyph, source[i + position]);
                    }

                    bin_append(glyph, 12, binary);
                    i++;
                }

                /* Terminator */
                bin_append(position == length - 1 || mode[position + 1] != '1' ? 4095 : 4094, 12, binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }
                break;
            case 'd':
                /* Double byte encoding */
                /* Mode indicator */
                bin_append(6, 4, binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Double byte\n");
                }

                i = 0;

                while (i < block_length) {
                    first_byte = (source[i + position] & 0xff00) >> 8;
                    second_byte = source[i + position] & 0xff;

                    if (second_byte <= 0x7e) {
                        glyph = (0xbe * (first_byte - 0x81)) + (second_byte - 0x40);
                    } else {
                        glyph = (0xbe * (first_byte - 0x81)) + (second_byte - 0x41);
                    }

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("%.4x ", glyph);
                    }

                    bin_append(glyph, 15, binary);
                    i++;
                }

                /* Terminator */
                bin_append(32767, 15, binary);
                /* Terminator sequence of length 12 is a mistake
                   - confirmed by Wang Yi */

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }
                break;
            case 'f':
                /* Four-byte encoding */
                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Four byte\n");
                }

                i = 0;

                while (i < block_length) {

                    /* Mode indicator */
                    bin_append(7, 4, binary);

                    first_byte = (source[i + position] & 0xff00) >> 8;
                    second_byte = source[i + position] & 0xff;
                    third_byte = (source[i + position + 1] & 0xff00) >> 8;
                    fourth_byte = source[i + position + 1] & 0xff;

                    glyph = (0x3138 * (first_byte - 0x81)) + (0x04ec * (second_byte - 0x30)) +
                            (0x0a * (third_byte - 0x81)) + (fourth_byte - 0x30);

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("%d ", glyph);
                    }

                    bin_append(glyph, 21, binary);
                    i += 2;
                }

                /* No terminator */

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }
                break;

        }

        position += block_length;

    } while (position < length);
}

/* Finder pattern for top left of symbol */
static void hx_place_finder_top_left(unsigned char* grid, int size) {
    int xp, yp;
    int x = 0, y = 0;
    char finder[] = {0x7F, 0x40, 0x5F, 0x50, 0x57, 0x57, 0x57};

    for (xp = 0; xp < 7; xp++) {
        for (yp = 0; yp < 7; yp++) {
            if (finder[yp] & 0x40 >> xp) {
                grid[((yp + y) * size) + (xp + x)] = 0x11;
            } else {
                grid[((yp + y) * size) + (xp + x)] = 0x10;
            }
        }
    }
}

/* Finder pattern for top right and bottom left of symbol */
static void hx_place_finder(unsigned char* grid, int size, int x, int y) {
    int xp, yp;
    char finder[] = {0x7F, 0x01, 0x7D, 0x05, 0x75, 0x75, 0x75};

    for (xp = 0; xp < 7; xp++) {
        for (yp = 0; yp < 7; yp++) {
            if (finder[yp] & 0x40 >> xp) {
                grid[((yp + y) * size) + (xp + x)] = 0x11;
            } else {
                grid[((yp + y) * size) + (xp + x)] = 0x10;
            }
        }
    }
}

/* Finder pattern for bottom right of symbol */
static void hx_place_finder_bottom_right(unsigned char* grid, int size) {
    int xp, yp;
    int x = size - 7, y = size - 7;
    char finder[] = {0x75, 0x75, 0x75, 0x05, 0x7D, 0x01, 0x7F};

    for (xp = 0; xp < 7; xp++) {
        for (yp = 0; yp < 7; yp++) {
            if (finder[yp] & 0x40 >> xp) {
                grid[((yp + y) * size) + (xp + x)] = 0x11;
            } else {
                grid[((yp + y) * size) + (xp + x)] = 0x10;
            }
        }
    }
}

/* Avoid plotting outside symbol or over finder patterns */
static void hx_safe_plot(unsigned char *grid, int size, int x, int y, int value) {
    if ((x >= 0) && (x < size)) {
        if ((y >= 0) && (y < size)) {
            if (grid[(y * size) + x] == 0) {
                grid[(y * size) + x] = value;
            }
        }
    }
}

/* Plot an alignment pattern around top and right of a module */
static void hx_plot_alignment(unsigned char *grid, int size, int x, int y, int w, int h) {
    int i;
    hx_safe_plot(grid, size, x, y, 0x11);
    hx_safe_plot(grid, size, x - 1, y + 1, 0x10);

    for (i = 1; i <= w; i++) {
        /* Top */
        hx_safe_plot(grid, size, x - i, y, 0x11);
        hx_safe_plot(grid, size, x - i - 1, y + 1, 0x10);
    }

    for (i = 1; i < h; i++) {
        /* Right */
        hx_safe_plot(grid, size, x, y + i, 0x11);
        hx_safe_plot(grid, size, x - 1, y + i + 1, 0x10);
    }
}

/* Plot assistant alignment patterns */
static void hx_plot_assistant(unsigned char *grid, int size, int x, int y) {
    hx_safe_plot(grid, size, x - 1, y - 1, 0x10);
    hx_safe_plot(grid, size, x, y - 1, 0x10);
    hx_safe_plot(grid, size, x + 1, y - 1, 0x10);
    hx_safe_plot(grid, size, x - 1, y, 0x10);
    hx_safe_plot(grid, size, x, y, 0x11);
    hx_safe_plot(grid, size, x + 1, y, 0x10);
    hx_safe_plot(grid, size, x - 1, y + 1, 0x10);
    hx_safe_plot(grid, size, x, y + 1, 0x10);
    hx_safe_plot(grid, size, x + 1, y + 1, 0x10);
}

/* Put static elements in the grid */
static void hx_setup_grid(unsigned char* grid, int size, int version) {
    int i, j;

    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            grid[(i * size) + j] = 0;
        }
    }
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973


974
975
976
977
978
979
980
981
982
983
984
985



986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031



1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079

1080
1081
1082
1083
1084

1085
1086
1087
1088
1089
1090
1091
1092









1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112









1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124

1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
            mod_y++;
            y += module_height;
        } while (y < size);
    }
}

/* Calculate error correction codes */
void hx_add_ecc(unsigned char fullstream[], unsigned char datastream[], int version, int ecc_level) {
    unsigned char data_block[180];
    unsigned char ecc_block[36];
    int i, j, block;
    int input_position = -1;
    int output_position = -1;
    int table_d1_pos = ((version - 1) * 36) + ((ecc_level - 1) * 9);

    for (i = 0; i < 3; i++) {
        int batch_size = hx_table_d1[table_d1_pos + (3 * i)];
        int data_length = hx_table_d1[table_d1_pos + (3 * i) + 1];
        int ecc_length = hx_table_d1[table_d1_pos + (3 * i) + 2];

        for (block = 0; block < batch_size; block++) {
            for (j = 0; j < data_length; j++) {
                input_position++;
                output_position++;
                data_block[j] = datastream[input_position];
                fullstream[output_position] = datastream[input_position];
            }

            rs_init_gf(0x163); // x^8 + x^6 + x^5 + x + 1 = 0
            rs_init_code(ecc_length, 1);
            rs_encode(data_length, data_block, ecc_block);
            rs_free();

            for (j = 0; j < ecc_length; j++) {
                output_position++;
                fullstream[output_position] = ecc_block[ecc_length - j - 1];
            }
        }
    }
}

/* Rearrange data in batches of 13 codewords (section 5.8.2) */
void make_picket_fence(unsigned char fullstream[], unsigned char picket_fence[], int streamsize) {
    int i, start;
    int output_position = 0;

    for (start = 0; start < 13; start++) {
        for (i = start; i < streamsize; i += 13) {
            if (i < streamsize) {
                picket_fence[output_position] = fullstream[i];
                output_position++;
            }
        }
    }
}

/* Evaluate a bitmask according to table 9 */
int hx_evaluate(unsigned char *eval, int size, int pattern) {
    int x, y, block, weight;
    int result = 0;
    char state;
    int p;
    int a, b, afterCount, beforeCount;
#ifndef _MSC_VER
    char local[size * size];
#else
    char* local = (char *) _alloca((size * size) * sizeof (char));
#endif

    /* all four bitmask variants have been encoded in the 4 bits of the bytes
     * that make up the grid array. select them for evaluation according to the
     * desired pattern.*/
    for (x = 0; x < size; x++) {
        for (y = 0; y < size; y++) {


            if ((eval[(y * size) + x] & (0x01 << pattern)) != 0) {
                local[(y * size) + x] = '1';
            } else {
                local[(y * size) + x] = '0';
            }
        }
    }

    /* Test 1: 1:1:1:1:3  or 3:1:1:1:1 ratio pattern in row/column */
    /* Vertical */
    for (x = 0; x < size; x++) {
        for (y = 0; y < (size - 7); y++) {



            p = 0;
            for (weight = 0; weight < 7; weight++) {
                if (local[((y + weight) * size) + x] == '1') {
                    p += (0x40 >> weight);
                }
            }
            if ((p == 0x57) || (p == 0x75)) {
                /* Pattern found, check before and after */
                beforeCount = 0;
                for (b = (y - 3); b < y; b++) {
                    if (b < 0) {
                        beforeCount++;
                    } else {
                        if (local[(b * size) + x] == '0') {
                            beforeCount++;
                        } else {
                            beforeCount = 0;
                        }
                    }
                }

                afterCount = 0;
                for (a = (y + 7); a <= (y + 9); a++) {
                    if (a >= size) {
                        afterCount++;
                    } else {
                        if (local[(a * size) + x] == '0') {
                            afterCount++;
                        } else {
                            afterCount = 0;
                        }
                    }
                }

                if ((beforeCount == 3) || (afterCount == 3)) {
                    /* Pattern is preceeded or followed by light area
                       3 modules wide */
                    result += 50;
                }
            }
        }
    }

    /* Horizontal */
    for (y = 0; y < size; y++) {
        for (x = 0; x < (size - 7); x++) {



            p = 0;
            for (weight = 0; weight < 7; weight++) {
                if (local[(y * size) + x + weight] == '1') {
                    p += (0x40 >> weight);
                }
            }
            if ((p == 0x57) || (p == 0x75)) {
                /* Pattern found, check before and after */
                beforeCount = 0;
                for (b = (x - 3); b < x; b++) {
                    if (b < 0) {
                        beforeCount++;
                    } else {
                        if (local[(y * size) + b] == '0') {
                            beforeCount++;
                        } else {
                            beforeCount = 0;
                        }
                    }
                }

                afterCount = 0;
                for (a = (x + 7); a <= (x + 9); a++) {
                    if (a >= size) {
                        afterCount++;
                    } else {
                        if (local[(y * size) + a] == '0') {
                            afterCount++;
                        } else {
                            afterCount = 0;
                        }
                    }
                }

                if ((beforeCount == 3) || (afterCount == 3)) {
                    /* Pattern is preceeded or followed by light area
                       3 modules wide */
                    result += 50;
                }
            }
        }
    }

    /* Test 2: Adjacent modules in row/column in same colour */
    /* In AIMD-15 section 5.8.3.2 it is stated... “In Table 9 below, i refers to the row
     * position of the module.†- however i being the length of the run of the
     * same colour (i.e. "block" below) in the same fashion as ISO/IEC 18004
     * makes more sense. -- Confirmed by Wang Yi */


    /* Vertical */
    for (x = 0; x < size; x++) {
        state = local[x];
        block = 0;

        for (y = 0; y < size; y++) {
            if (local[(y * size) + x] == state) {
                block++;
            } else {
                if (block > 3) {
                    result += (3 + block) * 4;
                }
                block = 0;









                state = local[(y * size) + x];
            }
        }
        if (block > 3) {
            result += (3 + block) * 4;
        }
    }

    /* Horizontal */
    for (y = 0; y < size; y++) {
        state = local[y * size];
        block = 0;
        for (x = 0; x < size; x++) {
            if (local[(y * size) + x] == state) {
                block++;
            } else {
                if (block > 3) {
                    result += (3 + block) * 4;
                }
                block = 0;









                state = local[(y * size) + x];
            }
        }
        if (block > 3) {
            result += (3 + block) * 4;
        }
    }

    return result;
}

/* Apply the four possible bitmasks for evaluation */

int hx_apply_bitmask(unsigned char *grid, int size) {
    int x, y;
    int i, j;
    int pattern, penalty[4];
    int best_pattern, best_val;
    int bit;
    unsigned char p;

#ifndef _MSC_VER
    unsigned char mask[size * size];
    unsigned char eval[size * size];
#else
    unsigned char* mask = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
    unsigned char* eval = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
#endif

    /* Perform data masking */
    for (x = 0; x < size; x++) {







|
















|
|
















|














|
















>
>
|











>
>
>
















|












|
















>
>
>
















|












|


















>



<

>

|
<
<
|



>
>
>
>
>
>
>
>
>



|









|
<
<
|



>
>
>
>
>
>
>
>
>



|








>
|








|
|







1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213

1214
1215
1216
1217


1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244


1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
            mod_y++;
            y += module_height;
        } while (y < size);
    }
}

/* Calculate error correction codes */
static void hx_add_ecc(unsigned char fullstream[], unsigned char datastream[], int data_codewords, int version, int ecc_level) {
    unsigned char data_block[180];
    unsigned char ecc_block[36];
    int i, j, block;
    int input_position = -1;
    int output_position = -1;
    int table_d1_pos = ((version - 1) * 36) + ((ecc_level - 1) * 9);

    for (i = 0; i < 3; i++) {
        int batch_size = hx_table_d1[table_d1_pos + (3 * i)];
        int data_length = hx_table_d1[table_d1_pos + (3 * i) + 1];
        int ecc_length = hx_table_d1[table_d1_pos + (3 * i) + 2];

        for (block = 0; block < batch_size; block++) {
            for (j = 0; j < data_length; j++) {
                input_position++;
                output_position++;
                data_block[j] = input_position < data_codewords ? datastream[input_position] : 0;
                fullstream[output_position] = data_block[j];
            }

            rs_init_gf(0x163); // x^8 + x^6 + x^5 + x + 1 = 0
            rs_init_code(ecc_length, 1);
            rs_encode(data_length, data_block, ecc_block);
            rs_free();

            for (j = 0; j < ecc_length; j++) {
                output_position++;
                fullstream[output_position] = ecc_block[ecc_length - j - 1];
            }
        }
    }
}

/* Rearrange data in batches of 13 codewords (section 5.8.2) */
static void make_picket_fence(unsigned char fullstream[], unsigned char picket_fence[], int streamsize) {
    int i, start;
    int output_position = 0;

    for (start = 0; start < 13; start++) {
        for (i = start; i < streamsize; i += 13) {
            if (i < streamsize) {
                picket_fence[output_position] = fullstream[i];
                output_position++;
            }
        }
    }
}

/* Evaluate a bitmask according to table 9 */
static int hx_evaluate(unsigned char *eval, int size, int pattern) {
    int x, y, block, weight;
    int result = 0;
    char state;
    int p;
    int a, b, afterCount, beforeCount;
#ifndef _MSC_VER
    char local[size * size];
#else
    char* local = (char *) _alloca((size * size) * sizeof (char));
#endif

    /* all four bitmask variants have been encoded in the 4 bits of the bytes
     * that make up the grid array. select them for evaluation according to the
     * desired pattern.*/
    for (x = 0; x < size; x++) {
        for (y = 0; y < size; y++) {
            if (eval[(y * size) + x] & 0xf0) {
                local[(y * size) + x] = 0;
            } else if ((eval[(y * size) + x] & (0x01 << pattern)) != 0) {
                local[(y * size) + x] = '1';
            } else {
                local[(y * size) + x] = '0';
            }
        }
    }

    /* Test 1: 1:1:1:1:3  or 3:1:1:1:1 ratio pattern in row/column */
    /* Vertical */
    for (x = 0; x < size; x++) {
        for (y = 0; y < (size - 7); y++) {
            if (local[(y * size) + x] == 0) {
                continue;
            }
            p = 0;
            for (weight = 0; weight < 7; weight++) {
                if (local[((y + weight) * size) + x] == '1') {
                    p += (0x40 >> weight);
                }
            }
            if ((p == 0x57) || (p == 0x75)) {
                /* Pattern found, check before and after */
                beforeCount = 0;
                for (b = (y - 3); b < y; b++) {
                    if (b < 0) {
                        beforeCount++;
                    } else {
                        if (local[(b * size) + x] == '0') {
                            beforeCount++;
                        } else {
                            break;
                        }
                    }
                }

                afterCount = 0;
                for (a = (y + 7); a <= (y + 9); a++) {
                    if (a >= size) {
                        afterCount++;
                    } else {
                        if (local[(a * size) + x] == '0') {
                            afterCount++;
                        } else {
                            break;
                        }
                    }
                }

                if ((beforeCount == 3) || (afterCount == 3)) {
                    /* Pattern is preceeded or followed by light area
                       3 modules wide */
                    result += 50;
                }
            }
        }
    }

    /* Horizontal */
    for (y = 0; y < size; y++) {
        for (x = 0; x < (size - 7); x++) {
            if (local[(y * size) + x] == 0) {
                continue;
            }
            p = 0;
            for (weight = 0; weight < 7; weight++) {
                if (local[(y * size) + x + weight] == '1') {
                    p += (0x40 >> weight);
                }
            }
            if ((p == 0x57) || (p == 0x75)) {
                /* Pattern found, check before and after */
                beforeCount = 0;
                for (b = (x - 3); b < x; b++) {
                    if (b < 0) {
                        beforeCount++;
                    } else {
                        if (local[(y * size) + b] == '0') {
                            beforeCount++;
                        } else {
                            break;
                        }
                    }
                }

                afterCount = 0;
                for (a = (x + 7); a <= (x + 9); a++) {
                    if (a >= size) {
                        afterCount++;
                    } else {
                        if (local[(y * size) + a] == '0') {
                            afterCount++;
                        } else {
                            break;
                        }
                    }
                }

                if ((beforeCount == 3) || (afterCount == 3)) {
                    /* Pattern is preceeded or followed by light area
                       3 modules wide */
                    result += 50;
                }
            }
        }
    }

    /* Test 2: Adjacent modules in row/column in same colour */
    /* In AIMD-15 section 5.8.3.2 it is stated... “In Table 9 below, i refers to the row
     * position of the module.†- however i being the length of the run of the
     * same colour (i.e. "block" below) in the same fashion as ISO/IEC 18004
     * makes more sense. -- Confirmed by Wang Yi */
    /* Fixed in ISO/IEC 20830 (draft 2019-10-10) section 5.8.3.2 "In Table 12 below, i refers to the modules with same color." */

    /* Vertical */
    for (x = 0; x < size; x++) {

        block = 0;
        state = 0;
        for (y = 0; y < size; y++) {
            if (local[(y * size) + x] == 0) {


                if (block >= 3) {
                    result += (3 + block) * 4;
                }
                block = 0;
                state = 0;
            } else if (local[(y * size) + x] == state || state == 0) {
                block++;
                state = local[(y * size) + x];
            } else {
                if (block >= 3) {
                    result += (3 + block) * 4;
                }
                block = 1;
                state = local[(y * size) + x];
            }
        }
        if (block >= 3) {
            result += (3 + block) * 4;
        }
    }

    /* Horizontal */
    for (y = 0; y < size; y++) {
        state = local[y * size];
        block = 0;
        for (x = 0; x < size; x++) {
            if (local[(y * size) + x] == 0) {


                if (block >= 3) {
                    result += (3 + block) * 4;
                }
                block = 0;
                state = 0;
            } else if (local[(y * size) + x] == state || state == 0) {
                block++;
                state = local[(y * size) + x];
            } else {
                if (block >= 3) {
                    result += (3 + block) * 4;
                }
                block = 1;
                state = local[(y * size) + x];
            }
        }
        if (block >= 3) {
            result += (3 + block) * 4;
        }
    }

    return result;
}

/* Apply the four possible bitmasks for evaluation */
/* TODO: Haven't been able to replicate (or even get close to) the penalty scores in ISO/IEC 20830 (draft 2019-10-10) Annex K examples */
static int hx_apply_bitmask(unsigned char *grid, int size) {
    int x, y;
    int i, j;
    int pattern, penalty[4];
    int best_pattern, best_val;
    int bit;
    unsigned char p;

#ifndef _MSC_VER
    unsigned char mask[(unsigned int)(size * size)]; /* Cast to suppress gcc -Walloc-size-larger-than */
    unsigned char eval[(unsigned int)(size * size)];
#else
    unsigned char* mask = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
    unsigned char* eval = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
#endif

    /* Perform data masking */
    for (x = 0; x < size; x++) {
1158
1159
1160
1161
1162
1163
1164
1165
1166


1167
1168
1169
1170
1171
1172
1173
            }
        }
    }

    // apply data masks to grid, result in eval
    for (x = 0; x < size; x++) {
        for (y = 0; y < size; y++) {
            if (grid[(y * size) + x] & 0x01) {
                p = 0xff;


            } else {
                p = 0x00;
            }

            eval[(y * size) + x] = mask[(y * size) + x] ^ p;
        }
    }







|
|
>
>







1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
            }
        }
    }

    // apply data masks to grid, result in eval
    for (x = 0; x < size; x++) {
        for (y = 0; y < size; y++) {
            if (grid[(y * size) + x] & 0xf0) {
                p = 0xf0;
            } else if (grid[(y * size) + x] & 0x01) {
                p = 0x0f;
            } else {
                p = 0x00;
            }

            eval[(y * size) + x] = mask[(y * size) + x] ^ p;
        }
    }
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257

1258
1259
1260



1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283

1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
        }
    }

    return best_pattern;
}

/* Han Xin Code - main */
int han_xin(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    int est_binlen;
    int ecc_level = symbol->option_1;
    int i, j, version;
    int data_codewords = 0, size;
    int codewords;
    int bitmask;
    int bin_len;
    char function_information[36];
    unsigned char fi_cw[3] = {0, 0, 0};
    unsigned char fi_ecc[4];

#ifndef _MSC_VER
    int utfdata[length + 1];
    int gbdata[(length + 1) * 2];
    char mode[length + 1];
#else
    int* utfdata = (int *) _alloca((length + 1) * sizeof (int));
    int* gbdata = (int *) _alloca(((length + 1) * 2) * sizeof (int));
    char* mode = (char *) _alloca((length + 1) * sizeof (char));
    char* binary;
    unsigned char *datastream;
    unsigned char *fullstream;
    unsigned char *picket_fence;
    unsigned char *grid;
#endif

    if ((symbol->input_mode == DATA_MODE) || (symbol->eci != 3)) {
        for (i = 0; i < length; i++) {
            gbdata[i] = (int) source[i];
        }
    } else {
        int posn;

        /* Convert Unicode input to GB-18030 */
        int error_number = utf8toutf16(symbol, source, utfdata, &length);
        if (error_number != 0) {



            return error_number;
        }

        posn = 0;
        for (i = 0; i < length; i++) {
            int done = 0;
            gbdata[posn] = 0;

            /* Single byte characters in range U+0000 -> U+007F */
            if (utfdata[i] <= 0x7f) {
                gbdata[posn] = utfdata[i];
                posn++;
                done = 1;
            }

            /* Two bytes characters in GB-2312 */
            if (done == 0) {
                j = 0;
                do {
                    if (gb2312_lookup[j * 2] == utfdata[i]) {
                        gbdata[posn] = gb2312_lookup[(j * 2) + 1];
                        posn++;
                        done = 1;

                    }
                    j++;
                } while ((j < 7445) && (done == 0));
            }

            /* Two byte characters in GB-18030 */
            if (done == 0) {
                j = 0;
                do {
                    if (gb18030_twobyte_lookup[j * 2] == utfdata[i]) {
                        gbdata[posn] = gb18030_twobyte_lookup[(j * 2) + 1];
                        posn++;
                        done = 1;
                    }
                    j++;
                } while ((j < 16495) && (done == 0));
            }

            /* Four byte characters in range U+0080 -> U+FFFF */
            if (done == 0) {
                j = 0;
                do {
                    if (gb18030_fourbyte_lookup[j * 3] == utfdata[i]) {
                        gbdata[posn] = gb18030_fourbyte_lookup[(j * 3) + 1];
                        gbdata[posn + 1] = gb18030_fourbyte_lookup[(j * 3) + 2];
                        posn += 2;
                        done = 1;
                    }
                    j++;
                } while ((j < 6793) && (done == 0));
            }

            /* Supplementary planes U+10000 -> U+1FFFF */
            if (done == 0) {
                if (utfdata[i] >= 0x10000 && utfdata[i] < 0x110000) {
                    /* algorithm from libiconv-1.15\lib\gb18030.h */
                    int j, r3, r2, r1, r0;

                    j = utfdata[i] - 0x10000;
                    r3 = (j % 10) + 0x30; j = j / 10;
                    r2 = (j % 126) + 0x81; j = j / 126;
                    r1 = (j % 10) + 0x30; j = j / 10;
                    r0 = j + 0x90;
                    gbdata[posn] = (r0 << 8) + r1;
                    gbdata[posn + 1] = (r2 << 8) + r3;
                    posn += 2;
                    done = 1;
                }
            }

            /* Character not found */
            if (done == 0) {
                strcpy(symbol->errtxt, "540: Unknown character in input data");
                return ZINT_ERROR_INVALID_DATA;
            }
        }
        length = posn;
    }

    hx_define_mode(mode, gbdata, length);

    est_binlen = calculate_binlength(mode, gbdata, length, symbol->eci);

#ifndef _MSC_VER
    char binary[est_binlen + 10];
#else
    binary = (char *) _alloca((est_binlen + 10) * sizeof (char));
#endif
    memset(binary, 0, (est_binlen + 1) * sizeof (char));

    if ((ecc_level <= 0) || (ecc_level >= 5)) {
        ecc_level = 1;
    }








|












<
|


<
|








|
|
<
<

|
>
|
|
|
>
>
>
|
|
|
<
<
|
<
|
<
<
<
<
<
<
|
<
|
<
<
<
<
<
<
>
|
<
<
|
|
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|




|

|







1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385

1386
1387
1388

1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399


1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411


1412

1413






1414

1415






1416
1417


1418
1419











1420










































1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
        }
    }

    return best_pattern;
}

/* Han Xin Code - main */
INTERNAL int han_xin(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    int est_binlen;
    int ecc_level = symbol->option_1;
    int i, j, version;
    int data_codewords = 0, size;
    int codewords;
    int bitmask;
    int bin_len;
    char function_information[36];
    unsigned char fi_cw[3] = {0, 0, 0};
    unsigned char fi_ecc[4];

#ifndef _MSC_VER

    unsigned int gbdata[(length + 1) * 2];
    char mode[length + 1];
#else

    unsigned int* gbdata = (unsigned int *) _alloca(((length + 1) * 2) * sizeof (unsigned int));
    char* mode = (char *) _alloca((length + 1) * sizeof (char));
    char* binary;
    unsigned char *datastream;
    unsigned char *fullstream;
    unsigned char *picket_fence;
    unsigned char *grid;
#endif

    if ((symbol->input_mode & 0x07) == DATA_MODE) {
        gb18030_cpy(source, &length, gbdata);


    } else {
        int done = 0;
        if (symbol->eci != 29) { /* Unless ECI 29 (GB) */
            /* Try single byte (Latin) conversion first */
            int error_number = gb2312_utf8tosb(symbol->eci && symbol->eci <= 899 ? symbol->eci : 3, source, &length, gbdata);
            if (error_number == 0) {
                done = 1;
            } else if (symbol->eci && symbol->eci <= 899) {
                strcpy(symbol->errtxt, "575: Invalid characters in input data");
                return error_number;
            }
        }


        if (!done) {

            /* Try GB 18030 */






            int error_number = gb18030_utf8tomb(symbol, source, &length, gbdata);

            if (error_number != 0) {






                return error_number;
            }


        }
    }






















































    hx_define_mode(mode, gbdata, length, symbol->debug);

    est_binlen = calculate_binlength(mode, gbdata, length, symbol->eci);

#ifndef _MSC_VER
    char binary[est_binlen + 1];
#else
    binary = (char *) _alloca((est_binlen + 1) * sizeof (char));
#endif
    memset(binary, 0, (est_binlen + 1) * sizeof (char));

    if ((ecc_level <= 0) || (ecc_level >= 5)) {
        ecc_level = 1;
    }

1411
1412
1413
1414
1415
1416
1417

1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
    if ((symbol->option_2 != 0) && (symbol->option_2 < version)) {
        strcpy(symbol->errtxt, "542: Input too long for selected symbol size");
        return ZINT_ERROR_TOO_LONG;
    }

    /* If there is spare capacity, increase the level of ECC */


    if ((ecc_level == 1) && (codewords < hx_data_codewords_L2[version - 1])) {
        ecc_level = 2;
        data_codewords = hx_data_codewords_L2[version - 1];
    }

    if ((ecc_level == 2) && (codewords < hx_data_codewords_L3[version - 1])) {
        ecc_level = 3;
        data_codewords = hx_data_codewords_L3[version - 1];
    }

    if ((ecc_level == 3) && (codewords < hx_data_codewords_L4[version - 1])) {
        ecc_level = 4;
        data_codewords = hx_data_codewords_L4[version - 1];
    }

    //printf("Version %d, ECC %d\n", version, ecc_level);

    size = (version * 2) + 21;

#ifndef _MSC_VER
    unsigned char datastream[data_codewords];
    unsigned char fullstream[hx_total_codewords[version - 1]];
    unsigned char picket_fence[hx_total_codewords[version - 1]];







>
|
|
|
|

|
|
|
|

|
|
|
|
|
<







1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511

1512
1513
1514
1515
1516
1517
1518
    if ((symbol->option_2 != 0) && (symbol->option_2 < version)) {
        strcpy(symbol->errtxt, "542: Input too long for selected symbol size");
        return ZINT_ERROR_TOO_LONG;
    }

    /* If there is spare capacity, increase the level of ECC */

    if (symbol->option_1 == -1 || symbol->option_1 != ecc_level) { /* Unless explicitly specified (within min/max bounds) by user */
        if ((ecc_level == 1) && (codewords < hx_data_codewords_L2[version - 1])) {
            ecc_level = 2;
            data_codewords = hx_data_codewords_L2[version - 1];
        }

        if ((ecc_level == 2) && (codewords < hx_data_codewords_L3[version - 1])) {
            ecc_level = 3;
            data_codewords = hx_data_codewords_L3[version - 1];
        }

        if ((ecc_level == 3) && (codewords < hx_data_codewords_L4[version - 1])) {
            ecc_level = 4;
            data_codewords = hx_data_codewords_L4[version - 1];
        }
    }


    size = (version * 2) + 21;

#ifndef _MSC_VER
    unsigned char datastream[data_codewords];
    unsigned char fullstream[hx_total_codewords[version - 1]];
    unsigned char picket_fence[hx_total_codewords[version - 1]];
1451
1452
1453
1454
1455
1456
1457












1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
    }

    for (i = 0; i < bin_len; i++) {
        if (binary[i] == '1') {
            datastream[i / 8] += 0x80 >> (i % 8);
        }
    }













    hx_setup_grid(grid, size, version);

    hx_add_ecc(fullstream, datastream, version, ecc_level);

    make_picket_fence(fullstream, picket_fence, hx_total_codewords[version - 1]);

    /* Populate grid */
    j = 0;
    for (i = 0; i < (size * size); i++) {
        if (grid[i] == 0x00) {







>
>
>
>
>
>
>
>
>
>
>
>



|







1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
    }

    for (i = 0; i < bin_len; i++) {
        if (binary[i] == '1') {
            datastream[i / 8] += 0x80 >> (i % 8);
        }
    }

    if (symbol->debug & ZINT_DEBUG_PRINT) {
        printf("Datastream length: %d\n", data_codewords);
        printf("Datastream:\n");
        for (i = 0; i < data_codewords; i++) {
            printf("%.2x ", datastream[i]);
        }
        printf("\n");
    }
#ifdef ZINT_TEST
    if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, datastream, data_codewords);
#endif

    hx_setup_grid(grid, size, version);

    hx_add_ecc(fullstream, datastream, data_codewords, version, ecc_level);

    make_picket_fence(fullstream, picket_fence, hx_total_codewords[version - 1]);

    /* Populate grid */
    j = 0;
    for (i = 0; i < (size * size); i++) {
        if (grid[i] == 0x00) {
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
    for (i = 0; i < 2; i++) {
        if (bitmask & (0x02 >> i)) {
            function_information[i + 10] = '1';
        } else {
            function_information[i + 10] = '0';
        }
    }



    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            if (function_information[(i * 4) + j] == '1') {
                fi_cw[i] += (0x08 >> j);
            }
        }







<
<







1596
1597
1598
1599
1600
1601
1602


1603
1604
1605
1606
1607
1608
1609
    for (i = 0; i < 2; i++) {
        if (bitmask & (0x02 >> i)) {
            function_information[i + 10] = '1';
        } else {
            function_information[i + 10] = '0';
        }
    }



    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            if (function_information[(i * 4) + j] == '1') {
                fi_cw[i] += (0x08 >> j);
            }
        }
1566
1567
1568
1569
1570
1571
1572
1573
1574
            }
        }
        symbol->row_height[i] = 1;
    }

    return 0;
}









<
<
1654
1655
1656
1657
1658
1659
1660


            }
        }
        symbol->row_height[i] = 1;
    }

    return 0;
}


Changes to jni/zint/backend/imail.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/*  The function "USPS_MSB_Math_CRC11GenerateFrameCheckSequence"
    is Copyright (C) 2006 United States Postal Service */

#include <string.h>
#include <stdlib.h>
#include <stdio.h>







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/*  The function "USPS_MSB_Math_CRC11GenerateFrameCheckSequence"
    is Copyright (C) 2006 United States Postal Service */

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
 **   ByteAttayPtr is the address of a 13 byte array holding 102 bytes which
 **   are right justified - ie: the leftmost 2 bits of the first byte do not
 **   hold data and must be set to zero.
 **
 ** Outputs:
 **   return unsigned short - 11 bit Frame Check Sequence (right justified)
 ***************************************************************************/
extern unsigned short USPS_MSB_Math_CRC11GenerateFrameCheckSequence(unsigned char *ByteArrayPtr) {
    unsigned short GeneratorPolynomial = 0x0F35;
    unsigned short FrameCheckSequence = 0x07FF;
    unsigned short Data;
    int ByteIndex, Bit;

    /* Do most significant byte skipping the 2 most significant bits */
    Data = *ByteArrayPtr << 5;







|







206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
 **   ByteAttayPtr is the address of a 13 byte array holding 102 bytes which
 **   are right justified - ie: the leftmost 2 bits of the first byte do not
 **   hold data and must be set to zero.
 **
 ** Outputs:
 **   return unsigned short - 11 bit Frame Check Sequence (right justified)
 ***************************************************************************/
static unsigned short USPS_MSB_Math_CRC11GenerateFrameCheckSequence(unsigned char *ByteArrayPtr) {
    unsigned short GeneratorPolynomial = 0x0F35;
    unsigned short FrameCheckSequence = 0x07FF;
    unsigned short Data;
    int ByteIndex, Bit;

    /* Do most significant byte skipping the 2 most significant bits */
    Data = *ByteArrayPtr << 5;
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
            FrameCheckSequence &= 0x7FF;
            Data <<= 1;
        }
    }
    return FrameCheckSequence;
}

int imail(struct zint_symbol *symbol, unsigned char source[], int length) {
    char data_pattern[200];
    int error_number;
    int i, j, read;
    char zip[35], tracker[35], zip_adder[11], temp[2];
    short int accum[112], x_reg[112], y_reg[112];
    unsigned char byte_array[13];
    unsigned short usps_crc;







|







240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
            FrameCheckSequence &= 0x7FF;
            Data <<= 1;
        }
    }
    return FrameCheckSequence;
}

INTERNAL int imail(struct zint_symbol *symbol, unsigned char source[], int length) {
    char data_pattern[200];
    int error_number;
    int i, j, read;
    char zip[35], tracker[35], zip_adder[11], temp[2];
    short int accum[112], x_reg[112], y_reg[112];
    unsigned char byte_array[13];
    unsigned short usps_crc;
561
562
563
564
565
566
567
568
    symbol->row_height[1] = 2;
    symbol->row_height[2] = 3;

    symbol->rows = 3;
    symbol->width = read - 1;
    return error_number;
}








<
562
563
564
565
566
567
568

    symbol->row_height[1] = 2;
    symbol->row_height[2] = 3;

    symbol->rows = 3;
    symbol->width = read - 1;
    return error_number;
}

Changes to jni/zint/backend/large.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <string.h>
#include "common.h"
#include "large.h"

void binary_add(short int accumulator[], short int input_buffer[]) { /* Binary addition */
    int i, carry;
    carry = 0;

    for (i = 0; i < 112; i++) {
        int done = 0;
        if (((input_buffer[i] == 0) && (accumulator[i] == 0))
                && ((carry == 0) && (done == 0))) {







>






|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <string.h>
#include "common.h"
#include "large.h"

INTERNAL void binary_add(short int accumulator[], short int input_buffer[]) { /* Binary addition */
    int i, carry;
    carry = 0;

    for (i = 0; i < 112; i++) {
        int done = 0;
        if (((input_buffer[i] == 0) && (accumulator[i] == 0))
                && ((carry == 0) && (done == 0))) {
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
            accumulator[i] = 1;
            carry = 1;
            done = 1;
        }
    }
}

void binary_subtract(short int accumulator[], short int input_buffer[]) {
    /* 2's compliment subtraction */
    /* take input_buffer from accumulator and put answer in accumulator */
    int i;
    short int sub_buffer[112];

    for (i = 0; i < 112; i++) {
        if (input_buffer[i] == 0) {







|







89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
            accumulator[i] = 1;
            carry = 1;
            done = 1;
        }
    }
}

INTERNAL void binary_subtract(short int accumulator[], short int input_buffer[]) {
    /* 2's compliment subtraction */
    /* take input_buffer from accumulator and put answer in accumulator */
    int i;
    short int sub_buffer[112];

    for (i = 0; i < 112; i++) {
        if (input_buffer[i] == 0) {
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166

    for (i = 1; i < 112; i++) {
        sub_buffer[i] = 0;
    }
    binary_add(accumulator, sub_buffer);
}

void binary_multiply(short int reg[], char data[]) {
    /* Multiply the contents of reg[] by a number */
    short int temp[112] = {0};
    short int accum[112] = {0};
    int i;
    
    binary_load(temp, data, strlen(data));
    
    for (i = 0; i < 102; i++) {
        if (temp[i] == 1) {
            binary_add(accum, reg);
        }
        shiftup(reg);
    }
    
    for (i = 0; i < 112; i++) {
        reg[i] = accum[i];
    }
}

void shiftdown(short int buffer[]) {
    int i;

    buffer[102] = 0;
    buffer[103] = 0;

    for (i = 0; i < 102; i++) {
        buffer[i] = buffer[i + 1];
    }
}

void shiftup(short int buffer[]) {
    int i;

    for (i = 102; i > 0; i--) {
        buffer[i] = buffer[i - 1];
    }

    buffer[0] = 0;
}

short int islarger(short int accum[], short int reg[]) {
    /* Returns 1 if accum[] is larger than reg[], else 0 */
    int i, latch, larger;
    latch = 0;
    i = 103;
    larger = 0;









|



















|










|









|







112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167

    for (i = 1; i < 112; i++) {
        sub_buffer[i] = 0;
    }
    binary_add(accumulator, sub_buffer);
}

INTERNAL void binary_multiply(short int reg[], char data[]) {
    /* Multiply the contents of reg[] by a number */
    short int temp[112] = {0};
    short int accum[112] = {0};
    int i;
    
    binary_load(temp, data, strlen(data));
    
    for (i = 0; i < 102; i++) {
        if (temp[i] == 1) {
            binary_add(accum, reg);
        }
        shiftup(reg);
    }
    
    for (i = 0; i < 112; i++) {
        reg[i] = accum[i];
    }
}

INTERNAL void shiftdown(short int buffer[]) {
    int i;

    buffer[102] = 0;
    buffer[103] = 0;

    for (i = 0; i < 102; i++) {
        buffer[i] = buffer[i + 1];
    }
}

INTERNAL void shiftup(short int buffer[]) {
    int i;

    for (i = 102; i > 0; i--) {
        buffer[i] = buffer[i - 1];
    }

    buffer[0] = 0;
}

INTERNAL short int islarger(short int accum[], short int reg[]) {
    /* Returns 1 if accum[] is larger than reg[], else 0 */
    int i, latch, larger;
    latch = 0;
    i = 103;
    larger = 0;


174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
        }
        i--;
    } while ((latch == 0) && (i >= 0));

    return larger;
}

void binary_load(short int reg[], char data[], const size_t src_len) {
	size_t    read;
	int       i;
    short int temp[112] = {0};

    for (i = 0; i < 112; i++) {
        reg[i] = 0;
    }







|







175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
        }
        i--;
    } while ((latch == 0) && (i >= 0));

    return larger;
}

INTERNAL void binary_load(short int reg[], char data[], const size_t src_len) {
	size_t    read;
	int       i;
    short int temp[112] = {0};

    for (i = 0; i < 112; i++) {
        reg[i] = 0;
    }
204
205
206
207
208
209
210
211
212
        for (i = 0; i < 4; i++) {
                if (ctoi(data[read]) & (0x01 << i)) temp[i] = 1;
        }

        binary_add(reg, temp);
    }
}









<
<
205
206
207
208
209
210
211


        for (i = 0; i < 4; i++) {
                if (ctoi(data[read]) & (0x01 << i)) temp[i] = 1;
        }

        binary_add(reg, temp);
    }
}


Changes to jni/zint/backend/large.h.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
*/

#ifndef __LARGE_H
#define __LARGE_H

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

extern void binary_load(short int reg[], char data[], const size_t src_len);
extern void binary_add(short int accumulator[], short int input_buffer[]);
extern void binary_subtract(short int accumulator[], short int input_buffer[]);
extern void shiftdown(short int buffer[]);
extern void shiftup(short int buffer[]);
extern short int islarger(short int accum[], short int reg[]);
extern void binary_multiply(short int reg[], char data[]);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __LARGE_H */








>







|
|
|
|
|
|
|






<
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
*/
/* vim: set ts=4 sw=4 et : */
#ifndef __LARGE_H
#define __LARGE_H

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

INTERNAL void binary_load(short int reg[], char data[], const size_t src_len);
INTERNAL void binary_add(short int accumulator[], short int input_buffer[]);
INTERNAL void binary_subtract(short int accumulator[], short int input_buffer[]);
INTERNAL void shiftdown(short int buffer[]);
INTERNAL void shiftup(short int buffer[]);
INTERNAL short int islarger(short int accum[], short int reg[]);
INTERNAL void binary_multiply(short int reg[], char data[]);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __LARGE_H */

Changes to jni/zint/backend/library.c.
1
2
3
4
5
6
7
8
9
10
11
/*  library.c - external functions of libzint

    libzint - the open source barcode library
    Copyright (C) 2009-2018 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.



|







1
2
3
4
5
6
7
8
9
10
11
/*  library.c - external functions of libzint

    libzint - the open source barcode library
    Copyright (C) 2009-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifdef _MSC_VER
#include <malloc.h>







>







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifdef _MSC_VER
#include <malloc.h>
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
    symbol->width = 0;
    strcpy(symbol->fgcolour, "000000");
    strcpy(symbol->bgcolour, "ffffff");
    strcpy(symbol->outfile, "out.png");
    symbol->scale = 1.0;
    symbol->option_1 = -1;
    symbol->option_2 = 0;
    symbol->option_3 = 928; // PDF_MAX
    symbol->show_hrt = 1; // Show human readable text
    symbol->fontsize = 8;
    symbol->input_mode = DATA_MODE;
    strcpy(symbol->primary, "");
    memset(&(symbol->encoded_data[0][0]), 0, sizeof (symbol->encoded_data));
    memset(&(symbol->row_height[0]), 0, sizeof (symbol->row_height));
    symbol->bitmap = NULL;
    symbol->bitmap_width = 0;
    symbol->bitmap_height = 0;
    symbol->eci = 3;
    symbol->dot_size = 4.0 / 5.0;
    symbol->debug = 0;
    return symbol;
}

extern void render_free(struct zint_symbol *symbol); /* Free render structures */
extern void vector_free(struct zint_symbol *symbol); /* Free vector structures */

void ZBarcode_Clear(struct zint_symbol *symbol) {
    int i, j;

    for (i = 0; i < symbol->rows; i++) {
        for (j = 0; j < symbol->width; j++) {
            unset_module(symbol, i, j);







|









|





<
|







58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

81
82
83
84
85
86
87
88
    symbol->width = 0;
    strcpy(symbol->fgcolour, "000000");
    strcpy(symbol->bgcolour, "ffffff");
    strcpy(symbol->outfile, "out.png");
    symbol->scale = 1.0;
    symbol->option_1 = -1;
    symbol->option_2 = 0;
    symbol->option_3 = 0;
    symbol->show_hrt = 1; // Show human readable text
    symbol->fontsize = 8;
    symbol->input_mode = DATA_MODE;
    strcpy(symbol->primary, "");
    memset(&(symbol->encoded_data[0][0]), 0, sizeof (symbol->encoded_data));
    memset(&(symbol->row_height[0]), 0, sizeof (symbol->row_height));
    symbol->bitmap = NULL;
    symbol->bitmap_width = 0;
    symbol->bitmap_height = 0;
    symbol->eci = 0; // Default 0 uses ECI 3
    symbol->dot_size = 4.0 / 5.0;
    symbol->debug = 0;
    return symbol;
}


INTERNAL void vector_free(struct zint_symbol *symbol); /* Free vector structures */

void ZBarcode_Clear(struct zint_symbol *symbol) {
    int i, j;

    for (i = 0; i < symbol->rows; i++) {
        for (j = 0; j < symbol->width; j++) {
            unset_module(symbol, i, j);
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182

183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
        free(symbol->bitmap);
        symbol->bitmap = NULL;
    }
    symbol->bitmap_width = 0;
    symbol->bitmap_height = 0;

    // If there is a rendered version, ensure its memory is released
    render_free(symbol);
    vector_free(symbol);
}

void ZBarcode_Delete(struct zint_symbol *symbol) {
    if (symbol->bitmap != NULL)
        free(symbol->bitmap);

    // If there is a rendered version, ensure its memory is released
    render_free(symbol);
    vector_free(symbol);

    free(symbol);
}

extern int get_best_eci(unsigned char source[], size_t length); /* Calculate suitable ECI mode */
extern int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */


extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN system barcodes */
extern int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Code 3 from 9 (or Code 39) */
extern int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmazentral Nummer (PZN) */
extern int ec39(struct zint_symbol *symbol, unsigned char source[], int length); /* Extended Code 3 from 9 (or Code 39+) */
extern int codabar(struct zint_symbol *symbol, unsigned char source[], int length); /* Codabar - a simple substitution cipher */
extern int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Standard (& Matrix) */
extern int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Industrial */
extern int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 IATA */
extern int interleaved_two_of_five(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Code 2 of 5 Interleaved */
extern int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Data Logic */
extern int itf14(struct zint_symbol *symbol, unsigned char source[], int length); /* ITF-14 */
extern int dpleit(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Leitcode */
extern int dpident(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Identcode */
extern int c93(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 93 - a re-working of Code 39+, generates 2 check digits */
extern int code_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Code 128 and NVE-18 */
extern int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* EAN-128 (GS1-128) */
extern int code_11(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 11 */
extern int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length); /* MSI Plessey */
extern int telepen(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Telepen ASCII */
extern int telepen_num(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Telepen Numeric */
extern int plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Plessey Code */
extern int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode One Track */
extern int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length); /* Flattermarken */
extern int fim(struct zint_symbol *symbol, unsigned char source[], int length); /* Facing Identification Mark */
extern int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode Two Track */
extern int post_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* Postnet */
extern int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* PLANET */
extern int imail(struct zint_symbol *symbol, unsigned char source[], int length); /* Intelligent Mail (aka USPS OneCode) */
extern int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* RM4SCC */
extern int australia_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Australia Post 4-state */
extern int code16k(struct zint_symbol *symbol, unsigned char source[],const size_t length); /* Code 16k */
extern int pdf417enc(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* PDF417 */
extern int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length); /* Micro PDF417 */
extern int maxicode(struct zint_symbol *symbol, unsigned char source[], int length); /* Maxicode */
extern int rss14(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS-14 */
extern int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Limited */
extern int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Expanded */
extern int composite(struct zint_symbol *symbol, unsigned char source[], int length); /* Composite Symbology */
extern int kix_code(struct zint_symbol *symbol, unsigned char source[], int length); /* TNT KIX Code */
extern int aztec(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Aztec Code */
extern int code32(struct zint_symbol *symbol, unsigned char source[], int length); /* Italian Pharmacode */
extern int daft_code(struct zint_symbol *symbol, unsigned char source[], int length); /* DAFT Code */
extern int ean_14(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN-14 */
extern int nve_18(struct zint_symbol *symbol, unsigned char source[], int length); /* NVE-18 */
extern int microqr(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Micro QR Code */
extern int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length); /* Aztec Runes */
extern int korea_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Korea Post */
extern int japan_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Japanese Post */
extern int code_49(struct zint_symbol *symbol, unsigned char source[], const int length); /* Code 49 */
extern int channel_code(struct zint_symbol *symbol, unsigned char source[], int length); /* Channel Code */
extern int code_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Code One */
extern int grid_matrix(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Grid Matrix */
extern int han_xin(struct zint_symbol * symbol, const unsigned char source[], size_t length); /* Han Xin */
extern int dotcode(struct zint_symbol * symbol, const unsigned char source[], int length); /* DotCode */
extern int codablock(struct zint_symbol * symbol, const unsigned char source[], const size_t length); /* Codablock */
extern int upnqr(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* UPNQR */
extern int qr_code(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* QR Code */
extern int dmatrix(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* Data Matrix (IEC16022) */
extern int vin(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* VIN Code (Vehicle Identification Number) */
extern int mailmark(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* Royal Mail 4-state Mailmark */
extern int ultracode(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* Ultracode */


extern int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_type); /* Plot to PNG/BMP/PCX */
extern int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_type); /* Plot to EPS/EMF/SVG */

extern int render_plot(struct zint_symbol *symbol, float width, float height); /* Plot to gLabels */

//extern int ps_plot(struct zint_symbol *symbol); /* Plot to EPS */
//extern int svg_plot(struct zint_symbol *symbol); /* Plot to SVG */
//extern int emf_plot(struct zint_symbol *symbol); /* Plot to Metafile */

void error_tag(char error_string[], int error_number) {

    if (error_number != 0) {
        char error_buffer[100];
        strcpy(error_buffer, error_string);

        if (error_number > 4) {
            strcpy(error_string, "Error ");
        } else {
            strcpy(error_string, "Warning ");
        }

        strcat(error_string, error_buffer);
    }
}

/* Output a hexadecimal representation of the rendered symbol */
int dump_plot(struct zint_symbol *symbol) {
    FILE *f;
    int i, r;
    char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
        '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    int space = 0;

    if (symbol->output_options & BARCODE_STDOUT) {







<








<





|
|


|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>

|
|

<
<
<
<
<
<
|
















|







96
97
98
99
100
101
102

103
104
105
106
107
108
109
110

111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185






186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
        free(symbol->bitmap);
        symbol->bitmap = NULL;
    }
    symbol->bitmap_width = 0;
    symbol->bitmap_height = 0;

    // If there is a rendered version, ensure its memory is released

    vector_free(symbol);
}

void ZBarcode_Delete(struct zint_symbol *symbol) {
    if (symbol->bitmap != NULL)
        free(symbol->bitmap);

    // If there is a rendered version, ensure its memory is released

    vector_free(symbol);

    free(symbol);
}

INTERNAL int get_best_eci(unsigned char source[], size_t length); /* Calculate suitable ECI mode */
INTERNAL int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */


INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN system barcodes */
INTERNAL int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Code 3 from 9 (or Code 39) */
INTERNAL int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmazentral Nummer (PZN) */
INTERNAL int ec39(struct zint_symbol *symbol, unsigned char source[], int length); /* Extended Code 3 from 9 (or Code 39+) */
INTERNAL int codabar(struct zint_symbol *symbol, unsigned char source[], int length); /* Codabar - a simple substitution cipher */
INTERNAL int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Standard (& Matrix) */
INTERNAL int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Industrial */
INTERNAL int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 IATA */
INTERNAL int interleaved_two_of_five(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Code 2 of 5 Interleaved */
INTERNAL int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Data Logic */
INTERNAL int itf14(struct zint_symbol *symbol, unsigned char source[], int length); /* ITF-14 */
INTERNAL int dpleit(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Leitcode */
INTERNAL int dpident(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Identcode */
INTERNAL int c93(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 93 - a re-working of Code 39+, generates 2 check digits */
INTERNAL int code_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Code 128 and NVE-18 */
INTERNAL int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* EAN-128 (GS1-128) */
INTERNAL int code_11(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 11 */
INTERNAL int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length); /* MSI Plessey */
INTERNAL int telepen(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Telepen ASCII */
INTERNAL int telepen_num(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Telepen Numeric */
INTERNAL int plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Plessey Code */
INTERNAL int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode One Track */
INTERNAL int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length); /* Flattermarken */
INTERNAL int fim(struct zint_symbol *symbol, unsigned char source[], int length); /* Facing Identification Mark */
INTERNAL int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode Two Track */
INTERNAL int post_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* Postnet */
INTERNAL int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* PLANET */
INTERNAL int imail(struct zint_symbol *symbol, unsigned char source[], int length); /* Intelligent Mail (aka USPS OneCode) */
INTERNAL int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* RM4SCC */
INTERNAL int australia_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Australia Post 4-state */
INTERNAL int code16k(struct zint_symbol *symbol, unsigned char source[],const size_t length); /* Code 16k */
INTERNAL int pdf417enc(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* PDF417 */
INTERNAL int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length); /* Micro PDF417 */
INTERNAL int maxicode(struct zint_symbol *symbol, unsigned char source[], int length); /* Maxicode */
INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS-14 */
INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Limited */
INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Expanded */
INTERNAL int composite(struct zint_symbol *symbol, unsigned char source[], int length); /* Composite Symbology */
INTERNAL int kix_code(struct zint_symbol *symbol, unsigned char source[], int length); /* TNT KIX Code */
INTERNAL int aztec(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Aztec Code */
INTERNAL int code32(struct zint_symbol *symbol, unsigned char source[], int length); /* Italian Pharmacode */
INTERNAL int daft_code(struct zint_symbol *symbol, unsigned char source[], int length); /* DAFT Code */
INTERNAL int ean_14(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN-14 */
INTERNAL int nve_18(struct zint_symbol *symbol, unsigned char source[], int length); /* NVE-18 */
INTERNAL int microqr(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Micro QR Code */
INTERNAL int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length); /* Aztec Runes */
INTERNAL int korea_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Korea Post */
INTERNAL int japan_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Japanese Post */
INTERNAL int code_49(struct zint_symbol *symbol, unsigned char source[], const int length); /* Code 49 */
INTERNAL int channel_code(struct zint_symbol *symbol, unsigned char source[], int length); /* Channel Code */
INTERNAL int code_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Code One */
INTERNAL int grid_matrix(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Grid Matrix */
INTERNAL int han_xin(struct zint_symbol * symbol, const unsigned char source[], size_t length); /* Han Xin */
INTERNAL int dotcode(struct zint_symbol * symbol, const unsigned char source[], int length); /* DotCode */
INTERNAL int codablock(struct zint_symbol * symbol, const unsigned char source[], const size_t length); /* Codablock */
INTERNAL int upnqr(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* UPNQR */
INTERNAL int qr_code(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* QR Code */
INTERNAL int dmatrix(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* Data Matrix (IEC16022) */
INTERNAL int vin(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* VIN Code (Vehicle Identification Number) */
INTERNAL int mailmark(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* Royal Mail 4-state Mailmark */
INTERNAL int ultracode(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* Ultracode */
INTERNAL int rmqr(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* rMQR */

INTERNAL int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_type); /* Plot to PNG/BMP/PCX */
INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_type); /* Plot to EPS/EMF/SVG */







static void error_tag(char error_string[], int error_number) {

    if (error_number != 0) {
        char error_buffer[100];
        strcpy(error_buffer, error_string);

        if (error_number > 4) {
            strcpy(error_string, "Error ");
        } else {
            strcpy(error_string, "Warning ");
        }

        strcat(error_string, error_buffer);
    }
}

/* Output a hexadecimal representation of the rendered symbol */
static int dump_plot(struct zint_symbol *symbol) {
    FILE *f;
    int i, r;
    char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
        '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    int space = 0;

    if (symbol->output_options & BARCODE_STDOUT) {
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400

401

402
403
404

405


406

407

408
409
410
411
412
413
414

415
416
417
418
419
420
421
                preset_height += 5;
            }
        }
        symbol->height = preset_height;
    }
}

static int gs1_compliant(const int symbology) {
    /* Returns 1 if symbology supports GS1 data */

    int result = 0;

    switch (symbology) {
        case BARCODE_EAN128:
        case BARCODE_RSS_EXP:
        case BARCODE_RSS_EXPSTACK:
        case BARCODE_EANX_CC:
        case BARCODE_EAN128_CC:
        case BARCODE_RSS14_CC:

        case BARCODE_RSS_LTD_CC:

        case BARCODE_RSS_EXP_CC:
        case BARCODE_UPCA_CC:
        case BARCODE_UPCE_CC:

        case BARCODE_RSS14STACK_CC:


        case BARCODE_RSS14_OMNI_CC:

        case BARCODE_RSS_EXPSTACK_CC:

        case BARCODE_CODE16K:
        case BARCODE_AZTEC:
        case BARCODE_DATAMATRIX:
        case BARCODE_CODEONE:
        case BARCODE_CODE49:
        case BARCODE_QRCODE:
        case BARCODE_DOTCODE:

            result = 1;
            break;
    }

    return result;
}








|
|

|



|
|
|
<
|
>
|
>
|
<
|
>
|
>
>
|
>
|
>







>







375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391

392
393
394
395
396

397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
                preset_height += 5;
            }
        }
        symbol->height = preset_height;
    }
}

static int check_force_gs1(const int symbology) {
    /* Returns 1 if symbology MUST have GS1 data */

    int result = is_composite(symbology);

    switch (symbology) {
        case BARCODE_EAN128:
        case BARCODE_EAN14:
        case BARCODE_NVE18:
        case BARCODE_RSS_EXP:

        case BARCODE_RSS_EXPSTACK:
            result = 1;
            break;
    }


    return result;
}

static int gs1_compliant(const int symbology) {
    /* Returns 1 if symbology supports GS1 data */

    int result = check_force_gs1(symbology);

    switch (symbology) {
        case BARCODE_CODE16K:
        case BARCODE_AZTEC:
        case BARCODE_DATAMATRIX:
        case BARCODE_CODEONE:
        case BARCODE_CODE49:
        case BARCODE_QRCODE:
        case BARCODE_DOTCODE:
        case BARCODE_RMQR:
            result = 1;
            break;
    }

    return result;
}

434
435
436
437
438
439
440

441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
        case BARCODE_HIBC_AZTEC:
        case BARCODE_AZRUNE:
        case BARCODE_CODEONE:
        case BARCODE_GRIDMATRIX:
        case BARCODE_HANXIN:
        case BARCODE_DOTCODE:
        case BARCODE_UPNQR:

            result = 1;
            break;
    }

    return result;
}

static int is_linear(const int symbology) {
    /* Returns 1 if symbology is linear (1 dimensional) */
    
    int result = 0;
    switch (symbology) {
        case BARCODE_CODE11:
        case BARCODE_C25MATRIX:
        case BARCODE_C25INTER:
        case BARCODE_C25IATA:
        case BARCODE_C25LOGIC:







>









|







433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
        case BARCODE_HIBC_AZTEC:
        case BARCODE_AZRUNE:
        case BARCODE_CODEONE:
        case BARCODE_GRIDMATRIX:
        case BARCODE_HANXIN:
        case BARCODE_DOTCODE:
        case BARCODE_UPNQR:
        case BARCODE_RMQR:
            result = 1;
            break;
    }

    return result;
}

static int is_linear(const int symbology) {
    /* Returns 1 if symbology is linear (1 dimensional) */

    int result = 0;
    switch (symbology) {
        case BARCODE_CODE11:
        case BARCODE_C25MATRIX:
        case BARCODE_C25INTER:
        case BARCODE_C25IATA:
        case BARCODE_C25LOGIC:
480
481
482
483
484
485
486

487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
        case BARCODE_LOGMARS:
        case BARCODE_PHARMA:
        case BARCODE_PZN:
        case BARCODE_CODE128B:
        case BARCODE_ISBNX:
        case BARCODE_EAN14:
        case BARCODE_NVE18:

        case BARCODE_ONECODE:
        case BARCODE_PLESSEY:
        case BARCODE_TELEPEN_NUM:
        case BARCODE_ITF14:
        case BARCODE_HIBC_128:
        case BARCODE_HIBC_39:
        case BARCODE_CODE32:
        case BARCODE_EANX_CC:
        case BARCODE_EAN128_CC:
        case BARCODE_RSS14_CC:
        case BARCODE_RSS_LTD_CC:
        case BARCODE_RSS_EXP_CC:
        case BARCODE_UPCA_CC:
        case BARCODE_UPCE_CC:
        case BARCODE_CHANNEL:
        case BARCODE_VIN:
            result = 1;
            break;
    }
    
    return result;
}

static int supports_eci(const int symbology) {
    /* Returns 1 if symbology can encode the ECI character */

    int result = 0;







>



















|







480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
        case BARCODE_LOGMARS:
        case BARCODE_PHARMA:
        case BARCODE_PZN:
        case BARCODE_CODE128B:
        case BARCODE_ISBNX:
        case BARCODE_EAN14:
        case BARCODE_NVE18:
        case BARCODE_KOREAPOST:
        case BARCODE_ONECODE:
        case BARCODE_PLESSEY:
        case BARCODE_TELEPEN_NUM:
        case BARCODE_ITF14:
        case BARCODE_HIBC_128:
        case BARCODE_HIBC_39:
        case BARCODE_CODE32:
        case BARCODE_EANX_CC:
        case BARCODE_EAN128_CC:
        case BARCODE_RSS14_CC:
        case BARCODE_RSS_LTD_CC:
        case BARCODE_RSS_EXP_CC:
        case BARCODE_UPCA_CC:
        case BARCODE_UPCE_CC:
        case BARCODE_CHANNEL:
        case BARCODE_VIN:
            result = 1;
            break;
    }

    return result;
}

static int supports_eci(const int symbology) {
    /* Returns 1 if symbology can encode the ECI character */

    int result = 0;
626
627
628
629
630
631
632

633
634
635
636
637
638
639


640
641
642
643
644

645
646
647
648
649
650
651
652
653
654




655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692

693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
        case BARCODE_HANXIN:
        case BARCODE_DOTCODE:
        case BARCODE_CODABLOCKF:
        case BARCODE_UPNQR:
        case BARCODE_VIN:
        case BARCODE_MAILMARK:
        case BARCODE_ULTRA:

            result = 1;
            break;
    }

    return result;
}



static int extended_charset(struct zint_symbol *symbol, const unsigned char *source, const int length) {
    int error_number = 0;
        
    /* These are the "elite" standards which can support multiple character sets */
    switch (symbol->symbology) {

        case BARCODE_QRCODE: error_number = qr_code(symbol, source, length);
            break;
        case BARCODE_MICROQR: error_number = microqr(symbol, source, length);
            break;
        case BARCODE_GRIDMATRIX: error_number = grid_matrix(symbol, source, length);
            break;
        case BARCODE_HANXIN: error_number = han_xin(symbol, source, length);
            break;
        case BARCODE_UPNQR: error_number = upnqr(symbol, source, length);
            break;




    }

    return error_number;
}

static int reduced_charset(struct zint_symbol *symbol, const unsigned char *source, size_t in_length) {
    /* These are the "norm" standards which only support Latin-1 at most */
    int error_number = 0;

#ifndef _MSC_VER
    unsigned char preprocessed[in_length + 1];
#else
    unsigned char* preprocessed = (unsigned char*) _alloca(in_length + 1);
#endif
    
    if (symbol->symbology == BARCODE_CODE16K) {
        symbol->whitespace_width = 16;
        symbol->border_width = 2;
        if (!(symbol->output_options & BARCODE_BIND)) {
            symbol->output_options += BARCODE_BIND;
        }
    }
    else
        if (symbol->symbology == BARCODE_ITF14) {
        symbol->whitespace_width = 20;
        symbol->border_width = 8;
        if (!(symbol->output_options & BARCODE_BOX)) {
            symbol->output_options += BARCODE_BOX;
        }
    }
    
    switch (symbol->input_mode & 0x07) {
        case DATA_MODE:
        case GS1_MODE:
            memcpy(preprocessed, source, in_length);
            preprocessed[in_length] = '\0';
            break;
        case UNICODE_MODE:

            error_number = utf_to_eci(symbol->eci, source, preprocessed, &in_length);
            if (error_number != 0) {
                strcpy(symbol->errtxt, "204: Invalid characters in input data");
                return error_number;
            }
            break;
    }
    
    if ((symbol->height == 0) && is_linear(symbol->symbology)) {
        symbol->height = 50;
    }
    
    switch (symbol->symbology) {
        case BARCODE_C25MATRIX: error_number = matrix_two_of_five(symbol, preprocessed, in_length);
            break;
        case BARCODE_C25IND: error_number = industrial_two_of_five(symbol, preprocessed, in_length);
            break;
        case BARCODE_C25INTER: error_number = interleaved_two_of_five(symbol, preprocessed, in_length);
            break;







>







>
>
|

|
<

>










>
>
>
>






|







|















|







>
|






|



|







627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646

647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
        case BARCODE_HANXIN:
        case BARCODE_DOTCODE:
        case BARCODE_CODABLOCKF:
        case BARCODE_UPNQR:
        case BARCODE_VIN:
        case BARCODE_MAILMARK:
        case BARCODE_ULTRA:
        case BARCODE_RMQR:
            result = 1;
            break;
    }

    return result;
}

static int reduced_charset(struct zint_symbol *symbol, const unsigned char *source, size_t in_length);

static int extended_or_reduced_charset(struct zint_symbol *symbol, const unsigned char *source, const int length) {
    int error_number = 0;


    switch (symbol->symbology) {
        /* These are the "elite" standards which have support for specific character sets */
        case BARCODE_QRCODE: error_number = qr_code(symbol, source, length);
            break;
        case BARCODE_MICROQR: error_number = microqr(symbol, source, length);
            break;
        case BARCODE_GRIDMATRIX: error_number = grid_matrix(symbol, source, length);
            break;
        case BARCODE_HANXIN: error_number = han_xin(symbol, source, length);
            break;
        case BARCODE_UPNQR: error_number = upnqr(symbol, source, length);
            break;
        case BARCODE_RMQR: error_number = rmqr(symbol, source, length);
            break;
        default: error_number = reduced_charset(symbol, source, length);
            break;
    }

    return error_number;
}

static int reduced_charset(struct zint_symbol *symbol, const unsigned char *source, size_t in_length) {
    /* These are the "norm" standards which only support Latin-1 at most, though a few support ECI */
    int error_number = 0;

#ifndef _MSC_VER
    unsigned char preprocessed[in_length + 1];
#else
    unsigned char* preprocessed = (unsigned char*) _alloca(in_length + 1);
#endif

    if (symbol->symbology == BARCODE_CODE16K) {
        symbol->whitespace_width = 16;
        symbol->border_width = 2;
        if (!(symbol->output_options & BARCODE_BIND)) {
            symbol->output_options += BARCODE_BIND;
        }
    }
    else
        if (symbol->symbology == BARCODE_ITF14) {
        symbol->whitespace_width = 20;
        symbol->border_width = 8;
        if (!(symbol->output_options & BARCODE_BOX)) {
            symbol->output_options += BARCODE_BOX;
        }
    }

    switch (symbol->input_mode & 0x07) {
        case DATA_MODE:
        case GS1_MODE:
            memcpy(preprocessed, source, in_length);
            preprocessed[in_length] = '\0';
            break;
        case UNICODE_MODE:
            /* Prior check ensures ECI only set for those that support it */
            error_number = utf_to_eci(symbol->eci && symbol->eci <= 899 ? symbol->eci : 3, source, preprocessed, &in_length);
            if (error_number != 0) {
                strcpy(symbol->errtxt, "204: Invalid characters in input data");
                return error_number;
            }
            break;
    }

    if ((symbol->height == 0) && is_linear(symbol->symbology)) {
        symbol->height = 50;
    }

    switch (symbol->symbology) {
        case BARCODE_C25MATRIX: error_number = matrix_two_of_five(symbol, preprocessed, in_length);
            break;
        case BARCODE_C25IND: error_number = industrial_two_of_five(symbol, preprocessed, in_length);
            break;
        case BARCODE_C25INTER: error_number = interleaved_two_of_five(symbol, preprocessed, in_length);
            break;
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
        case BARCODE_ULTRA: error_number = ultracode(symbol, preprocessed, in_length);
            break;
    }

    return error_number;
}

void strip_bom(unsigned char *source, int *input_length) {
    int i;

    if (*input_length > 3) {
        if((source[0] == 0xef) && (source[1] == 0xbb) && (source[2] == 0xbf)) {
            /* BOM at start of input data, strip in accordance with RFC 3629 */
            for (i = 3; i < *input_length; i++) {
                source[i - 3] = source[i];
            }
            *input_length -= 3;
        }
    }
}

int escape_char_process(struct zint_symbol *symbol, unsigned char *input_string, int *length) {
    int error_number;
    int in_posn, out_posn;
    int hex1, hex2;

#ifndef _MSC_VER
    unsigned char escaped_string[*length + 1];
#else
    unsigned char* escaped_string = (unsigned char*) _alloca(*length + 1);
#endif

    in_posn = 0;
    out_posn = 0;
    
    do {
        if (input_string[in_posn] == '\\') {
            switch (input_string[in_posn + 1]) {
                case '0': escaped_string[out_posn] = 0x00; /* Null */
                    in_posn += 2;
                    break;
                case 'E': escaped_string[out_posn] = 0x04; /* End of Transmission */







|













|












|







869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
        case BARCODE_ULTRA: error_number = ultracode(symbol, preprocessed, in_length);
            break;
    }

    return error_number;
}

static void strip_bom(unsigned char *source, int *input_length) {
    int i;

    if (*input_length > 3) {
        if((source[0] == 0xef) && (source[1] == 0xbb) && (source[2] == 0xbf)) {
            /* BOM at start of input data, strip in accordance with RFC 3629 */
            for (i = 3; i < *input_length; i++) {
                source[i - 3] = source[i];
            }
            *input_length -= 3;
        }
    }
}

static int escape_char_process(struct zint_symbol *symbol, unsigned char *input_string, int *length) {
    int error_number;
    int in_posn, out_posn;
    int hex1, hex2;

#ifndef _MSC_VER
    unsigned char escaped_string[*length + 1];
#else
    unsigned char* escaped_string = (unsigned char*) _alloca(*length + 1);
#endif

    in_posn = 0;
    out_posn = 0;

    do {
        if (input_string[in_posn] == '\\') {
            switch (input_string[in_posn + 1]) {
                case '0': escaped_string[out_posn] = 0x00; /* Null */
                    in_posn += 2;
                    break;
                case 'E': escaped_string[out_posn] = 0x04; /* End of Transmission */
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
                case 'x': if (in_posn + 4 > *length) {
                        strcpy(symbol->errtxt, "232: Incomplete escape character in input data");
                        return ZINT_ERROR_INVALID_DATA;
                    }
                    hex1 = ctoi(input_string[in_posn + 2]);
                    hex2 = ctoi(input_string[in_posn + 3]);
                    if ((hex1 >= 0) && (hex2 >= 0)) {
                        if (hex1 > 7 && (symbol->input_mode & UNICODE_MODE) != 0) {
                            // Convert to UTF-8
                            escaped_string[out_posn] = 0xc0 + (hex1 >> 2);
                            out_posn++;
                            escaped_string[out_posn] = 0x80 + ((hex1 & 0x03) << 4) + hex2;
                        } else {
                            escaped_string[out_posn] = (hex1 << 4) + hex2;
                        }







|







943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
                case 'x': if (in_posn + 4 > *length) {
                        strcpy(symbol->errtxt, "232: Incomplete escape character in input data");
                        return ZINT_ERROR_INVALID_DATA;
                    }
                    hex1 = ctoi(input_string[in_posn + 2]);
                    hex2 = ctoi(input_string[in_posn + 3]);
                    if ((hex1 >= 0) && (hex2 >= 0)) {
                        if (hex1 > 7 && (symbol->input_mode & 0x07) == UNICODE_MODE) {
                            // Convert to UTF-8
                            escaped_string[out_posn] = 0xc0 + (hex1 >> 2);
                            out_posn++;
                            escaped_string[out_posn] = 0x80 + ((hex1 & 0x03) << 4) + hex2;
                        } else {
                            escaped_string[out_posn] = (hex1 << 4) + hex2;
                        }
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
            }
        } else {
            escaped_string[out_posn] = input_string[in_posn];
            in_posn++;
        }
        out_posn++;
    } while (in_posn < *length);
    
    memcpy(input_string, escaped_string, out_posn);
    input_string[out_posn] = '\0';
    *length = out_posn;
    
    error_number = 0;

    return error_number;
}

int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int in_length) {
    int error_number, error_buffer, i;
    int input_mode = symbol->input_mode;
#ifdef _MSC_VER
    unsigned char* local_source;
#endif
    error_number = 0;

    if (in_length <= 0) {
        in_length = (int)ustrlen(source);







|



|







<







970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988

989
990
991
992
993
994
995
            }
        } else {
            escaped_string[out_posn] = input_string[in_posn];
            in_posn++;
        }
        out_posn++;
    } while (in_posn < *length);

    memcpy(input_string, escaped_string, out_posn);
    input_string[out_posn] = '\0';
    *length = out_posn;

    error_number = 0;

    return error_number;
}

int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int in_length) {
    int error_number, error_buffer, i;

#ifdef _MSC_VER
    unsigned char* local_source;
#endif
    error_number = 0;

    if (in_length <= 0) {
        in_length = (int)ustrlen(source);
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129



















1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143


1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156

1157







1158
1159

1160
1161

1162

1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247

1248

1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
        if (symbol->symbology != 121) {
            strcpy(symbol->errtxt, "215: Symbology out of range, using Code 128");
            symbol->symbology = BARCODE_CODE128;
            error_number = ZINT_WARN_INVALID_OPTION;
        }
    }
    /* Everything from 128 up is Zint-specific */
    if (symbol->symbology >= 145) {
        strcpy(symbol->errtxt, "216: Symbology out of range, using Code 128");
        symbol->symbology = BARCODE_CODE128;
        error_number = ZINT_WARN_INVALID_OPTION;
    }




















    if (error_number > 4) {
        error_tag(symbol->errtxt, error_number);
        return error_number;
    } else {
        error_buffer = error_number;
    }

    if ((!(supports_eci(symbol->symbology))) && (symbol->eci != 3)) {
        strcpy(symbol->errtxt, "217: Symbology does not support ECI switching");
        error_number = ZINT_ERROR_INVALID_OPTION;
    }

    if ((symbol->eci < 3) || (symbol->eci > 999999)) {


        strcpy(symbol->errtxt, "218: Invalid ECI mode");
        error_number = ZINT_ERROR_INVALID_OPTION;
    }

    /* Start acting on input mode */
    if (input_mode == GS1_MODE) {
        for (i = 0; i < in_length; i++) {
            if (source[i] == '\0') {
                strcpy(symbol->errtxt, "219: NULL characters not permitted in GS1 mode");
                error_tag(symbol->errtxt, ZINT_ERROR_INVALID_DATA);
                return ZINT_ERROR_INVALID_DATA;
            }
        }

        if (gs1_compliant(symbol->symbology) == 1) {







            error_number = ugs1_verify(symbol, source, in_length, local_source);
            if (error_number != 0) {

                return error_number;
            }

            in_length =(int)ustrlen(local_source);

        } else {
            strcpy(symbol->errtxt, "220: Selected symbology does not support GS1 mode");
            error_tag(symbol->errtxt, ZINT_ERROR_INVALID_OPTION);
            return ZINT_ERROR_INVALID_OPTION;
        }
    } else {
        memcpy(local_source, source, in_length);
        local_source[in_length] = '\0';
    }

    if (input_mode & ESCAPE_MODE) {
        error_number = escape_char_process(symbol, local_source, &in_length);
        if (error_number != 0) {
            error_tag(symbol->errtxt, error_number);
            return error_number;
        }
        input_mode -= ESCAPE_MODE;
    }

    if ((input_mode < 0) || (input_mode > 2)) {
        input_mode = DATA_MODE;
    }

    if ((symbol->eci != 3) && (symbol->eci != 26)) {
        input_mode = DATA_MODE;
    }

    if (input_mode == UNICODE_MODE) {
        strip_bom(local_source, &in_length);
    }

    if ((symbol->dot_size < 0.01) || (symbol->dot_size > 20.0)) {
        strcpy(symbol->errtxt, "221: Invalid dot size");
        error_tag(symbol->errtxt, ZINT_ERROR_INVALID_OPTION);
        return ZINT_ERROR_INVALID_OPTION;
    }
    
    switch (symbol->symbology) {
        case BARCODE_QRCODE:
        case BARCODE_MICROQR:
        case BARCODE_GRIDMATRIX:
        case BARCODE_HANXIN:
        case BARCODE_UPNQR:
            error_number = extended_charset(symbol, local_source, in_length);
            break;
        default:
            error_number = reduced_charset(symbol, local_source, in_length);
            break;
    }

    if ((error_number == ZINT_ERROR_INVALID_DATA) && (supports_eci(symbol->symbology)
            && (input_mode == UNICODE_MODE))) {
        /* Try another ECI mode */
        symbol->eci = get_best_eci(local_source, in_length);

        switch (symbol->symbology) {
            case BARCODE_QRCODE:
            case BARCODE_MICROQR:
            case BARCODE_GRIDMATRIX:
            case BARCODE_HANXIN:
                {
#ifndef _MSC_VER
                    unsigned char temp[in_length + 1];
#else
                    unsigned char *temp = (unsigned char*) _alloca(in_length + 1);
#endif
                    size_t temp_len = in_length;
                    memcpy(temp, local_source, temp_len);
					temp[temp_len] = '\0';
                    error_number = utf_to_eci(symbol->eci, local_source, temp, &temp_len);
                    if (error_number == 0) {
                        in_length = (int) temp_len;
                        memcpy(local_source, temp, in_length);
                        local_source[in_length] = '\0';
                        error_number = extended_charset(symbol, local_source, in_length);
                    }
                }
                break;
            default:
                error_number = reduced_charset(symbol, local_source, in_length);
                break;
        }
        
        if (error_number == 0) {
            error_number = ZINT_WARN_USES_ECI;

            strcpy(symbol->errtxt, "222: Encoded data includes ECI");

            if (symbol->debug) printf("Data ECI %d\n", symbol->eci);
        }
    }

    if (error_number == 0) {
        if ((symbol->symbology == BARCODE_CODE128) || (symbol->symbology == BARCODE_CODE128B)) {
            for (i = 0; i < in_length; i++) {
                if (local_source[i] == '\0') {
                    symbol->text[i] = ' ';
                } else {
                    symbol->text[i] = local_source[i];
                }
            }
        }
        error_number = error_buffer;
    }
    error_tag(symbol->errtxt, error_number);

    if (error_number <= 5) {
        check_row_heights(symbol);
    }

    return error_number;
}

int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle) {







|




>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>








|
|
<
|
|
|
>
>
|
|
|
|
|
|
|
<
<
<
<
|
|
>

>
>
>
>
>
>
>
|
|
>
|
|
>
|
>





<
<
<


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
|
<
|
|



<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
|
<


>
|
>
|

















|







1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166

1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178




1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202



1203
1204




































1205

1206

1207
1208
1209
1210
1211
























1212

1213

1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
        if (symbol->symbology != 121) {
            strcpy(symbol->errtxt, "215: Symbology out of range, using Code 128");
            symbol->symbology = BARCODE_CODE128;
            error_number = ZINT_WARN_INVALID_OPTION;
        }
    }
    /* Everything from 128 up is Zint-specific */
    if (symbol->symbology > 145) {
        strcpy(symbol->errtxt, "216: Symbology out of range, using Code 128");
        symbol->symbology = BARCODE_CODE128;
        error_number = ZINT_WARN_INVALID_OPTION;
    }

    if ((!(supports_eci(symbol->symbology))) && (symbol->eci != 0)) {
        strcpy(symbol->errtxt, "217: Symbology does not support ECI switching");
        error_number = ZINT_ERROR_INVALID_OPTION;
    }

    if ((symbol->eci < 0) || (symbol->eci == 1) || (symbol->eci == 2) || (symbol->eci > 999999)) {
        strcpy(symbol->errtxt, "218: Invalid ECI mode");
        error_number = ZINT_ERROR_INVALID_OPTION;
    }

    if ((symbol->dot_size < 0.01) || (symbol->dot_size > 20.0)) {
        strcpy(symbol->errtxt, "221: Invalid dot size");
        error_number = ZINT_ERROR_INVALID_OPTION;
    }

    if ((symbol->input_mode & 0x07) > 2) {
        symbol->input_mode = DATA_MODE; /* Reset completely */
    }

    if (error_number > 4) {
        error_tag(symbol->errtxt, error_number);
        return error_number;
    } else {
        error_buffer = error_number;
    }

    memcpy(local_source, source, in_length);
    local_source[in_length] = '\0';


    /* Start acting on input mode */
    if (symbol->input_mode & ESCAPE_MODE) {
        error_number = escape_char_process(symbol, local_source, &in_length);
        if (error_number != 0) {
            error_tag(symbol->errtxt, error_number);
            return error_number;
        }
    }

    if ((symbol->input_mode & 0x07) == UNICODE_MODE) {
        strip_bom(local_source, &in_length);




    }

    if (((symbol->input_mode & 0x07) == GS1_MODE) || (check_force_gs1(symbol->symbology))) {
        if (gs1_compliant(symbol->symbology) == 1) {
            // Reduce input for composite and non-forced symbologies, others (EAN128 and RSS_EXP based) will handle it themselves
            if (is_composite(symbol->symbology) || !check_force_gs1(symbol->symbology)) {
#ifndef _MSC_VER
                char reduced[in_length + 1];
#else
                char* reduced = (char*) _alloca(in_length + 1);
#endif
                error_number = gs1_verify(symbol, local_source, in_length, reduced);
                if (error_number != 0) {
                    error_tag(symbol->errtxt, error_number);
                    return error_number;
                }
                ustrcpy(local_source, reduced); // Cannot contain nul char
                in_length = (int) ustrlen(local_source);
            }
        } else {
            strcpy(symbol->errtxt, "220: Selected symbology does not support GS1 mode");
            error_tag(symbol->errtxt, ZINT_ERROR_INVALID_OPTION);
            return ZINT_ERROR_INVALID_OPTION;
        }



    }





































    error_number = extended_or_reduced_charset(symbol, local_source, in_length);



    if ((error_number == ZINT_ERROR_INVALID_DATA) && symbol->eci == 0 && supports_eci(symbol->symbology)
            && (symbol->input_mode & 0x07) == UNICODE_MODE) {
        /* Try another ECI mode */
        symbol->eci = get_best_eci(local_source, in_length);

























        error_number = extended_or_reduced_charset(symbol, local_source, in_length);



        if (error_number == 0) {
            error_number = ZINT_WARN_USES_ECI;
            if (!(symbol->debug & ZINT_DEBUG_TEST)) {
                strcpy(symbol->errtxt, "222: Encoded data includes ECI");
            }
            if (symbol->debug & ZINT_DEBUG_PRINT) printf("Data ECI %d\n", symbol->eci);
        }
    }

    if (error_number == 0) {
        if ((symbol->symbology == BARCODE_CODE128) || (symbol->symbology == BARCODE_CODE128B)) {
            for (i = 0; i < in_length; i++) {
                if (local_source[i] == '\0') {
                    symbol->text[i] = ' ';
                } else {
                    symbol->text[i] = local_source[i];
                }
            }
        }
        error_number = error_buffer;
    }
    error_tag(symbol->errtxt, error_number);

    if (error_number < 5) {
        check_row_heights(symbol);
    }

    return error_number;
}

int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle) {
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
            }
            error_number = plot_raster(symbol, rotate_angle, OUT_TIF_FILE);
        } else
            if (!(strcmp(output, "TXT"))) {
            error_number = dump_plot(symbol);
        } else
            if (!(strcmp(output, "EPS"))) {
            error_number = plot_vector(symbol, rotate_angle, OUT_EPS_FILE);  
        } else
            if (!(strcmp(output, "SVG"))) {
            error_number = plot_vector(symbol, rotate_angle, OUT_SVG_FILE);
        } else
            if (!(strcmp(output, "EMF"))) {
            error_number = plot_vector(symbol, rotate_angle, OUT_EMF_FILE);
        } else {







|







1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
            }
            error_number = plot_raster(symbol, rotate_angle, OUT_TIF_FILE);
        } else
            if (!(strcmp(output, "TXT"))) {
            error_number = dump_plot(symbol);
        } else
            if (!(strcmp(output, "EPS"))) {
            error_number = plot_vector(symbol, rotate_angle, OUT_EPS_FILE);
        } else
            if (!(strcmp(output, "SVG"))) {
            error_number = plot_vector(symbol, rotate_angle, OUT_SVG_FILE);
        } else
            if (!(strcmp(output, "EMF"))) {
            error_number = plot_vector(symbol, rotate_angle, OUT_EMF_FILE);
        } else {
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
    }

    first_err = error_number;
    error_number = ZBarcode_Buffer(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }
    
    return error_number;
}

int ZBarcode_Encode_and_Buffer_Vector(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) {
    int error_number;
    int first_err;

    error_number = ZBarcode_Encode(symbol, input, length);
    if (error_number >= 5) {
        return error_number;
    }

    first_err = error_number;
    error_number = ZBarcode_Buffer_Vector(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }
    
    return error_number;
}

int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) {
    FILE *file;
    unsigned char *buffer;
    unsigned long fileLen;







|

















|







1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
    }

    first_err = error_number;
    error_number = ZBarcode_Buffer(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }

    return error_number;
}

int ZBarcode_Encode_and_Buffer_Vector(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) {
    int error_number;
    int first_err;

    error_number = ZBarcode_Encode(symbol, input, length);
    if (error_number >= 5) {
        return error_number;
    }

    first_err = error_number;
    error_number = ZBarcode_Buffer_Vector(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }

    return error_number;
}

int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) {
    FILE *file;
    unsigned char *buffer;
    unsigned long fileLen;
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
    int error_number;
    int first_err;

    error_number = ZBarcode_Encode_File(symbol, filename);
    if (error_number >= 5) {
        return error_number;
    }
    
    first_err = error_number;
    error_number = ZBarcode_Print(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }
    
    return error_number;
}

int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle) {
    int error_number;
    int first_err;

    error_number = ZBarcode_Encode_File(symbol, filename);
    if (error_number >= 5) {
        return error_number;
    }
    
    first_err = error_number;
    error_number = ZBarcode_Buffer(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }

    return error_number;
}

int ZBarcode_Encode_File_and_Buffer_Vector(struct zint_symbol *symbol, char *filename, int rotate_angle) {
    int error_number;
    int first_err;

    error_number = ZBarcode_Encode_File(symbol, filename);
    if (error_number >= 5) {
        return error_number;
    }
    
    first_err = error_number;
    error_number = ZBarcode_Buffer_Vector(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }

    return error_number;
}

/*
 * Rendering support, initially added by Sam Lown.
 *
 * Converts encoded data into an intermediate format to be interpreted
 * in other applications using this library.
 *
 * If the width and height are not set to zero, the barcode will be resized to those
 * dimensions. The symbol->scale and symbol->height values are totally ignored in this case.
 *
 */
int ZBarcode_Render(struct zint_symbol *symbol, const float width, const float height) {
    // Send the request to the render_plot method
    return render_plot(symbol, width, height);
}

int ZBarcode_Version() {
    return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE;
}








|





|











|

















|









<
<
<
<
<
<
<
<
<
<
<
<
<
<
<



<
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536















1537
1538
1539

    int error_number;
    int first_err;

    error_number = ZBarcode_Encode_File(symbol, filename);
    if (error_number >= 5) {
        return error_number;
    }

    first_err = error_number;
    error_number = ZBarcode_Print(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }

    return error_number;
}

int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle) {
    int error_number;
    int first_err;

    error_number = ZBarcode_Encode_File(symbol, filename);
    if (error_number >= 5) {
        return error_number;
    }

    first_err = error_number;
    error_number = ZBarcode_Buffer(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }

    return error_number;
}

int ZBarcode_Encode_File_and_Buffer_Vector(struct zint_symbol *symbol, char *filename, int rotate_angle) {
    int error_number;
    int first_err;

    error_number = ZBarcode_Encode_File(symbol, filename);
    if (error_number >= 5) {
        return error_number;
    }

    first_err = error_number;
    error_number = ZBarcode_Buffer_Vector(symbol, rotate_angle);
    if (error_number == 0) {
        error_number = first_err;
    }

    return error_number;
}
















int ZBarcode_Version() {
    return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE;
}

Changes to jni/zint/backend/libzint.rc.
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "040904E4"
    //language ID = U.S. English, char set = Windows, Multilingual
    BEGIN
      VALUE "FileDescription",	"libzint barcode library\0"
      VALUE "FileVersion",	"2.6.0.0\0"
      VALUE "InternalName",	"zint.dll\0"
      VALUE "LegalCopyright",	"Copyright © 2017 Robin Stuart & BogDan Vatra\0"
      VALUE "OriginalFilename",	"zint.dll\0"
      VALUE "ProductName",	"libzint\0"
      VALUE "ProductVersion",	"2.6.0.0\0"
      VALUE "License",  "BSD License version 3\0"
      VALUE "WWW", "http://www.sourceforge.net/projects/zint"      
    END
  END
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x0409, 1250







|




|







21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "040904E4"
    //language ID = U.S. English, char set = Windows, Multilingual
    BEGIN
      VALUE "FileDescription",	"libzint barcode library\0"
      VALUE "FileVersion",	"2.7.0.0\0"
      VALUE "InternalName",	"zint.dll\0"
      VALUE "LegalCopyright",	"Copyright © 2017 Robin Stuart & BogDan Vatra\0"
      VALUE "OriginalFilename",	"zint.dll\0"
      VALUE "ProductName",	"libzint\0"
      VALUE "ProductVersion",	"2.7.0.0\0"
      VALUE "License",  "BSD License version 3\0"
      VALUE "WWW", "http://www.sourceforge.net/projects/zint"      
    END
  END
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x0409, 1250
Changes to jni/zint/backend/mailmark.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* 
 * Developed in accordance with "Royal Mail Mailmark barcode C encoding and deconding instructions"
 * (https://www.royalmail.com/sites/default/files/Mailmark-4-state-barcode-C-encoding-and-decoding-instructions-Sept-2015.pdf)
 * and "Royal Mail Mailmark barcode L encoding and decoding"
 * (https://www.royalmail.com/sites/default/files/Mailmark-4-state-barcode-L-encoding-and-decoding-instructions-Sept-2015.pdf)
 * 







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* 
 * Developed in accordance with "Royal Mail Mailmark barcode C encoding and deconding instructions"
 * (https://www.royalmail.com/sites/default/files/Mailmark-4-state-barcode-C-encoding-and-decoding-instructions-Sept-2015.pdf)
 * and "Royal Mail Mailmark barcode L encoding and decoding"
 * (https://www.royalmail.com/sites/default/files/Mailmark-4-state-barcode-L-encoding-and-decoding-instructions-Sept-2015.pdf)
 * 
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
    3, 5, 7, 11, 13, 14, 16, 17, 19, 0, 1, 2, 4, 6, 8, 9, 10, 12, 15, 18, 20, 21
};

static const unsigned short extender_group_l[26] = {
    2, 5, 7, 8, 13, 14, 15, 16, 21, 22, 23, 0, 1, 3, 4, 6, 9, 10, 11, 12, 17, 18, 19, 20, 24, 25
};

int verify_character(char input, char type) {
    int val = 0;
    
    switch (type) {
        case 'F':
            val = posn(SET_F, input);
            break;
        case 'L':







|







78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
    3, 5, 7, 11, 13, 14, 16, 17, 19, 0, 1, 2, 4, 6, 8, 9, 10, 12, 15, 18, 20, 21
};

static const unsigned short extender_group_l[26] = {
    2, 5, 7, 8, 13, 14, 15, 16, 21, 22, 23, 0, 1, 3, 4, 6, 9, 10, 11, 12, 17, 18, 19, 20, 24, 25
};

static int verify_character(char input, char type) {
    int val = 0;
    
    switch (type) {
        case 'F':
            val = posn(SET_F, input);
            break;
        case 'L':
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
    if (val == -1) {
        return 0;
    } else {
        return 1;
    }
}

int verify_postcode(char* postcode, int type) {
    int i;
    char pattern[11];
    
    strcpy(pattern, postcode_format[type - 1]);

    for (i = 0; i < 9; i++) {
        if (!(verify_character(postcode[i], pattern[i]))) {
            return 1;
        }
    }

    return 0;
}

/* Royal Mail Mailmark */
int mailmark(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) {
    
    char local_source[28];
    int format;
    int version_id;
    int mail_class;
    int supply_chain_id;
    long item_id;







|















|







103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
    if (val == -1) {
        return 0;
    } else {
        return 1;
    }
}

static int verify_postcode(char* postcode, int type) {
    int i;
    char pattern[11];
    
    strcpy(pattern, postcode_format[type - 1]);

    for (i = 0; i < 9; i++) {
        if (!(verify_character(postcode[i], pattern[i]))) {
            return 1;
        }
    }

    return 0;
}

/* Royal Mail Mailmark */
INTERNAL int mailmark(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) {
    
    char local_source[28];
    int format;
    int version_id;
    int mail_class;
    int supply_chain_id;
    long item_id;
Changes to jni/zint/backend/maxicode.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* Includes corrections thanks to Monica Swanson @ Source Technologies */
#include "common.h"
#include "maxicode.h"
#include "reedsol.h"
#include <string.h>
#include <stdlib.h>

int maxi_codeword[144];

/* Handles error correction of primary message */
void maxi_do_primary_check() {
    unsigned char data[15];
    unsigned char results[15];
    int j;
    int datalen = 10;
    int ecclen = 10;

    rs_init_gf(0x43);
    rs_init_code(ecclen, 1);

    for (j = 0; j < datalen; j += 1)
        data[j] = maxi_codeword[j];

    rs_encode(datalen, data, results);

    for (j = 0; j < ecclen; j += 1)
        maxi_codeword[ datalen + j] = results[ecclen - 1 - j];
    rs_free();
}

/* Handles error correction of odd characters in secondary */
void maxi_do_secondary_chk_odd(int ecclen) {
    unsigned char data[100];
    unsigned char results[30];
    int j;
    int datalen = 68;

    rs_init_gf(0x43);
    rs_init_code(ecclen, 1);







>








|


|




















|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* Includes corrections thanks to Monica Swanson @ Source Technologies */
#include "common.h"
#include "maxicode.h"
#include "reedsol.h"
#include <string.h>
#include <stdlib.h>

static int maxi_codeword[144];

/* Handles error correction of primary message */
static void maxi_do_primary_check() {
    unsigned char data[15];
    unsigned char results[15];
    int j;
    int datalen = 10;
    int ecclen = 10;

    rs_init_gf(0x43);
    rs_init_code(ecclen, 1);

    for (j = 0; j < datalen; j += 1)
        data[j] = maxi_codeword[j];

    rs_encode(datalen, data, results);

    for (j = 0; j < ecclen; j += 1)
        maxi_codeword[ datalen + j] = results[ecclen - 1 - j];
    rs_free();
}

/* Handles error correction of odd characters in secondary */
static void maxi_do_secondary_chk_odd(int ecclen) {
    unsigned char data[100];
    unsigned char results[30];
    int j;
    int datalen = 68;

    rs_init_gf(0x43);
    rs_init_code(ecclen, 1);
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

    for (j = 0; j < (ecclen); j += 1)
        maxi_codeword[ datalen + (2 * j) + 1 + 20 ] = results[ecclen - 1 - j];
    rs_free();
}

/* Handles error correction of even characters in secondary */
void maxi_do_secondary_chk_even(int ecclen) {
    unsigned char data[100];
    unsigned char results[30];
    int j;
    int datalen = 68;

    if (ecclen == 20)
        datalen = 84;







|







82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

    for (j = 0; j < (ecclen); j += 1)
        maxi_codeword[ datalen + (2 * j) + 1 + 20 ] = results[ecclen - 1 - j];
    rs_free();
}

/* Handles error correction of even characters in secondary */
static void maxi_do_secondary_chk_even(int ecclen) {
    unsigned char data[100];
    unsigned char results[30];
    int j;
    int datalen = 68;

    if (ecclen == 20)
        datalen = 84;
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156

    for (j = 0; j < (ecclen); j += 1)
        maxi_codeword[ datalen + (2 * j) + 20] = results[ecclen - 1 - j];
    rs_free();
}

/* Moves everything up so that a shift or latch can be inserted */
void maxi_bump(int set[], int character[], int bump_posn) {
    int i;

    for (i = 143; i > bump_posn; i--) {
        set[i] = set[i - 1];
        character[i] = character[i - 1];
    }
}

/* If the value is present in  array, return the value, else return badvalue */
int value_in_array(int val, int arr[], int badvalue, int arrLength){
    int i;
    for(i = 0; i < arrLength; i++){
        if(arr[i] == val) return val;
    }
    return badvalue;
}

/* Choose the best set from previous and next set in the range of the setval array, if no value can be found we return setval[0] */
int bestSurroundingSet(int index, int length, int set[], int setval[], int setLength) {
    int badValue = -1;
    int option1 = value_in_array(set[index - 1], setval, badValue, setLength);
    if (index + 1 < length) {
        // we have two options to check (previous & next)
        int option2 = value_in_array(set[index + 1], setval, badValue, setLength);
        if (option2 != badValue && option1 > option2) {
          return option2;
        }
    }
    //
    if (option1 != badValue) {
      return option1;
    }
    return setval[0];
}

/* Format text according to Appendix A */
int maxi_text_process(int mode, unsigned char source[], int length, int eci) {
    /* This code doesn't make use of [Lock in C], [Lock in D]
    and [Lock in E] and so is not always the most efficient at
    compressing data, but should suffice for most applications */

    int set[144], character[144], i, j, done, count, current_set;

    int set15[2] = { 1, 5 };







|









|








|

















|







106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

    for (j = 0; j < (ecclen); j += 1)
        maxi_codeword[ datalen + (2 * j) + 20] = results[ecclen - 1 - j];
    rs_free();
}

/* Moves everything up so that a shift or latch can be inserted */
static void maxi_bump(int set[], int character[], int bump_posn) {
    int i;

    for (i = 143; i > bump_posn; i--) {
        set[i] = set[i - 1];
        character[i] = character[i - 1];
    }
}

/* If the value is present in  array, return the value, else return badvalue */
static int value_in_array(int val, int arr[], int badvalue, int arrLength) {
    int i;
    for(i = 0; i < arrLength; i++){
        if(arr[i] == val) return val;
    }
    return badvalue;
}

/* Choose the best set from previous and next set in the range of the setval array, if no value can be found we return setval[0] */
static int bestSurroundingSet(int index, int length, int set[], int setval[], int setLength) {
    int badValue = -1;
    int option1 = value_in_array(set[index - 1], setval, badValue, setLength);
    if (index + 1 < length) {
        // we have two options to check (previous & next)
        int option2 = value_in_array(set[index + 1], setval, badValue, setLength);
        if (option2 != badValue && option1 > option2) {
          return option2;
        }
    }
    //
    if (option1 != badValue) {
      return option1;
    }
    return setval[0];
}

/* Format text according to Appendix A */
static int maxi_text_process(int mode, unsigned char source[], int length, int eci) {
    /* This code doesn't make use of [Lock in C], [Lock in D]
    and [Lock in E] and so is not always the most efficient at
    compressing data, but should suffice for most applications */

    int set[144], character[144], i, j, done, count, current_set;

    int set15[2] = { 1, 5 };
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
        } else {
            i++;
        }
    } while (i <= 143);

    /* Insert ECI at the beginning of message if needed */
    /* Encode ECI assignment numbers according to table 3 */
    if (eci != 3) {
        maxi_bump(set, character, 0);
        character[0] = 27; // ECI
        if (eci <= 31) {
            maxi_bump(set, character, 1);
            character[1] = eci;
            length += 2;
        }







|







451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
        } else {
            i++;
        }
    } while (i <= 143);

    /* Insert ECI at the beginning of message if needed */
    /* Encode ECI assignment numbers according to table 3 */
    if (eci != 0) {
        maxi_bump(set, character, 0);
        character[0] = 27; // ECI
        if (eci <= 31) {
            maxi_bump(set, character, 1);
            character[1] = eci;
            length += 2;
        }
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
        }
    }

    return 0;
}

/* Format structured primary for Mode 2 */
void maxi_do_primary_2(char postcode[], int country, int service) {
    size_t postcode_length;
   int    postcode_num, i;

    for (i = 0; i < 10; i++) {
        if ((postcode[i] < '0') || (postcode[i] > '9')) {
            postcode[i] = '\0';
        }







|







530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
        }
    }

    return 0;
}

/* Format structured primary for Mode 2 */
static void maxi_do_primary_2(char postcode[], int country, int service) {
    size_t postcode_length;
   int    postcode_num, i;

    for (i = 0; i < 10; i++) {
        if ((postcode[i] < '0') || (postcode[i] > '9')) {
            postcode[i] = '\0';
        }
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
    maxi_codeword[6] = ((postcode_length & 0x3c) >> 2) | ((country & 0x3) << 4);
    maxi_codeword[7] = (country & 0xfc) >> 2;
    maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2);
    maxi_codeword[9] = ((service & 0x3f0) >> 4);
}

/* Format structured primary for Mode 3 */
void maxi_do_primary_3(char postcode[], int country, int service) {
    int i, h;

    h = strlen(postcode);
    to_upper((unsigned char*) postcode);
    for (i = 0; i < h; i++) {
        if ((postcode[i] >= 'A') && (postcode[i] <= 'Z')) {
            /* (Capital) letters shifted to Code Set A values */







|







556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
    maxi_codeword[6] = ((postcode_length & 0x3c) >> 2) | ((country & 0x3) << 4);
    maxi_codeword[7] = (country & 0xfc) >> 2;
    maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2);
    maxi_codeword[9] = ((service & 0x3f0) >> 4);
}

/* Format structured primary for Mode 3 */
static void maxi_do_primary_3(char postcode[], int country, int service) {
    int i, h;

    h = strlen(postcode);
    to_upper((unsigned char*) postcode);
    for (i = 0; i < h; i++) {
        if ((postcode[i] >= 'A') && (postcode[i] <= 'Z')) {
            /* (Capital) letters shifted to Code Set A values */
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
    maxi_codeword[5] = ((postcode[0] & 0x03) << 4) | ((postcode[1] & 0x3c) >> 2);
    maxi_codeword[6] = ((postcode[0] & 0x3c) >> 2) | ((country & 0x3) << 4);
    maxi_codeword[7] = (country & 0xfc) >> 2;
    maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2);
    maxi_codeword[9] = ((service & 0x3f0) >> 4);
}

int maxicode(struct zint_symbol *symbol, unsigned char local_source[], const int length) {
    int i, j, block, bit, mode, lp = 0;
    int bit_pattern[7], internal_error = 0, eclen;
    char postcode[12], countrystr[4], servicestr[4];

    mode = symbol->option_1;
    strcpy(postcode, "");
    strcpy(countrystr, "");







|







586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
    maxi_codeword[5] = ((postcode[0] & 0x03) << 4) | ((postcode[1] & 0x3c) >> 2);
    maxi_codeword[6] = ((postcode[0] & 0x3c) >> 2) | ((country & 0x3) << 4);
    maxi_codeword[7] = (country & 0xfc) >> 2;
    maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2);
    maxi_codeword[9] = ((service & 0x3f0) >> 4);
}

INTERNAL int maxicode(struct zint_symbol *symbol, unsigned char local_source[], const int length) {
    int i, j, block, bit, mode, lp = 0;
    int bit_pattern[7], internal_error = 0, eclen;
    char postcode[12], countrystr[4], servicestr[4];

    mode = symbol->option_1;
    strcpy(postcode, "");
    strcpy(countrystr, "");
730
731
732
733
734
735
736
737
738
    set_module(symbol, 23, 17);

    symbol->width = 30;
    symbol->rows = 33;

    return internal_error;
}









<
<
731
732
733
734
735
736
737


    set_module(symbol, 23, 17);

    symbol->width = 30;
    symbol->rows = 33;

    return internal_error;
}


Changes to jni/zint/backend/medical.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38

39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "common.h"

extern int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length);

/* Codabar table checked against EN 798:1995 */

#define CALCIUM	"0123456789-$:/.+ABCD"

static const char *CodaTable[20] = {
    "11111221", "11112211", "11121121", "22111111", "11211211", "21111211",
    "12111121", "12112111", "12211111", "21121111", "11122111", "11221111", "21112121", "21211121",
    "21212111", "11212121", "11221211", "12121121", "11121221", "11122211"
};

int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length) {
    /* "Pharmacode can represent only a single integer from 3 to 131070. Unlike other
       commonly used one-dimensional barcode schemes, pharmacode does not store the data in a
       form corresponding to the human-readable digits; the number is encoded in binary, rather
       than decimal. Pharmacode is read from right to left: with n as the bar position starting
       at 0 on the right, each narrow bar adds 2n to the value and each wide bar adds 2(2^n).
       The minimum barcode is 2 bars and the maximum 16, so the smallest number that could
       be encoded is 3 (2 narrow bars) and the biggest is 131070 (16 wide bars)."







>






|
>










|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "common.h"

INTERNAL int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length);

/* Codabar table checked against EN 798:1995 */

#define CALCIUM	"0123456789-$:/.+ABCD"

static const char *CodaTable[20] = {
    "11111221", "11112211", "11121121", "22111111", "11211211", "21111211",
    "12111121", "12112111", "12211111", "21121111", "11122111", "11221111", "21112121", "21211121",
    "21212111", "11212121", "11221211", "12121121", "11121221", "11122211"
};

INTERNAL int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length) {
    /* "Pharmacode can represent only a single integer from 3 to 131070. Unlike other
       commonly used one-dimensional barcode schemes, pharmacode does not store the data in a
       form corresponding to the human-readable digits; the number is encoded in binary, rather
       than decimal. Pharmacode is read from right to left: with n as the bar position starting
       at 0 on the right, each narrow bar adds 2n to the value and each wide bar adds 2(2^n).
       The minimum barcode is 2 bars and the maximum 16, so the smallest number that could
       be encoded is 3 (2 narrow bars) and the biggest is 131070 (16 wide bars)."
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
    }

    expand(symbol, dest);

    return error_number;
}

int pharma_two_calc(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    /* This code uses the Two Track Pharamacode defined in the document at
       http://www.laetus.com/laetus.php?request=file&id=69 and using a modified
       algorithm from the One Track system. This standard accepts integet values
       from 4 to 64570080. */

    unsigned long int tester;
    int counter, h;







|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
    }

    expand(symbol, dest);

    return error_number;
}

static int pharma_two_calc(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    /* This code uses the Two Track Pharamacode defined in the document at
       http://www.laetus.com/laetus.php?request=file&id=69 and using a modified
       algorithm from the One Track system. This standard accepts integet values
       from 4 to 64570080. */

    unsigned long int tester;
    int counter, h;
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
        dest[h - counter] = inter[counter];
    }
    dest[h + 1] = '\0';

    return error_number;
}

int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length) {
    /* Draws the patterns for two track pharmacode */
    char height_pattern[200];
    unsigned int loopey, h;
    int writer;
    int error_number = 0;
    strcpy(height_pattern, "");








|







149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
        dest[h - counter] = inter[counter];
    }
    dest[h + 1] = '\0';

    return error_number;
}

INTERNAL int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length) {
    /* Draws the patterns for two track pharmacode */
    char height_pattern[200];
    unsigned int loopey, h;
    int writer;
    int error_number = 0;
    strcpy(height_pattern, "");

188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
    symbol->width = writer - 1;


    return error_number;
}

/* The Codabar system consisting of simple substitution */
int codabar(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number;
    char dest[512];

    strcpy(dest, "");

    if (length > 60) { /* No stack smashing please */







|







190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
    symbol->width = writer - 1;


    return error_number;
}

/* The Codabar system consisting of simple substitution */
INTERNAL int codabar(struct zint_symbol *symbol, unsigned char source[], int length) {

    int i, error_number;
    char dest[512];

    strcpy(dest, "");

    if (length > 60) { /* No stack smashing please */
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Italian Pharmacode */
int code32(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, zeroes, error_number, checksum, checkpart, checkdigit;
    char localstr[10], risultante[7];
    long int pharmacode, devisor;
    int codeword[6];
    char tabella[34];

    /* Validate the input */







|







230
231
232
233
234
235
236
237
238
239
240
241
242
243
244

    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return error_number;
}

/* Italian Pharmacode */
INTERNAL int code32(struct zint_symbol *symbol, unsigned char source[], int length) {
    int i, zeroes, error_number, checksum, checkpart, checkdigit;
    char localstr[10], risultante[7];
    long int pharmacode, devisor;
    int codeword[6];
    char tabella[34];

    /* Validate the input */
301
302
303
304
305
306
307
308
309

    /* Override the normal text output with the Pharmacode number */
    strcpy((char*) symbol->text, "A");
    strcat((char*) symbol->text, (char*) localstr);

    return error_number;
}









<
<
303
304
305
306
307
308
309



    /* Override the normal text output with the Pharmacode number */
    strcpy((char*) symbol->text, "A");
    strcat((char*) symbol->text, (char*) localstr);

    return error_number;
}


Changes to jni/zint/backend/pcx.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include "pcx.h"        /* PCX header structure */
#include <math.h>
#ifdef _MSC_VER
#include <io.h>
#include <fcntl.h>
#include <malloc.h>
#endif

#define SSET	"0123456789ABCDEF"

int pcx_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int row, column, i, colour;
    int run_count;
    FILE *pcx_file;
    pcx_header_t header;
#ifdef _MSC_VER
    unsigned char* rle_row;







>















|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include "pcx.h"        /* PCX header structure */
#include <math.h>
#ifdef _MSC_VER
#include <io.h>
#include <fcntl.h>
#include <malloc.h>
#endif

#define SSET	"0123456789ABCDEF"

INTERNAL int pcx_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int row, column, i, colour;
    int run_count;
    FILE *pcx_file;
    pcx_header_t header;
#ifdef _MSC_VER
    unsigned char* rle_row;
166
167
168
169
170
171
172
173
        }
    }

    fclose(pcx_file);

    return 0;
}








<
167
168
169
170
171
172
173

        }
    }

    fclose(pcx_file);

    return 0;
}

Changes to jni/zint/backend/pdf417.c.
26
27
28
29
30
31
32

33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/*  This code is adapted from "Code barre PDF 417 / PDF 417 barcode" v2.5.0
    which is Copyright (C) 2004 (Grandzebu).
    The original code can be downloaded from http://grandzebu.net/index.php */

/* NOTE: symbol->option_1 is used to specify the security level (i.e. control the
   number of check codewords)







>







26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/*  This code is adapted from "Code barre PDF 417 / PDF 417 barcode" v2.5.0
    which is Copyright (C) 2004 (Grandzebu).
    The original code can be downloaded from http://grandzebu.net/index.php */

/* NOTE: symbol->option_1 is used to specify the security level (i.e. control the
   number of check codewords)
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* Automatic sizing table */

static const char MicroAutosize[56] = {
    4, 6, 7, 8, 10, 12, 13, 14, 16, 18, 19, 20, 24, 29, 30, 33, 34, 37, 39, 46, 54, 58, 70, 72, 82, 90, 108, 126,
    1, 14, 2, 7, 3, 25, 8, 16, 5, 17, 9, 6, 10, 11, 28, 12, 19, 13, 29, 20, 30, 21, 22, 31, 23, 32, 33, 34
};

int liste[2][1000]; /* global */

/* 866 */

int quelmode(char codeascii) {
    int mode = BYT;
    if ((codeascii == '\t') || (codeascii == '\n') || (codeascii == '\r') || ((codeascii >= ' ') && (codeascii <= '~'))) {
        mode = TEX;
    }
    if ((codeascii >= '0') && (codeascii <= '9')) {
        mode = NUM;
    }
    /* 876 */

    return mode;
}

/* 844 */
void regroupe(int *indexliste) {

    /* bring together same type blocks */
    if (*(indexliste) > 1) {
        int i = 1;
        while (i < *(indexliste)) {
            if (liste[1][i - 1] == liste[1][i]) {
                int j;







|



|













|







78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/* Automatic sizing table */

static const char MicroAutosize[56] = {
    4, 6, 7, 8, 10, 12, 13, 14, 16, 18, 19, 20, 24, 29, 30, 33, 34, 37, 39, 46, 54, 58, 70, 72, 82, 90, 108, 126,
    1, 14, 2, 7, 3, 25, 8, 16, 5, 17, 9, 6, 10, 11, 28, 12, 19, 13, 29, 20, 30, 21, 22, 31, 23, 32, 33, 34
};

static int liste[2][1000]; /* global */

/* 866 */

static int quelmode(char codeascii) {
    int mode = BYT;
    if ((codeascii == '\t') || (codeascii == '\n') || (codeascii == '\r') || ((codeascii >= ' ') && (codeascii <= '~'))) {
        mode = TEX;
    }
    if ((codeascii >= '0') && (codeascii <= '9')) {
        mode = NUM;
    }
    /* 876 */

    return mode;
}

/* 844 */
static void regroupe(int *indexliste) {

    /* bring together same type blocks */
    if (*(indexliste) > 1) {
        int i = 1;
        while (i < *(indexliste)) {
            if (liste[1][i - 1] == liste[1][i]) {
                int j;
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
            i++;
        }
    }
    /* 865 */
}

/* 478 */
void pdfsmooth(int *indexliste) {
    int i, crnt, last, next, length;

    for (i = 0; i < *(indexliste); i++) {
        crnt = liste[1][i];
        length = liste[0][i];
        if (i != 0) {
            last = liste[1][i - 1];







|







124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
            i++;
        }
    }
    /* 865 */
}

/* 478 */
static void pdfsmooth(int *indexliste) {
    int i, crnt, last, next, length;

    for (i = 0; i < *(indexliste); i++) {
        crnt = liste[1][i];
        length = liste[0][i];
        if (i != 0) {
            last = liste[1][i - 1];
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
        }
    }
    /* 540 */
    regroupe(indexliste);
}

/* 547 */
void textprocess(int *chainemc, int *mclength, char chaine[], int start, int length) {
    int j, indexlistet, curtable, listet[2][5000], chainet[5000], wnet;

    wnet = 0;

    for (j = 0; j < 1000; j++) {
        listet[0][j] = 0;
    }







|







220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
        }
    }
    /* 540 */
    regroupe(indexliste);
}

/* 547 */
static void textprocess(int *chainemc, int *mclength, char chaine[], int start, int length) {
    int j, indexlistet, curtable, listet[2][5000], chainet[5000], wnet;

    wnet = 0;

    for (j = 0; j < 1000; j++) {
        listet[0][j] = 0;
    }
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
        chainemc[*(mclength)] = cw_number;
        *(mclength) = *(mclength) + 1;

    }
}

/* 671 */
void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length) {
    int debug = 0;

    if (debug) printf("\nEntering byte mode at position %d\n", start);

    if (length == 1) {
        chainemc[(*mclength)++] = 913;
        chainemc[(*mclength)++] = chaine[start];







|







411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
        chainemc[*(mclength)] = cw_number;
        *(mclength) = *(mclength) + 1;

    }
}

/* 671 */
INTERNAL void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length) {
    int debug = 0;

    if (debug) printf("\nEntering byte mode at position %d\n", start);

    if (length == 1) {
        chainemc[(*mclength)++] = 913;
        chainemc[(*mclength)++] = chaine[start];
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
                }
            }
        }
    }
}

/* 712 */
void numbprocess(int *chainemc, int *mclength, char chaine[], int start, int length) {
    int j, loop, dummy[100], diviseur, nombre;
    char chainemod[50], chainemult[100], temp;

    strcpy(chainemod, "");
    for (loop = 0; loop <= 50; loop++) {
        dummy[loop] = 0;
    }







|







479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
                }
            }
        }
    }
}

/* 712 */
static void numbprocess(int *chainemc, int *mclength, char chaine[], int start, int length) {
    int j, loop, dummy[100], diviseur, nombre;
    char chainemod[50], chainemult[100], temp;

    strcpy(chainemod, "");
    for (loop = 0; loop <= 50; loop++) {
        dummy[loop] = 0;
    }
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
    mclength = 0;

    if (symbol->output_options & READER_INIT) {
        chainemc[mclength] = 921; /* Reader Initialisation */
        mclength++;
    }

    if (symbol->eci != 3) {
        /* Encoding ECI assignment number, according to Table 8 */
        if (symbol->eci <= 899) {
            chainemc[mclength] = 927; /* ECI */
            mclength++;
            chainemc[mclength] = symbol->eci;
            mclength++;
        }







|







603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
    mclength = 0;

    if (symbol->output_options & READER_INIT) {
        chainemc[mclength] = 921; /* Reader Initialisation */
        mclength++;
    }

    if (symbol->eci != 0) {
        /* Encoding ECI assignment number, according to Table 8 */
        if (symbol->eci <= 899) {
            chainemc[mclength] = 927; /* ECI */
            mclength++;
            chainemc[mclength] = symbol->eci;
            mclength++;
        }
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
    symbol->width =(int)strlen(pattern);

    /* 843 */
    return 0;
}

/* 345 */
int pdf417enc(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    int codeerr, error_number;

    error_number = 0;

    if ((symbol->option_1 < -1) || (symbol->option_1 > 8)) {
        strcpy(symbol->errtxt, "460: Security value out of range");
        symbol->option_1 = -1;







|







834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
    symbol->width =(int)strlen(pattern);

    /* 843 */
    return 0;
}

/* 345 */
INTERNAL int pdf417enc(struct zint_symbol *symbol, unsigned char source[], const size_t length) {
    int codeerr, error_number;

    error_number = 0;

    if ((symbol->option_1 < -1) || (symbol->option_1 > 8)) {
        strcpy(symbol->errtxt, "460: Security value out of range");
        symbol->option_1 = -1;
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
    }

    /* 364 */
    return error_number;
}

/* like PDF417 only much smaller! */
int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length) {
    int i, k, j, indexchaine, indexliste, mode, longueur, mccorrection[50], offset;
    int total, chainemc[2700], mclength, dummy[5], codeerr;
    char pattern[580];
    int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster;
    int LeftRAP, CentreRAP, RightRAP, Cluster, loop, calcheight;
    int debug = 0;








|







887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
    }

    /* 364 */
    return error_number;
}

/* like PDF417 only much smaller! */
INTERNAL int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length) {
    int i, k, j, indexchaine, indexliste, mode, longueur, mccorrection[50], offset;
    int total, chainemc[2700], mclength, dummy[5], codeerr;
    char pattern[580];
    int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster;
    int LeftRAP, CentreRAP, RightRAP, Cluster, loop, calcheight;
    int debug = 0;

952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
    }

    if (symbol->eci > 811799) {
        strcpy(symbol->errtxt, "473: Invalid ECI");
        return ZINT_ERROR_INVALID_OPTION;
    }

    if (symbol->eci != 3) {
        /* Encoding ECI assignment number, according to Table 8 */
        if (symbol->eci <= 899) {
            chainemc[mclength] = 927; /* ECI */
            mclength++;
            chainemc[mclength] = symbol->eci;
            mclength++;
        }







|







953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
    }

    if (symbol->eci > 811799) {
        strcpy(symbol->errtxt, "473: Invalid ECI");
        return ZINT_ERROR_INVALID_OPTION;
    }

    if (symbol->eci != 0) {
        /* Encoding ECI assignment number, according to Table 8 */
        if (symbol->eci <= 899) {
            chainemc[mclength] = 927; /* ECI */
            mclength++;
            chainemc[mclength] = symbol->eci;
            mclength++;
        }
1309
1310
1311
1312
1313
1314
1315
1316
1317
    
    for (j = 0; j < i; j++) {
        symbol->row_height[j] = calcheight;
    }

    return codeerr;
}









<
<
1310
1311
1312
1313
1314
1315
1316


    
    for (j = 0; j < i; j++) {
        symbol->row_height[j] = calcheight;
    }

    return codeerr;
}


Changes to jni/zint/backend/plessey.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"


#define SSET	"0123456789ABCDEF"
static const char *PlessTable[16] = {
    "13131313", "31131313", "13311313", "31311313", "13133113", "31133113",
    "13313113", "31313113", "13131331", "31131331", "13311331", "31311331", "13133131",
    "31133131", "13313131", "31313131"
};

static const char *MSITable[10] = {
    "12121212", "12121221", "12122112", "12122121", "12211212", "12211221",
    "12212112", "12212121", "21121212", "21121221"
};

/* Not MSI/Plessey but the older Plessey standard */
int plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length) {

    unsigned int i;
    unsigned char *checkptr;
    static const char grid[9] = {1, 1, 1, 1, 0, 1, 0, 0, 1};
    char dest[1024]; /* 8 + 65 * 8 + 8 * 2 + 9 + 1 ~ 1024 */
    int error_number;








>




















|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"


#define SSET	"0123456789ABCDEF"
static const char *PlessTable[16] = {
    "13131313", "31131313", "13311313", "31311313", "13133113", "31133113",
    "13313113", "31313113", "13131331", "31131331", "13311331", "31311331", "13133131",
    "31133131", "13313131", "31313131"
};

static const char *MSITable[10] = {
    "12121212", "12121221", "12122112", "12122121", "12211212", "12211221",
    "12212112", "12212121", "21121212", "21121221"
};

/* Not MSI/Plessey but the older Plessey standard */
INTERNAL int plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length) {

    unsigned int i;
    unsigned char *checkptr;
    static const char grid[9] = {1, 1, 1, 1, 0, 1, 0, 0, 1};
    char dest[1024]; /* 8 + 65 * 8 + 8 * 2 + 9 + 1 ~ 1024 */
    int error_number;

107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    free(checkptr);
    return error_number;
}

/* Plain MSI Plessey - does not calculate any check character */
int msi_plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length) {

	size_t i;
    char dest[512]; /* 2 + 55 * 8 + 3 + 1 ~ 512 */

    if (length > 55) {
        strcpy(symbol->errtxt, "372: Input too long");
        return ZINT_ERROR_TOO_LONG;







|







108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    free(checkptr);
    return error_number;
}

/* Plain MSI Plessey - does not calculate any check character */
static int msi_plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length) {

	size_t i;
    char dest[512]; /* 2 + 55 * 8 + 3 + 1 ~ 512 */

    if (length > 55) {
        strcpy(symbol->errtxt, "372: Input too long");
        return ZINT_ERROR_TOO_LONG;
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return 0;
}

/* MSI Plessey with Modulo 10 check digit - algorithm from Barcode Island
 * http://www.barcodeisland.com/ */
int msi_plessey_mod10(struct zint_symbol *symbol, unsigned char source[], int length) {


    unsigned long i, wright, dau, pedwar, pump, n;
    char un[200], tri[32];
    int error_number, h;
    char dest[1000];








|







135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
    expand(symbol, dest);
    ustrcpy(symbol->text, source);
    return 0;
}

/* MSI Plessey with Modulo 10 check digit - algorithm from Barcode Island
 * http://www.barcodeisland.com/ */
static int msi_plessey_mod10(struct zint_symbol *symbol, unsigned char source[], int length) {


    unsigned long i, wright, dau, pedwar, pump, n;
    char un[200], tri[32];
    int error_number, h;
    char dest[1000];

201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
    symbol->text[length] = itoc(pump);
    symbol->text[length + 1] = '\0';
    return error_number;
}

/* MSI Plessey with two Modulo 10 check digits - algorithm from
 * Barcode Island http://www.barcodeisland.com/ */
int msi_plessey_mod1010(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) {


    unsigned long i, n, wright, dau, pedwar, pump, chwech;
    char un[16], tri[32];
    int error_number, h;
    char dest[1000];








|







202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
    symbol->text[length] = itoc(pump);
    symbol->text[length + 1] = '\0';
    return error_number;
}

/* MSI Plessey with two Modulo 10 check digits - algorithm from
 * Barcode Island http://www.barcodeisland.com/ */
static int msi_plessey_mod1010(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) {


    unsigned long i, n, wright, dau, pedwar, pump, chwech;
    char un[16], tri[32];
    int error_number, h;
    char dest[1000];

305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
    symbol->text[src_len + 2] = '\0';

    return error_number;
}

/* Calculate a Modulo 11 check digit using the system discussed on Wikipedia -
    see http://en.wikipedia.org/wiki/Talk:MSI_Barcode */
int msi_plessey_mod11(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) {
    /* uses the IBM weight system */
    int i, weight, x, check;
    int error_number;
    char dest[1000];

    error_number = 0;








|







306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
    symbol->text[src_len + 2] = '\0';

    return error_number;
}

/* Calculate a Modulo 11 check digit using the system discussed on Wikipedia -
    see http://en.wikipedia.org/wiki/Talk:MSI_Barcode */
static int msi_plessey_mod11(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) {
    /* uses the IBM weight system */
    int i, weight, x, check;
    int error_number;
    char dest[1000];

    error_number = 0;

363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
    }

    return error_number;
}

/* Combining the Barcode Island and Wikipedia code
 * Verified against http://www.bokai.com/BarcodeJSP/applet/BarcodeSampleApplet.htm */
int msi_plessey_mod1110(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) {
    /* Weighted using the IBM system */
    unsigned long i, weight, x, check, wright, dau, pedwar, pump;
    size_t h;
    long si;
    char un[16], tri[16];
    int error_number;
    char dest[1000];







|







364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
    }

    return error_number;
}

/* Combining the Barcode Island and Wikipedia code
 * Verified against http://www.bokai.com/BarcodeJSP/applet/BarcodeSampleApplet.htm */
static int msi_plessey_mod1110(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) {
    /* Weighted using the IBM system */
    unsigned long i, weight, x, check, wright, dau, pedwar, pump;
    size_t h;
    long si;
    char un[16], tri[16];
    int error_number;
    char dest[1000];
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
    temp[temp_len] = '\0';


    ustrcpy(symbol->text, temp);
    return error_number;
}

int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length) {
    int error_number;

    error_number = is_sane(NEON, source, length);
    if (error_number != 0) {
        strcpy(symbol->errtxt, "377: Invalid characters in input data");
        return ZINT_ERROR_INVALID_DATA;
    }







|







459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
    temp[temp_len] = '\0';


    ustrcpy(symbol->text, temp);
    return error_number;
}

INTERNAL int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length) {
    int error_number;

    error_number = is_sane(NEON, source, length);
    if (error_number != 0) {
        strcpy(symbol->errtxt, "377: Invalid characters in input data");
        return ZINT_ERROR_INVALID_DATA;
    }
487
488
489
490
491
492
493
494
            break;
        case 4: error_number = msi_plessey_mod1110(symbol, source, length);
            break;
    }

    return error_number;
}








<
488
489
490
491
492
493
494

            break;
        case 4: error_number = msi_plessey_mod1110(symbol, source, length);
            break;
    }

    return error_number;
}

Changes to jni/zint/backend/png.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#ifdef _MSC_VER
#include <fcntl.h>
#include <io.h>
#include <malloc.h>
#endif







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#ifdef _MSC_VER
#include <fcntl.h>
#include <io.h>
#include <malloc.h>
#endif
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
                "writepng severe error:  jmpbuf not recoverable; terminating. (F31)\n");
        fflush(stderr);
        return;
    }
    longjmp(graphic->jmpbuf, 1);
}

int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    struct mainprog_info_type wpng_info;
    struct mainprog_info_type *graphic;
    png_structp png_ptr;
    png_infop info_ptr;
    int i, row, column;
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;








|







68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
                "writepng severe error:  jmpbuf not recoverable; terminating. (F31)\n");
        fflush(stderr);
        return;
    }
    longjmp(graphic->jmpbuf, 1);
}

INTERNAL int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    struct mainprog_info_type wpng_info;
    struct mainprog_info_type *graphic;
    png_structp png_ptr;
    png_infop info_ptr;
    int i, row, column;
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;

185
186
187
188
189
190
191
192
193
        fflush(wpng_info.outfile);
    } else {
        fclose(wpng_info.outfile);
    }
    return 0;
}
#endif /* NO_PNG */









<
<
186
187
188
189
190
191
192


        fflush(wpng_info.outfile);
    } else {
        fclose(wpng_info.outfile);
    }
    return 0;
}
#endif /* NO_PNG */


Changes to jni/zint/backend/postal.c.
26
27
28
29
30
31
32

33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif







>







26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

static const char *JapanTable[19] = {
    "114", "132", "312", "123", "141", "321", "213", "231", "411", "144",
    "414", "324", "342", "234", "432", "243", "423", "441", "111"
};

/* Handles the PostNet system used for Zip codes in the US */
int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) {
    unsigned int i, sum, check_digit;
    int error_number;

    error_number = 0;

    if (length != 5 && length != 9 && length != 11) {
        strcpy(symbol->errtxt, "480: Input wrong length");







|







82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

static const char *JapanTable[19] = {
    "114", "132", "312", "123", "141", "321", "213", "231", "411", "144",
    "414", "324", "342", "234", "432", "243", "423", "441", "111"
};

/* Handles the PostNet system used for Zip codes in the US */
static int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) {
    unsigned int i, sum, check_digit;
    int error_number;

    error_number = 0;

    if (length != 5 && length != 9 && length != 11) {
        strcpy(symbol->errtxt, "480: Input wrong length");
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
    /* stop character */
    strcat(dest, "L");

    return error_number;
}

/* Puts PostNet barcodes into the pattern matrix */
int post_plot(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 +  1 ~ 256 */
    unsigned int loopey, h;
    int writer;
    int error_number;

    error_number = 0;








|







117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
    /* stop character */
    strcat(dest, "L");

    return error_number;
}

/* Puts PostNet barcodes into the pattern matrix */
INTERNAL int post_plot(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 +  1 ~ 256 */
    unsigned int loopey, h;
    int writer;
    int error_number;

    error_number = 0;

147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
    symbol->rows = 2;
    symbol->width = writer - 1;

    return error_number;
}

/* Handles the PLANET  system used for item tracking in the US */
int planet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) {
    unsigned int i, sum, check_digit;
    int error_number;

    error_number = 0;

    if (length != 11 && length != 13) {
        strcpy(symbol->errtxt, "482: Input wrong length");







|







148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
    symbol->rows = 2;
    symbol->width = writer - 1;

    return error_number;
}

/* Handles the PLANET  system used for item tracking in the US */
static int planet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) {
    unsigned int i, sum, check_digit;
    int error_number;

    error_number = 0;

    if (length != 11 && length != 13) {
        strcpy(symbol->errtxt, "482: Input wrong length");
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
    /* stop character */
    strcat(dest, "L");

    return error_number;
}

/* Puts PLANET barcodes into the pattern matrix */
int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 +  1 ~ 256 */
    unsigned int loopey, h;
    int writer;
    int error_number;

    error_number = 0;








|







183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
    /* stop character */
    strcat(dest, "L");

    return error_number;
}

/* Puts PLANET barcodes into the pattern matrix */
INTERNAL int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 +  1 ~ 256 */
    unsigned int loopey, h;
    int writer;
    int error_number;

    error_number = 0;

212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
    symbol->row_height[1] = 6;
    symbol->rows = 2;
    symbol->width = writer - 1;
    return error_number;
}

/* Korean Postal Authority */
int korea_post(struct zint_symbol *symbol, unsigned char source[], int length) {
    int total, loop, check, zeroes, error_number;
    char localstr[8], dest[80];

    error_number = 0;
    if (length > 6) {
        strcpy(symbol->errtxt, "484: Input too long");
        return ZINT_ERROR_TOO_LONG;







|







213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
    symbol->row_height[1] = 6;
    symbol->rows = 2;
    symbol->width = writer - 1;
    return error_number;
}

/* Korean Postal Authority */
INTERNAL int korea_post(struct zint_symbol *symbol, unsigned char source[], int length) {
    int total, loop, check, zeroes, error_number;
    char localstr[8], dest[80];

    error_number = 0;
    if (length > 6) {
        strcpy(symbol->errtxt, "484: Input too long");
        return ZINT_ERROR_TOO_LONG;
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
    expand(symbol, dest);
    ustrcpy(symbol->text, (unsigned char*) localstr);
    return error_number;
}

/* The simplest barcode symbology ever! Supported by MS Word, so here it is!
    glyphs from http://en.wikipedia.org/wiki/Facing_Identification_Mark */
int fim(struct zint_symbol *symbol, unsigned char source[], int length) {


    char dest[16] = {0};

    if (length > 1) {
        strcpy(symbol->errtxt, "486: Input too long");
        return ZINT_ERROR_TOO_LONG;







|







253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
    expand(symbol, dest);
    ustrcpy(symbol->text, (unsigned char*) localstr);
    return error_number;
}

/* The simplest barcode symbology ever! Supported by MS Word, so here it is!
    glyphs from http://en.wikipedia.org/wiki/Facing_Identification_Mark */
INTERNAL int fim(struct zint_symbol *symbol, unsigned char source[], int length) {


    char dest[16] = {0};

    if (length > 1) {
        strcpy(symbol->errtxt, "486: Input too long");
        return ZINT_ERROR_TOO_LONG;
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
    }

    expand(symbol, dest);
    return 0;
}

/* Handles the 4 State barcodes used in the UK by Royal Mail */
char rm4scc(char source[], unsigned char dest[], int length) {
    unsigned int i;
    int top, bottom, row, column, check_digit;
    char values[3], set_copy[] = KRSET;

    top = 0;
    bottom = 0;








|







291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
    }

    expand(symbol, dest);
    return 0;
}

/* Handles the 4 State barcodes used in the UK by Royal Mail */
static char rm4scc(char source[], unsigned char dest[], int length) {
    unsigned int i;
    int top, bottom, row, column, check_digit;
    char values[3], set_copy[] = KRSET;

    top = 0;
    bottom = 0;

327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
    /* stop character */
    strcat((char*) dest, "0");

    return set_copy[check_digit];
}

/* Puts RM4SCC into the data matrix */
int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[210];
    unsigned int loopey, h;
    int writer;
    int error_number;
    strcpy(height_pattern, "");

    error_number = 0;







|







328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
    /* stop character */
    strcat((char*) dest, "0");

    return set_copy[check_digit];
}

/* Puts RM4SCC into the data matrix */
INTERNAL int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[210];
    unsigned int loopey, h;
    int writer;
    int error_number;
    strcpy(height_pattern, "");

    error_number = 0;
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387

    return error_number;
}

/* Handles Dutch Post TNT KIX symbols
   The same as RM4SCC but without check digit
   Specification at http://www.tntpost.nl/zakelijk/klantenservice/downloads/kIX_code/download.aspx */
int kix_code(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[75], localstr[20];
    unsigned int loopey;
    int writer, i, h;
    int error_number; /* zeroes; */
    strcpy(height_pattern, "");

    error_number = 0;







|







374
375
376
377
378
379
380
381
382
383
384
385
386
387
388

    return error_number;
}

/* Handles Dutch Post TNT KIX symbols
   The same as RM4SCC but without check digit
   Specification at http://www.tntpost.nl/zakelijk/klantenservice/downloads/kIX_code/download.aspx */
INTERNAL int kix_code(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[75], localstr[20];
    unsigned int loopey;
    int writer, i, h;
    int error_number; /* zeroes; */
    strcpy(height_pattern, "");

    error_number = 0;
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
    symbol->rows = 3;
    symbol->width = writer - 1;

    return error_number;
}

/* Handles DAFT Code symbols */
int daft_code(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[100];
    unsigned int loopey, h;
    int writer, i, error_number;
    strcpy(height_pattern, "");

    error_number = 0;
    if (length > 50) {







|







424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
    symbol->rows = 3;
    symbol->width = writer - 1;

    return error_number;
}

/* Handles DAFT Code symbols */
INTERNAL int daft_code(struct zint_symbol *symbol, unsigned char source[], int length) {
    char height_pattern[100];
    unsigned int loopey, h;
    int writer, i, error_number;
    strcpy(height_pattern, "");

    error_number = 0;
    if (length > 50) {
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
    symbol->rows = 3;
    symbol->width = writer - 1;

    return error_number;
}

/* Flattermarken - Not really a barcode symbology! */
int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length) {
    int loop, error_number;
    char dest[512]; /* 90 * 4 + 1 ~ */

    error_number = 0;

    if (length > 90) {
        strcpy(symbol->errtxt, "494: Input too long");







|







481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
    symbol->rows = 3;
    symbol->width = writer - 1;

    return error_number;
}

/* Flattermarken - Not really a barcode symbology! */
INTERNAL int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length) {
    int loop, error_number;
    char dest[512]; /* 90 * 4 + 1 ~ */

    error_number = 0;

    if (length > 90) {
        strcpy(symbol->errtxt, "494: Input too long");
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
    }

    expand(symbol, dest);
    return error_number;
}

/* Japanese Postal Code (Kasutama Barcode) */
int japan_post(struct zint_symbol *symbol, unsigned char source[], int length) {
    int error_number, h;
    char pattern[69];
    int writer, loopey, inter_posn, i, sum, check;
    char check_char;
    char inter[23];

#ifndef _MSC_VER







|







506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
    }

    expand(symbol, dest);
    return error_number;
}

/* Japanese Postal Code (Kasutama Barcode) */
INTERNAL int japan_post(struct zint_symbol *symbol, unsigned char source[], int length) {
    int error_number, h;
    char pattern[69];
    int writer, loopey, inter_posn, i, sum, check;
    char check_char;
    char inter[23];

#ifndef _MSC_VER
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
    /* Calculate check digit */
    check = 19 - (sum % 19);
    if (check == 19) {
        check = 0;
    }
    if (check <= 9) {
        check_char = check + '0';
    }
    if (check == 10) {
        check_char = '-';
    }
    if (check >= 11) {
        check_char = (check - 11) + 'a';
    }
    strcat(pattern, JapanTable[posn(KASUTSET, check_char)]);

    strcat(pattern, "31"); /* Stop */

    /* Resolve pattern to 4-state symbols */







<
|

|
<







579
580
581
582
583
584
585

586
587
588

589
590
591
592
593
594
595
    /* Calculate check digit */
    check = 19 - (sum % 19);
    if (check == 19) {
        check = 0;
    }
    if (check <= 9) {
        check_char = check + '0';

    } else if (check == 10) {
        check_char = '-';
    } else {

        check_char = (check - 11) + 'a';
    }
    strcat(pattern, JapanTable[posn(KASUTSET, check_char)]);

    strcat(pattern, "31"); /* Stop */

    /* Resolve pattern to 4-state symbols */
Changes to jni/zint/backend/ps.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "common.h"

int ps_plot(struct zint_symbol *symbol) {
    FILE *feps;
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper;
    float cyan_ink, magenta_ink, yellow_ink, black_ink;
    float cyan_paper, magenta_paper, yellow_paper, black_paper;
    int error_number = 0;
    float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy;







>








|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "common.h"

INTERNAL int ps_plot(struct zint_symbol *symbol) {
    FILE *feps;
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper;
    float cyan_ink, magenta_ink, yellow_ink, black_ink;
    float cyan_paper, magenta_paper, yellow_paper, black_paper;
    int error_number = 0;
    float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy;
Changes to jni/zint/backend/qr.c.
1
2
3
4
5
6
7
8
9
10
11
12
/* qr.c Handles QR Code */

/*
    libzint - the open source barcode library
    Copyright (C) 2009 -2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
|

<

|







1
2

3
4
5
6
7
8
9
10
11
/* qr.c Handles QR Code, Micro QR Code, UPNQR and rMQR


    libzint - the open source barcode library
    Copyright (C) 2009 - 2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56


57
58
59
60
61
62
63
64
65
66
67
68
69

70
71
72
73
74


75



76



77


78

79








80



81









82







































































83




84
85
86



87
88
89

90
91
92


93
94










95












96
97
98


99
100


101


102
103
104
105
106

107



108
109

110
111




112


113


114
115

116
117






118
119
120


121
122
123
124

125

126



127


128

129


130

131
132

133









134

135
136


137
138
139

140

141
142



143
144


145
146
147
148
149

150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165

166


167
168

169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

192



193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272

273
274
275
276
277
278

279
280
281
282
283
284
285
286
287
288
289
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <string.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include <stdio.h>
#include "sjis.h"
#include "qr.h"
#include "reedsol.h"
#include <stdlib.h>     /* abs */
#include <assert.h>

extern int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */

/* Returns true if input glyph is in the Alphanumeric set */
static int in_alpha(const int glyph) {
    int retval = 0;
    char cglyph = (char) glyph;

    if ((cglyph >= '0') && (cglyph <= '9')) {
        retval = 1;
    }
    if ((cglyph >= 'A') && (cglyph <= 'Z')) {
        retval = 1;


    }
    switch (cglyph) {
        case ' ':
        case '$':
        case '%':
        case '*':
        case '+':
        case '-':
        case '.':
        case '/':
        case ':':
            retval = 1;
            break;

    }

    return retval;
}



static void define_mode(char mode[],const int jisdata[], const size_t length,const int gs1) {



    /* Values placed into mode[] are: K = Kanji, B = Binary, A = Alphanumeric, N = Numeric */



    size_t i;


    int    mlen, j;










    for (i = 0; i < length; i++) {



        if (jisdata[i] > 0xff) {









            mode[i] = 'K';







































































        } else {




            mode[i] = 'B';
            if (in_alpha(jisdata[i])) {
                mode[i] = 'A';



            }
            if (gs1 && (jisdata[i] == '[')) {
                mode[i] = 'A';

            }
            if ((jisdata[i] >= '0') && (jisdata[i] <= '9')) {
                mode[i] = 'N';


            }
        }










    }













    /* If less than 6 numeric digits together then don't use numeric mode */
    for (i = 0; i < length; i++) {


        if (mode[i] == 'N') {
            if (((i != 0) && (mode[i - 1] != 'N')) || (i == 0)) {


                mlen = 0;


                while (((mlen + i) < length) && (mode[mlen + i] == 'N')) {
                    mlen++;
                };
                if (mlen < 6) {
                    for (j = 0; j < mlen; j++) {

                        mode[i + j] = 'A';



                    }
                }

            }
        }




    }





    /* If less than 4 alphanumeric characters together then don't use alphanumeric mode */
    for (i = 0; i < length; i++) {

        if (mode[i] == 'A') {
            if (((i != 0) && (mode[i - 1] != 'A')) || (i == 0)) {






                mlen = 0;
                while (((mlen + i) < length) && (mode[mlen + i] == 'A')) {
                    mlen++;


                };
                if (mlen < 4) {
                    for (j = 0; j < mlen; j++) {
                        mode[i + j] = 'B';

                    }

                }



            }


        }

    }


}


/* Choose from three numbers based on version */

static int tribus(const int version,const int a,const int b,const int c) {









    int RetVal;


    RetVal = c;



    if (version < 10) {
        RetVal = a;

    }


    if ((version >= 10) && (version <= 26)) {



        RetVal = b;
    }



    return RetVal;
}

/* Convert input data to a binary stream and add padding */

static void qr_binary(int datastream[], const int version, const int target_binlen, const char mode[], const int jisdata[], const size_t length, const int gs1, const int eci, const int est_binlen,const int debug) {
    int position = 0;
    int i;
    char padbits;
    int current_binlen, current_bytes;
    int toggle, percent;
    int percent_count;

#ifndef _MSC_VER
    char binary[est_binlen + 12];
#else
    char* binary = (char *) _alloca(est_binlen + 12);
#endif
    strcpy(binary, "");

    if (gs1) {

        strcat(binary, "0101"); /* FNC1 */


    }


    if (eci != 3) {
        strcat(binary, "0111"); /* ECI (Table 4) */
        if (eci <= 127) {
            bin_append(eci, 8, binary); /* 000000 to 000127 */
        } else if (eci <= 16383) {
            bin_append(0x8000 + eci, 16, binary); /* 000000 to 016383 */
        } else {
            bin_append(0xC00000 + eci, 24, binary); /* 000000 to 999999 */
        }
    }

    if (debug) {
        for (i = 0; i < length; i++) {
            printf("%c", mode[i]);
        }
        printf("\n");
    }

    percent = 0;

    do {
        char data_block = mode[position];
        int short_data_block_length = 0;

        do {



            short_data_block_length++;
        } while (((short_data_block_length + position) < length)
                && (mode[position + short_data_block_length] == data_block));

        switch (data_block) {
            case 'K':
                /* Kanji mode */
                /* Mode indicator */
                strcat(binary, "1000");

                /* Character count indicator */
                bin_append(short_data_block_length, tribus(version, 8, 10, 12), binary);

                if (debug) {
                    printf("Kanji block (length %d)\n\t", short_data_block_length);
                }

                /* Character representation */
                for (i = 0; i < short_data_block_length; i++) {
                    int jis = jisdata[position + i];
                    int prod;

                    if (jis >= 0x8140 && jis <= 0x9ffc)
                        jis -= 0x8140;

                    else if (jis >= 0xe040 && jis <= 0xebbf)
                        jis -= 0xc140;

                    prod = ((jis >> 8) * 0xc0) + (jis & 0xff);

                    bin_append(prod, 13, binary);

                    if (debug) {
                        printf("0x%4X ", prod);
                    }
                }

                if (debug) {
                    printf("\n");
                }

                break;
            case 'B':
                /* Byte mode */
                /* Mode indicator */
                strcat(binary, "0100");

                /* Character count indicator */
                bin_append(short_data_block_length, tribus(version, 8, 16, 16), binary);

                if (debug) {
                    printf("Byte block (length %d)\n\t", short_data_block_length);
                }

                /* Character representation */
                for (i = 0; i < short_data_block_length; i++) {
                    int byte = jisdata[position + i];

                    if (gs1 && (byte == '[')) {
                        byte = 0x1d; /* FNC1 */
                    }

                    bin_append(byte, 8, binary);

                    if (debug) {
                        printf("0x%2X(%d) ", byte, byte);
                    }
                }

                if (debug) {
                    printf("\n");
                }

                break;
            case 'A':
                /* Alphanumeric mode */
                /* Mode indicator */
                strcat(binary, "0010");

                percent_count = 0;

                for (i = 0; i < short_data_block_length; i++) {
                    if (gs1 && (jisdata[position + i] == '%')) {
                        percent_count++;
                    }
                }
                

                /* Character count indicator */
                bin_append(short_data_block_length + percent_count, tribus(version, 9, 11, 13), binary);

                if (debug) {
                    printf("Alpha block (length %d)\n\t", short_data_block_length + percent_count);
                }

                /* Character representation */
                i = 0;
                while (i < short_data_block_length) {
                    int count;







>










<


|


|

<

|

<
|

>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
>





>
>
|
>
>
>
|
>
>
>
|
>
>
|
>

>
>
>
>
>
>
>
>
|
>
>
>
|
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
|
|
|
>
>
>
|
|
<
>
|
|
|
>
>
|
|
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
|
<
<
>
>
|
<
>
>
|
>
>
|
<
<
<
<
>
|
>
>
>
|
|
>
|
|
>
>
>
>

>
>
|
>
>
|
<
>
|
<
>
>
>
>
>
>
|
<
<
>
>
|
<
<
|
>
|
>
|
>
>
>
|
>
>

>

>
>
|
>
|
|
>
|
>
>
>
>
>
>
>
>
>
|
>

<
>
>
|
|
<
>

>
|
|
>
>
>
|

>
>
|
|



>
|


|











|
>
|
>
>
|
|
>
|










|











>

>
>
>








|


|

|





|












|
|



|







|


|

|
|




|





|

|
|



|







|


>
|
|
|
|
|
|
>

|

|







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

42
43
44
45
46
47
48

49
50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197

198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229


230
231
232

233
234
235
236
237
238




239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259

260
261

262
263
264
265
266
267
268


269
270
271


272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305

306
307
308
309

310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <string.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include <stdio.h>
#include "sjis.h"
#include "qr.h"
#include "reedsol.h"

#include <assert.h>

INTERNAL int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */

/* Returns true if input glyph is in the Alphanumeric set */
static int is_alpha(const unsigned int glyph, const int gs1) {
    int retval = 0;


    if ((glyph >= '0') && (glyph <= '9')) {
        retval = 1;

    } else if ((glyph >= 'A') && (glyph <= 'Z')) {
        retval = 1;
    } else if (gs1 && glyph == '[') {
        retval = 1;
    } else {
        switch (glyph) {
            case ' ':
            case '$':
            case '%':
            case '*':
            case '+':
            case '-':
            case '.':
            case '/':
            case ':':
                retval = 1;
                break;
        }
    }

    return retval;
}

/* Bits multiplied by this for costs, so as to be whole integer divisible by 2 and 3 */
#define QR_MULT 6

/* Whether in numeric or not. If in numeric, *p_end is set to position after numeric, and *p_cost is set to per-numeric cost */
static int in_numeric(const unsigned int jisdata[], const size_t length, const int posn, unsigned int* p_end, unsigned int* p_cost) {
    int i, digit_cnt;

    if (posn < *p_end) {
        return 1;
    }

    /* Attempt to calculate the average 'cost' of using numeric mode in number of bits (times QR_MULT) */
    for (i = posn; i < length && i < posn + 4 && jisdata[i] >= '0' && jisdata[i] <= '9'; i++);

    digit_cnt = i - posn;

    if (digit_cnt == 0) {
        *p_end = 0;
        return 0;
    }
    *p_end = i;
    *p_cost = digit_cnt == 1 ? 24 /* 4 * QR_MULT */ : digit_cnt == 2 ? 21 /* (7 / 2) * QR_MULT */ : 20 /* (10 / 3) * QR_MULT) */;
    return 1;
}

/* Whether in alpha or not. If in alpha, *p_end is set to position after alpha, and *p_cost is set to per-alpha cost. For GS1, *p_pcent set if 2nd char percent */
static int in_alpha(const unsigned int jisdata[], const size_t length, const int posn, unsigned int* p_end, unsigned int* p_cost, unsigned int* p_pcent, unsigned int gs1) {
    int two_alphas;

    if (posn < *p_end) {
        if (gs1 && *p_pcent) {
            /* Previous 2nd char was a percent, so allow for second half of doubled-up percent here */
            two_alphas = posn < length - 1 && is_alpha(jisdata[posn + 1], gs1);
            *p_cost = two_alphas ? 33 /* (11 / 2) * QR_MULT */ : 36 /* 6 * QR_MULT */;
            *p_pcent = 0;
        }
        return 1;
    }

    /* Attempt to calculate the average 'cost' of using alphanumeric mode in number of bits (times QR_MULT) */
    if (!is_alpha(jisdata[posn], gs1)) {
        *p_end = 0;
        *p_pcent = 0;
        return 0;
    }

    if (gs1 && jisdata[posn] == '%') { /* Must double-up so counts as 2 chars */
        *p_end = posn + 1;
        *p_cost = 66; /* 11 * QR_MULT */
        *p_pcent = 0;
        return 1;
    }

    two_alphas = posn < length - 1 && is_alpha(jisdata[posn + 1], gs1);

    *p_end = two_alphas ? posn + 2 : posn + 1;
    *p_cost = two_alphas ? 33 /* (11 / 2) * QR_MULT */ : 36 /* 6 * QR_MULT */;
    *p_pcent = two_alphas && gs1 && jisdata[posn + 1] == '%'; /* 2nd char is percent */
    return 1;
}

/* Indexes into mode_types array (and state array) */
#define QR_N   0 /* Numeric */
#define QR_A   1 /* Alphanumeric */
#define QR_B   2 /* Byte */
#define QR_K   3 /* Kanji */

static const char mode_types[] = { 'N', 'A', 'B', 'K', }; /* Must be in same order as QR_N etc */

#define QR_NUM_MODES 4

/* Indexes into state array (0..3 head costs) */
#define QR_VER      4   /* Version */
#define QR_GS1      5   /* GS1 mode (boolean) */
#define QR_N_END    6   /* Numeric end index */
#define QR_N_COST   7   /* Numeric cost */
#define QR_A_END    8   /* Alpha end index */
#define QR_A_COST   9   /* Alpha cost */
#define QR_A_PCENT  10  /* Alpha 2nd char percent (GS1-specific) */

/* Costs set to this for invalid MICROQR modes for versions M1 and M2.
 * 128 is the max number of data bits for M4-L (ISO/IEC 18004:2015 Table 7) */
#define QR_MICROQR_MAX 774 /* (128 + 1) * QR_MULT */

/* Initial mode costs */
static unsigned int* qr_head_costs(unsigned int state[]) {
    static const int head_costs[7][QR_NUM_MODES] = {
        /* N                    A                   B                   K */
        { (10 + 4) * QR_MULT,  (9 + 4) * QR_MULT,  (8 + 4) * QR_MULT,  (8 + 4) * QR_MULT, }, /* QR */
        { (12 + 4) * QR_MULT, (11 + 4) * QR_MULT, (16 + 4) * QR_MULT, (10 + 4) * QR_MULT, },
        { (14 + 4) * QR_MULT, (13 + 4) * QR_MULT, (16 + 4) * QR_MULT, (12 + 4) * QR_MULT, },
        {        3 * QR_MULT,     QR_MICROQR_MAX,     QR_MICROQR_MAX,     QR_MICROQR_MAX, }, /* MICROQR */
        {  (4 + 1) * QR_MULT,  (3 + 1) * QR_MULT,     QR_MICROQR_MAX,     QR_MICROQR_MAX, },
        {  (5 + 2) * QR_MULT,  (4 + 2) * QR_MULT,  (4 + 2) * QR_MULT,  (3 + 2) * QR_MULT, },
        {  (6 + 3) * QR_MULT,  (5 + 3) * QR_MULT,  (5 + 3) * QR_MULT,  (4 + 3) * QR_MULT, }
    };
    int version;

    /* Head costs kept in states 0..3 */
    if (state[QR_N] != 0) { /* Numeric non-zero in all configs */
        return state; /* Already set */
    }

    version = state[QR_VER];

    if (version < RMQR_VERSION) { /* QRCODE */
        if (version < 10) {
            memcpy(state, head_costs, QR_NUM_MODES * sizeof(unsigned int));
        } else if (version < 27) {
            memcpy(state, head_costs + 1, QR_NUM_MODES * sizeof(unsigned int));
        } else {
            memcpy(state, head_costs + 2, QR_NUM_MODES * sizeof(unsigned int));
        }
    } else if (version < MICROQR_VERSION) { /* RMQR */
        version -= RMQR_VERSION;
        state[QR_N] = (rmqr_numeric_cci[version] + 3) * QR_MULT;
        state[QR_A] = (rmqr_alphanum_cci[version] + 3) * QR_MULT;
        state[QR_B] = (rmqr_byte_cci[version] + 3) * QR_MULT;
        state[QR_K] = (rmqr_kanji_cci[version] + 3) * QR_MULT;
    } else { /* MICROQR */
        memcpy(state, head_costs + 3 + (version - MICROQR_VERSION), QR_NUM_MODES * sizeof(unsigned int));
    }


    return state;
}

/* Costs of switching modes from k to j */
static unsigned int qr_switch_cost(unsigned int state[], const int k, const int j) {
    return state[j]; /* Same as head cost */
}

/* Calculate cost of encoding character */
static void qr_cur_cost(unsigned int state[], const unsigned int jisdata[], const size_t length, const int i, char* char_modes, unsigned int prev_costs[], unsigned int cur_costs[]) {
    int cm_i = i * QR_NUM_MODES, m1, m2;
    unsigned int version = state[QR_VER];
    unsigned int gs1 = state[QR_GS1];
    unsigned int* p_numeric_end = &state[QR_N_END];
    unsigned int* p_numeric_cost = &state[QR_N_COST];
    unsigned int* p_alpha_end = &state[QR_A_END];
    unsigned int* p_alpha_cost = &state[QR_A_COST];
    unsigned int* p_alpha_pcent = &state[QR_A_PCENT];

    m1 = version == MICROQR_VERSION;
    m2 = version == MICROQR_VERSION + 1;

    if (jisdata[i] > 0xFF) {
        cur_costs[QR_B] = prev_costs[QR_B] + ((m1 || m2) ? QR_MICROQR_MAX : 96); /* 16 * QR_MULT */
        char_modes[cm_i + QR_B] = 'B';
        cur_costs[QR_K] = prev_costs[QR_K] + ((m1 || m2) ? QR_MICROQR_MAX : 78); /* 13 * QR_MULT */
        char_modes[cm_i + QR_K] = 'K';
    } else {
        if (in_numeric(jisdata, length, i, p_numeric_end, p_numeric_cost)) {
            cur_costs[QR_N] = prev_costs[QR_N] + *p_numeric_cost;
            char_modes[cm_i + QR_N] = 'N';
        }


        if (in_alpha(jisdata, length, i, p_alpha_end, p_alpha_cost, p_alpha_pcent, gs1)) {
            cur_costs[QR_A] = prev_costs[QR_A] + (m1 ? QR_MICROQR_MAX : *p_alpha_cost);
            char_modes[cm_i + QR_A] = 'A';

        }
        cur_costs[QR_B] = prev_costs[QR_B] + ((m1 || m2) ? QR_MICROQR_MAX : 48); /* 8 * QR_MULT */
        char_modes[cm_i + QR_B] = 'B';
    }
}





static void qr_define_mode(char mode[], const unsigned int jisdata[], const size_t length, const int gs1, const int version, const int debug) {
    unsigned int state[11] = {
        0 /*N*/, 0 /*A*/, 0 /*B*/, 0 /*K*/,
        version, gs1,
        0 /*numeric_end*/, 0 /*numeric_cost*/, 0 /*alpha_end*/, 0 /*alpha_cost*/, 0 /*alpha_pcent*/
    };

    pn_define_mode(mode, jisdata, length, debug, state, mode_types, QR_NUM_MODES, qr_head_costs, qr_switch_cost, NULL, qr_cur_cost);
}

/* Return mode indicator bits based on version */
static int mode_bits(const int version) {
    if (version < RMQR_VERSION) {
        return 4; /* QRCODE */
    }
    if (version < MICROQR_VERSION) {
        return 3; /* RMQR */
    }
    return version - MICROQR_VERSION; /* MICROQR */
}


/* Return character count indicator bits based on version and mode */
static int cci_bits(const int version, const int mode) {

    static const int cci_bits[7][QR_NUM_MODES] = {
        /* N   A   B   K */
        { 10,  9,  8,  8, }, /* QRCODE */
        { 12, 11, 16, 10, },
        { 14, 13, 16, 12, },
        {  3,  0,  0,  0, }, /* MICROQR */
        {  4,  3,  0,  0, },


        {  5,  4,  4,  3, },
        {  6,  5,  5,  4, }
    };


    static const unsigned short int* rmqr_ccis[QR_NUM_MODES] = {
        rmqr_numeric_cci, rmqr_alphanum_cci, rmqr_byte_cci, rmqr_kanji_cci,
    };
    int mode_index = strchr(mode_types, mode) - mode_types;

    if (version < RMQR_VERSION) { /* QRCODE */
        if (version < 10) {
            return cci_bits[0][mode_index];
        }
        if (version < 27) {
            return cci_bits[1][mode_index];
        }
        return cci_bits[2][mode_index];
    }
    if (version < MICROQR_VERSION) { /* RMQR */
        return rmqr_ccis[mode_index][version - RMQR_VERSION];
    }
    return cci_bits[3 + (version - MICROQR_VERSION)][mode_index]; /* MICROQR */
}

/* Returns mode indicator based on version and mode */
static const char* mode_indicator(const int version, const int mode) {
    static const char* mode_indicators[6][QR_NUM_MODES] = {
        /*    N       A       B       K */
        { "0001", "0010", "0100", "1000", }, /* QRCODE */
        {  "001",  "010",  "011",  "100", }, /* RMQR */
        {     "",     "",     "",     "", }, /* MICROQR */
        {    "0",    "1",     "",     "", },
        {   "00",   "01",   "10",   "11", },
        {  "000",  "001",  "010",  "011", },
    };

    int mode_index = strchr(mode_types, mode) - mode_types;


    if (version < RMQR_VERSION) {
        return mode_indicators[0][mode_index]; /* QRCODE */
    }
    if (version < MICROQR_VERSION) {

        return mode_indicators[1][mode_index] /* RMQR */;
    }
    return mode_indicators[2 + version - MICROQR_VERSION][mode_index]; /* MICROQR */
}

/* Returns terminator bits based on version */
static int terminator_bits(const int version) {
    if (version < RMQR_VERSION) {
        return 4; /* QRCODE */
    }
    if (version < MICROQR_VERSION) {
        return 3; /* RMQR */
    }
    return 3 + (version - MICROQR_VERSION) * 2; /* MICROQR (Note not actually using this at the moment) */
}

/* Convert input data to a binary stream and add padding */
static void qr_binary(unsigned char datastream[], const int version, const int target_codewords, const char mode[], const unsigned int jisdata[], const size_t length,
            const int gs1, const int eci, const int est_binlen, const int debug) {
    int position = 0;
    int i;
    int termbits, padbits;
    int current_binlen, current_bytes;
    int toggle, percent;
    int percent_count;

#ifndef _MSC_VER
    char binary[est_binlen + 12];
#else
    char* binary = (char *) _alloca(est_binlen + 12);
#endif
    strcpy(binary, "");

    if (gs1) { /* Not applicable to MICROQR */
        if (version < RMQR_VERSION) {
            strcat(binary, "0101"); /* FNC1 */
        } else {
            strcat(binary, "101");
        }
    }

    if (eci != 0) { /* Not applicable to RMQR or MICROQR */
        strcat(binary, "0111"); /* ECI (Table 4) */
        if (eci <= 127) {
            bin_append(eci, 8, binary); /* 000000 to 000127 */
        } else if (eci <= 16383) {
            bin_append(0x8000 + eci, 16, binary); /* 000000 to 016383 */
        } else {
            bin_append(0xC00000 + eci, 24, binary); /* 000000 to 999999 */
        }
    }

    if (debug & ZINT_DEBUG_PRINT) {
        for (i = 0; i < length; i++) {
            printf("%c", mode[i]);
        }
        printf("\n");
    }

    percent = 0;

    do {
        char data_block = mode[position];
        int short_data_block_length = 0;
        int double_byte = 0;
        do {
            if (data_block == 'B' && jisdata[position + short_data_block_length] > 0xFF) {
                double_byte++;
            }
            short_data_block_length++;
        } while (((short_data_block_length + position) < length)
                && (mode[position + short_data_block_length] == data_block));

        switch (data_block) {
            case 'K':
                /* Kanji mode */
                /* Mode indicator */
                strcat(binary, mode_indicator(version, data_block));

                /* Character count indicator */
                bin_append(short_data_block_length, cci_bits(version, data_block), binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Kanji block (length %d)\n\t", short_data_block_length);
                }

                /* Character representation */
                for (i = 0; i < short_data_block_length; i++) {
                    unsigned int jis = jisdata[position + i];
                    int prod;

                    if (jis >= 0x8140 && jis <= 0x9ffc)
                        jis -= 0x8140;

                    else if (jis >= 0xe040 && jis <= 0xebbf)
                        jis -= 0xc140;

                    prod = ((jis >> 8) * 0xc0) + (jis & 0xff);

                    bin_append(prod, 13, binary);

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("0x%04X ", prod);
                    }
                }

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }

                break;
            case 'B':
                /* Byte mode */
                /* Mode indicator */
                strcat(binary, mode_indicator(version, data_block));

                /* Character count indicator */
                bin_append(short_data_block_length + double_byte, cci_bits(version, data_block), binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Byte block (length %d)\n\t", short_data_block_length + double_byte);
                }

                /* Character representation */
                for (i = 0; i < short_data_block_length; i++) {
                    unsigned int byte = jisdata[position + i];

                    if (gs1 && (byte == '[')) {
                        byte = 0x1d; /* FNC1 */
                    }

                    bin_append(byte, byte > 0xFF ? 16 : 8, binary);

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("0x%02X(%d) ", byte, byte);
                    }
                }

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }

                break;
            case 'A':
                /* Alphanumeric mode */
                /* Mode indicator */
                strcat(binary, mode_indicator(version, data_block));

                percent_count = 0;
                if (gs1) {
                    for (i = 0; i < short_data_block_length; i++) {
                        if (jisdata[position + i] == '%') {
                            percent_count++;
                        }
                    }
                }

                /* Character count indicator */
                bin_append(short_data_block_length + percent_count, cci_bits(version, data_block), binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Alpha block (length %d)\n\t", short_data_block_length + percent_count);
                }

                /* Character representation */
                i = 0;
                while (i < short_data_block_length) {
                    int count;
348
349
350
351
352
353
354
355
356
357
358
359

360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
                                prod = (first * 45) + second;
                            }
                        }
                    }

                    bin_append(prod, 1 + (5 * count), binary);

                    if (debug) {
                        printf("0x%4X ", prod);
                    }
                };


                if (debug) {
                    printf("\n");
                }

                break;
            case 'N':
                /* Numeric mode */
                /* Mode indicator */
                strcat(binary, "0001");

                /* Character count indicator */
                bin_append(short_data_block_length, tribus(version, 10, 12, 14), binary);

                if (debug) {
                    printf("Number block (length %d)\n\t", short_data_block_length);
                }

                /* Character representation */
                i = 0;
                while (i < short_data_block_length) {
                    int count;







|
|

<
|
>
|







|


|

|







536
537
538
539
540
541
542
543
544
545

546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
                                prod = (first * 45) + second;
                            }
                        }
                    }

                    bin_append(prod, 1 + (5 * count), binary);

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("0x%X ", prod);
                    }

                }

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }

                break;
            case 'N':
                /* Numeric mode */
                /* Mode indicator */
                strcat(binary, mode_indicator(version, data_block));

                /* Character count indicator */
                bin_append(short_data_block_length, cci_bits(version, data_block), binary);

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("Number block (length %d)\n\t", short_data_block_length);
                }

                /* Character representation */
                i = 0;
                while (i < short_data_block_length) {
                    int count;
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417






418
419



420





421



422
423
424
425

426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472

















473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
                            count = 3;
                            prod = (prod * 10) + third;
                        }
                    }

                    bin_append(prod, 1 + (3 * count), binary);

                    if (debug) {
                        printf("0x%4X (%d)", prod, prod);
                    }

                    i += count;
                };

                if (debug) {
                    printf("\n");
                }

                break;
        }

        position += short_data_block_length;
    } while (position < length);







    /* Terminator */
    strcat(binary, "0000");









    current_binlen = (int)strlen(binary);



    padbits = 8 - (current_binlen % 8);
    if (padbits == 8) {
        padbits = 0;
    }

    current_bytes = (current_binlen + padbits) / 8;

    /* Padding bits */
    for (i = 0; i < padbits; i++) {
        strcat(binary, "0");
    }

    /* Put data into 8-bit codewords */
    for (i = 0; i < current_bytes; i++) {
        int p;
        datastream[i] = 0x00;
        for (p = 0; p < 8; p++) {
            if (binary[i * 8 + p] == '1') {
                datastream[i] += (0x80 >> p);
            }
        }
    }

    /* Add pad codewords */
    toggle = 0;
    for (i = current_bytes; i < target_binlen; i++) {
        if (toggle == 0) {
            datastream[i] = 0xec;
            toggle = 1;
        } else {
            datastream[i] = 0x11;
            toggle = 0;
        }
    }

    if (debug) {
        printf("Resulting codewords:\n\t");
        for (i = 0; i < target_binlen; i++) {
            printf("0x%2X ", datastream[i]);
        }
        printf("\n");
    }
}

/* Split data into blocks, add error correction and then interleave the blocks and error correction data */
static void add_ecc(int fullstream[],const int datastream[],const int version,const int data_cw,const int blocks) {
    int ecc_cw = qr_total_codewords[version - 1] - data_cw;
    int short_data_block_length = data_cw / blocks;
    int qty_long_blocks = data_cw % blocks;
    int qty_short_blocks = blocks - qty_long_blocks;
    int ecc_block_length = ecc_cw / blocks;
    int i, j, length_this_block, posn, debug = 0;



















#ifndef _MSC_VER
    unsigned char data_block[short_data_block_length + 2];
    unsigned char ecc_block[ecc_block_length + 2];
    int interleaved_data[data_cw + 2];
    int interleaved_ecc[ecc_cw + 2];
#else
    unsigned char* data_block = (unsigned char *) _alloca(short_data_block_length + 2);
    unsigned char* ecc_block = (unsigned char *) _alloca(ecc_block_length + 2);
    int* interleaved_data = (int *) _alloca((data_cw + 2) * sizeof (int));
    int* interleaved_ecc = (int *) _alloca((ecc_cw + 2) * sizeof (int));
#endif

    posn = 0;

    for (i = 0; i < blocks; i++) {
        if (i < qty_short_blocks) {
            length_this_block = short_data_block_length;
        } else {
            length_this_block = short_data_block_length + 1;
        }

        for (j = 0; j < ecc_block_length; j++) {
            ecc_block[j] = 0;
        }

        for (j = 0; j < length_this_block; j++) {
            data_block[j] = (unsigned char) datastream[posn + j];
        }

        rs_init_gf(0x11d);
        rs_init_code(ecc_block_length, 0);
        rs_encode(length_this_block, data_block, ecc_block);
        rs_free();

        if (debug) {
            printf("Block %d: ", i + 1);
            for (j = 0; j < length_this_block; j++) {
                printf("%2X ", data_block[j]);
            }
            if (i < qty_short_blocks) {
                printf("   ");
            }
            printf(" // ");
            for (j = 0; j < ecc_block_length; j++) {
                printf("%2X ", ecc_block[ecc_block_length - j - 1]);
            }
            printf("\n");
        }

        for (j = 0; j < short_data_block_length; j++) {
            interleaved_data[(j * blocks) + i] = (int) data_block[j];
        }

        if (i >= qty_short_blocks) {
            interleaved_data[(short_data_block_length * blocks) + (i - qty_short_blocks)] = (int) data_block[short_data_block_length];
        }

        for (j = 0; j < ecc_block_length; j++) {
            interleaved_ecc[(j * blocks) + i] = (int) ecc_block[ecc_block_length - j - 1];
        }

        posn += length_this_block;
    }

    for (j = 0; j < data_cw; j++) {
        fullstream[j] = interleaved_data[j];
    }
    for (j = 0; j < ecc_cw; j++) {
        fullstream[j + data_cw] = interleaved_ecc[j];
    }

    if (debug) {
        printf("\nData Stream: \n");
        for (j = 0; j < (data_cw + ecc_cw); j++) {
            printf("%2X ", fullstream[j]);
        }
        printf("\n");
    }
}







|
|





|









>
>
>
>
>
>

|
>
>
>
|
>
>
>
>
>
|
>
>
>
|



>
|
|
<
<
<















|









|

|
|






|
|
|
|
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





|
|

|
|
|
|
















|







|















|



|



|












|







582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633



634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
                            count = 3;
                            prod = (prod * 10) + third;
                        }
                    }

                    bin_append(prod, 1 + (3 * count), binary);

                    if (debug & ZINT_DEBUG_PRINT) {
                        printf("0x%X(%d) ", prod, prod);
                    }

                    i += count;
                };

                if (debug & ZINT_DEBUG_PRINT) {
                    printf("\n");
                }

                break;
        }

        position += short_data_block_length;
    } while (position < length);

    if (version >= MICROQR_VERSION && version < MICROQR_VERSION + 4) {
        /* MICROQR does its own terminating/padding */
        strcpy((char*)datastream, binary);
        return;
    }

    /* Terminator */
    current_binlen = (int)strlen(binary);
    termbits = 8 - current_binlen % 8;
    if (termbits == 8) {
        termbits = 0;
    }
    current_bytes = (current_binlen + termbits) / 8;
    if (termbits || current_bytes < target_codewords) {
        int max_termbits = terminator_bits(version);
        termbits = termbits < max_termbits && current_bytes == target_codewords ? termbits : max_termbits;
        bin_append(0, termbits, binary);
        current_binlen += termbits;
    }

    /* Padding bits */
    padbits = 8 - current_binlen % 8;
    if (padbits == 8) {
        padbits = 0;
    }
    if (padbits) {
        current_bytes = (current_binlen + padbits) / 8;
        bin_append(0, padbits, binary);



    }

    /* Put data into 8-bit codewords */
    for (i = 0; i < current_bytes; i++) {
        int p;
        datastream[i] = 0x00;
        for (p = 0; p < 8; p++) {
            if (binary[i * 8 + p] == '1') {
                datastream[i] += (0x80 >> p);
            }
        }
    }

    /* Add pad codewords */
    toggle = 0;
    for (i = current_bytes; i < target_codewords; i++) {
        if (toggle == 0) {
            datastream[i] = 0xec;
            toggle = 1;
        } else {
            datastream[i] = 0x11;
            toggle = 0;
        }
    }

    if (debug & ZINT_DEBUG_PRINT) {
        printf("Resulting codewords:\n\t");
        for (i = 0; i < target_codewords; i++) {
            printf("0x%02X ", datastream[i]);
        }
        printf("\n");
    }
}

/* Split data into blocks, add error correction and then interleave the blocks and error correction data */
static void add_ecc(unsigned char fullstream[], const unsigned char datastream[], const int version, const int data_cw, const int blocks, int debug) {
    int ecc_cw;
    int short_data_block_length;
    int qty_long_blocks;
    int qty_short_blocks;
    int ecc_block_length;
    int i, j, length_this_block, posn;
#ifdef _MSC_VER
    unsigned char* data_block;
    unsigned char* ecc_block;
    unsigned char* interleaved_data;
    unsigned char* interleaved_ecc;
#endif

    if (version < RMQR_VERSION) {
        ecc_cw = qr_total_codewords[version - 1] - data_cw;
    } else {
        ecc_cw = rmqr_total_codewords[version - RMQR_VERSION] - data_cw;
    }

    short_data_block_length = data_cw / blocks;
    qty_long_blocks = data_cw % blocks;
    qty_short_blocks = blocks - qty_long_blocks;
    ecc_block_length = ecc_cw / blocks;


#ifndef _MSC_VER
    unsigned char data_block[short_data_block_length + 2];
    unsigned char ecc_block[ecc_block_length + 2];
    unsigned char interleaved_data[data_cw + 2];
    unsigned char interleaved_ecc[ecc_cw + 2];
#else
    data_block = (unsigned char *) _alloca(short_data_block_length + 2);
    ecc_block = (unsigned char *) _alloca(ecc_block_length + 2);
    interleaved_data = (unsigned char *) _alloca(data_cw + 2);
    interleaved_ecc = (unsigned char *) _alloca(ecc_cw + 2);
#endif

    posn = 0;

    for (i = 0; i < blocks; i++) {
        if (i < qty_short_blocks) {
            length_this_block = short_data_block_length;
        } else {
            length_this_block = short_data_block_length + 1;
        }

        for (j = 0; j < ecc_block_length; j++) {
            ecc_block[j] = 0;
        }

        for (j = 0; j < length_this_block; j++) {
            data_block[j] = datastream[posn + j];
        }

        rs_init_gf(0x11d);
        rs_init_code(ecc_block_length, 0);
        rs_encode(length_this_block, data_block, ecc_block);
        rs_free();

        if (debug & ZINT_DEBUG_PRINT) {
            printf("Block %d: ", i + 1);
            for (j = 0; j < length_this_block; j++) {
                printf("%2X ", data_block[j]);
            }
            if (i < qty_short_blocks) {
                printf("   ");
            }
            printf(" // ");
            for (j = 0; j < ecc_block_length; j++) {
                printf("%2X ", ecc_block[ecc_block_length - j - 1]);
            }
            printf("\n");
        }

        for (j = 0; j < short_data_block_length; j++) {
            interleaved_data[(j * blocks) + i] = data_block[j];
        }

        if (i >= qty_short_blocks) {
            interleaved_data[(short_data_block_length * blocks) + (i - qty_short_blocks)] = data_block[short_data_block_length];
        }

        for (j = 0; j < ecc_block_length; j++) {
            interleaved_ecc[(j * blocks) + i] = ecc_block[ecc_block_length - j - 1];
        }

        posn += length_this_block;
    }

    for (j = 0; j < data_cw; j++) {
        fullstream[j] = interleaved_data[j];
    }
    for (j = 0; j < ecc_cw; j++) {
        fullstream[j + data_cw] = interleaved_ecc[j];
    }

    if (debug & ZINT_DEBUG_PRINT) {
        printf("\nData Stream: \n");
        for (j = 0; j < (data_cw + ecc_cw); j++) {
            printf("%2X ", fullstream[j]);
        }
        printf("\n");
    }
}
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684

685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
            grid[(i * size) + (size - 9)] = 0x20;
            grid[(i * size) + (size - 10)] = 0x20;
            grid[(i * size) + (size - 11)] = 0x20;
        }
    }
}

static int cwbit(const int* fullstream,const int i) {
    int resultant = 0;

    if (fullstream[(i / 8)] & (0x80 >> (i % 8))) {
        resultant = 1;
    }

    return resultant;
}

static void populate_grid(unsigned char* grid,const int size,const int* fullstream,const int cw) {
    int direction = 1; /* up */
    int row = 0; /* right hand side */

    int i, n, y;

    n = cw * 8;
    y = size - 1;
    i = 0;
    do {
        int x = (size - 2) - (row * 2);
        if (x < 6)

            x--; /* skip over vertical timing pattern */

        if (!(grid[(y * size) + (x + 1)] & 0xf0)) {
            if (cwbit(fullstream, i)) {
                grid[(y * size) + (x + 1)] = 0x01;
            } else {
                grid[(y * size) + (x + 1)] = 0x00;
            }
            i++;
        }

        if (i < n) {
            if (!(grid[(y * size) + x] & 0xf0)) {
                if (cwbit(fullstream, i)) {
                    grid[(y * size) + x] = 0x01;
                } else {
                    grid[(y * size) + x] = 0x00;
                }
                i++;
            }
        }

        if (direction) {
            y--;
        } else {
            y++;
        }
        if (y == -1) {
            /* reached the top */
            row++;
            y = 0;
            direction = 0;
        }
        if (y == size) {
            /* reached the bottom */
            row++;
            y = size - 1;
            direction = 1;
        }
    } while (i < n);
}

#ifdef ZINTLOG

int append_log(char log) {
    FILE *file;

    file = fopen("zintlog.txt", "a+");
    fprintf(file, "%c", log);
    fclose(file);
    return 0;
}

int write_log(char log[]) {
    FILE *file;

    file = fopen("zintlog.txt", "a+");
    fprintf(file, log); /*writes*/
    fprintf(file, "\r\n"); /*writes*/
    fclose(file);
    return 0;







|









|






|


|
|
>


|

|

|





|

|

|
















|


|







|








|







876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
            grid[(i * size) + (size - 9)] = 0x20;
            grid[(i * size) + (size - 10)] = 0x20;
            grid[(i * size) + (size - 11)] = 0x20;
        }
    }
}

static int cwbit(const unsigned char* fullstream, const int i) {
    int resultant = 0;

    if (fullstream[(i / 8)] & (0x80 >> (i % 8))) {
        resultant = 1;
    }

    return resultant;
}

static void populate_grid(unsigned char* grid, const int h_size, const int v_size, const unsigned char* fullstream, const int cw) {
    int direction = 1; /* up */
    int row = 0; /* right hand side */

    int i, n, y;

    n = cw * 8;
    y = v_size - 1;
    i = 0;
    do {
        int x = (h_size - 2) - (row * 2);

        if ((x < 6) && (v_size == h_size))
            x--; /* skip over vertical timing pattern */

        if (!(grid[(y * h_size) + (x + 1)] & 0xf0)) {
            if (cwbit(fullstream, i)) {
                grid[(y * h_size) + (x + 1)] = 0x01;
            } else {
                grid[(y * h_size) + (x + 1)] = 0x00;
            }
            i++;
        }

        if (i < n) {
            if (!(grid[(y * h_size) + x] & 0xf0)) {
                if (cwbit(fullstream, i)) {
                    grid[(y * h_size) + x] = 0x01;
                } else {
                    grid[(y * h_size) + x] = 0x00;
                }
                i++;
            }
        }

        if (direction) {
            y--;
        } else {
            y++;
        }
        if (y == -1) {
            /* reached the top */
            row++;
            y = 0;
            direction = 0;
        }
        if (y == v_size) {
            /* reached the bottom */
            row++;
            y = v_size - 1;
            direction = 1;
        }
    } while (i < n);
}

#ifdef ZINTLOG

static int append_log(char log) {
    FILE *file;

    file = fopen("zintlog.txt", "a+");
    fprintf(file, "%c", log);
    fclose(file);
    return 0;
}

static int write_log(char log[]) {
    FILE *file;

    file = fopen("zintlog.txt", "a+");
    fprintf(file, log); /*writes*/
    fprintf(file, "\r\n"); /*writes*/
    fclose(file);
    return 0;
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337

1338


1339
1340



1341


1342



1343
1344
1345
1346
1347

1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365

1366
1367
1368
1369
1370
1371
1372

1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402




1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432


1433
1434
1435



1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
        grid[((size - 9) * size) + i] += (version_data >> ((i * 3) + 2)) & 0x41;
        grid[(i * size) + (size - 11)] += (version_data >> (i * 3)) & 0x41;
        grid[(i * size) + (size - 10)] += (version_data >> ((i * 3) + 1)) & 0x41;
        grid[(i * size) + (size - 9)] += (version_data >> ((i * 3) + 2)) & 0x41;
    }
}

/* Implements a custom optimisation algorithm, more efficient than that
   given in Annex J. */
static void applyOptimisation(const int version,char inputMode[], const size_t inputLength) {


    int blockCount = 0, block;
    int i, j;
    char currentMode = ' '; // Null
    int *blockLength;
    char *blockMode;

    for (i = 0; i < inputLength; i++) {
        if (inputMode[i] != currentMode) {
            currentMode = inputMode[i];
            blockCount++;
        }
    }

    blockLength = (int*) malloc(sizeof (int)*blockCount);
    assert(blockLength);
    if (!blockLength) return;
    blockMode = (char*) malloc(sizeof (char)*blockCount);
    assert(blockMode);
    if (!blockMode) {
        free(blockLength);
        return;
    }

    j = -1;
    currentMode = ' '; // Null
    for (i = 0; i < inputLength; i++) {
        if (inputMode[i] != currentMode) {
            j++;
            blockLength[j] = 1;
            blockMode[j] = inputMode[i];
            currentMode = inputMode[i];
        } else {
            blockLength[j]++;
        }
    }

    if (blockCount > 1) {
        // Search forward
        for (i = 0; i <= (blockCount - 2); i++) {
            if (blockMode[i] == 'B') {
                switch (blockMode[i + 1]) {
                    case 'K':
                        if (blockLength[i + 1] < tribus(version, 4, 5, 6)) {
                            blockMode[i + 1] = 'B';
                        }
                        break;
                    case 'A':
                        if (blockLength[i + 1] < tribus(version, 7, 8, 9)) {
                            blockMode[i + 1] = 'B';
                        }
                        break;
                    case 'N':
                        if (blockLength[i + 1] < tribus(version, 3, 4, 5)) {
                            blockMode[i + 1] = 'B';
                        }
                        break;
                }
            }

            if ((blockMode[i] == 'A')
                    && (blockMode[i + 1] == 'N')) {
                if (blockLength[i + 1] < tribus(version, 6, 8, 10)) {
                    blockMode[i + 1] = 'A';
                }
            }
        }

        // Search backward
        for (i = blockCount - 1; i > 0; i--) {
            if (blockMode[i] == 'B') {
                switch (blockMode[i - 1]) {
                    case 'K':
                        if (blockLength[i - 1] < tribus(version, 4, 5, 6)) {
                            blockMode[i - 1] = 'B';
                        }
                        break;
                    case 'A':
                        if (blockLength[i - 1] < tribus(version, 7, 8, 9)) {
                            blockMode[i - 1] = 'B';
                        }
                        break;
                    case 'N':
                        if (blockLength[i - 1] < tribus(version, 3, 4, 5)) {
                            blockMode[i - 1] = 'B';
                        }
                        break;
                }
            }

            if ((blockMode[i] == 'A')
                    && (blockMode[i - 1] == 'N')) {
                if (blockLength[i - 1] < tribus(version, 6, 8, 10)) {
                    blockMode[i - 1] = 'A';
                }
            }
        }
    }

    j = 0;
    for (block = 0; block < blockCount; block++) {
        currentMode = blockMode[block];
        for (i = 0; i < blockLength[block]; i++) {
            inputMode[j] = currentMode;
            j++;
        }
    }

    free(blockLength);
    free(blockMode);
}

static size_t blockLength(const size_t start,const char inputMode[],const size_t inputLength) {
    /* Find the length of the block starting from 'start' */
    size_t i;
    int    count;
    char mode = inputMode[start];

    count = 0;
    i = start;

    do {
        count++;
    } while (((i + count) < inputLength) && (inputMode[i + count] == mode));

    return count;
}

static int getBinaryLength(const int version,char inputMode[],const int inputData[],const size_t inputLength,const int gs1,const int eci) {
    /* Calculate the actual bitlength of the proposed binary string */
    size_t i;
    char currentMode;
    int    j;
    int count = 0;
    int alphalength;
    int percent = 0;

    applyOptimisation(version, inputMode, inputLength);

    currentMode = ' '; // Null

    if (gs1 == 1) {

        count += 4;


    }




    if (eci != 3) {


        count += 12;



    }

    for (i = 0; i < inputLength; i++) {
        if (inputMode[i] != currentMode) {
            count += 4;

            switch (inputMode[i]) {
                case 'K':
                    count += tribus(version, 8, 10, 12);
                    count += (blockLength(i, inputMode, inputLength) * 13);
                    break;
                case 'B':
                    count += tribus(version, 8, 16, 16);
                    for (j = i; j < (i + blockLength(i, inputMode, inputLength)); j++) {
                        if (inputData[j] > 0xff) {
                            count += 16;
                        } else {
                            count += 8;
                        }
                    }
                    break;
                case 'A':
                    count += tribus(version, 9, 11, 13);
                    alphalength = blockLength(i, inputMode, inputLength);

                    // In alphanumeric mode % becomes %%
                    for (j = i; j < (i + alphalength); j++) {
                        if (inputData[j] == '%') {
                            percent++;
                        }
                    }
                    alphalength += percent;

                    switch (alphalength % 2) {
                        case 0:
                            count += (alphalength / 2) * 11;
                            break;
                        case 1:
                            count += ((alphalength - 1) / 2) * 11;
                            count += 6;
                            break;
                    }
                    break;
                case 'N':
                    count += tribus(version, 10, 12, 14);
                    switch (blockLength(i, inputMode, inputLength) % 3) {
                        case 0:
                            count += (blockLength(i, inputMode, inputLength) / 3) * 10;
                            break;
                        case 1:
                            count += ((blockLength(i, inputMode, inputLength) - 1) / 3) * 10;
                            count += 4;
                            break;
                        case 2:
                            count += ((blockLength(i, inputMode, inputLength) - 2) / 3) * 10;
                            count += 7;
                            break;
                    }
                    break;
            }
            currentMode = inputMode[i];
        }
    }





    return count;
}

int qr_code(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    int i, j, est_binlen;
    int ecc_level, autosize, version, max_cw, target_binlen, blocks, size;
    int bitmask, gs1;
    int canShrink;

#ifndef _MSC_VER
    int utfdata[length + 1];
    int jisdata[length + 1];
    char mode[length + 1];
#else
    int* datastream;
    int* fullstream;
    unsigned char* grid;
    int* utfdata = (int *) _alloca((length + 1) * sizeof (int));
    int* jisdata = (int *) _alloca((length + 1) * sizeof (int));
    char* mode = (char *) _alloca(length + 1);
#endif

    gs1 = (symbol->input_mode == GS1_MODE);

    if ((symbol->input_mode == DATA_MODE) || (symbol->eci != 3)) {
        for (i = 0; i < length; i++) {
            jisdata[i] = (int) source[i];
        }
    } else {


        /* Convert Unicode input to Shift-JIS */
        int error_number = utf8toutf16(symbol, source, utfdata, &length);
        if (error_number != 0) {



            return error_number;
        }

        for (i = 0; i < length; i++) {
            if (utfdata[i] <= 0xff) {
                jisdata[i] = utfdata[i];
            } else {
                int glyph = 0;
                j = 0;
                do {
                    if (sjis_lookup[j * 2] == utfdata[i]) {
                        glyph = sjis_lookup[(j * 2) + 1];
                    }
                    j++;
                } while ((j < 6843) && (glyph == 0));
                if (glyph == 0) {
                    strcpy(symbol->errtxt, "560: Invalid character in input data");
                    return ZINT_ERROR_INVALID_DATA;
                }
                jisdata[i] = glyph;
            }
        }
    }

    define_mode(mode, jisdata, length, gs1);
    est_binlen = getBinaryLength(40, mode, jisdata, length, gs1, symbol->eci);

    ecc_level = LEVEL_L;
    max_cw = 2956;
    if ((symbol->option_1 >= 1) && (symbol->option_1 <= 4)) {
        switch (symbol->option_1) {
            case 1: ecc_level = LEVEL_L;
                max_cw = 2956;
                break;
            case 2: ecc_level = LEVEL_M;
                max_cw = 2334;
                break;
            case 3: ecc_level = LEVEL_Q;
                max_cw = 1666;
                break;







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















|






|

|



|
>
|
>
>
|
|
>
>
>
|
>
>
|
>
>
>




|
>


<
|


<
|








<
|
>
|
|
|
|
|
|
<
>











<
|

|


|



|








>
>
>
>




|

|




<
|


|
|

|
<



|

|
<
|
<

>
>
|
|
|
>
>
>
|
|
|
<
|
<
<
|
<
<
<
|
<
<
<
|
<
|
|
<
|
|
|
<
<
|





|
<







1406
1407
1408
1409
1410
1411
1412




















































































































1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466

1467
1468
1469

1470
1471
1472
1473
1474
1475
1476
1477
1478

1479
1480
1481
1482
1483
1484
1485
1486

1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498

1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531

1532
1533
1534
1535
1536
1537
1538

1539
1540
1541
1542
1543
1544

1545

1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557

1558


1559



1560



1561

1562
1563

1564
1565
1566


1567
1568
1569
1570
1571
1572
1573

1574
1575
1576
1577
1578
1579
1580
        grid[((size - 9) * size) + i] += (version_data >> ((i * 3) + 2)) & 0x41;
        grid[(i * size) + (size - 11)] += (version_data >> (i * 3)) & 0x41;
        grid[(i * size) + (size - 10)] += (version_data >> ((i * 3) + 1)) & 0x41;
        grid[(i * size) + (size - 9)] += (version_data >> ((i * 3) + 2)) & 0x41;
    }
}





















































































































static size_t blockLength(const size_t start,const char inputMode[],const size_t inputLength) {
    /* Find the length of the block starting from 'start' */
    size_t i;
    int    count;
    char mode = inputMode[start];

    count = 0;
    i = start;

    do {
        count++;
    } while (((i + count) < inputLength) && (inputMode[i + count] == mode));

    return count;
}

static int getBinaryLength(const int version, char inputMode[], const unsigned int inputData[], const size_t inputLength, const int gs1, const int eci, const int debug) {
    /* Calculate the actual bitlength of the proposed binary string */
    size_t i;
    char currentMode;
    int    j;
    int count = 0;
    int alphalength;
    int blocklength;

    qr_define_mode(inputMode, inputData, inputLength, gs1, version, debug);

    currentMode = ' '; // Null

    if (gs1 == 1) { /* Not applicable to MICROQR */
        if (version < RMQR_VERSION) {
            count += 4;
        } else {
            count += 3;
        }
    }

    if (eci != 0) { // RMQR and MICROQR do not support ECI
        count += 4;
        if (eci <= 127) {
            count += 8;
        } else if (eci <= 16383) {
            count += 16;
        } else {
            count += 24;
        }
    }

    for (i = 0; i < inputLength; i++) {
        if (inputMode[i] != currentMode) {
            count += mode_bits(version) + cci_bits(version, inputMode[i]);
            blocklength = blockLength(i, inputMode, inputLength);
            switch (inputMode[i]) {
                case 'K':

                    count += (blocklength * 13);
                    break;
                case 'B':

                    for (j = i; j < (i + blocklength); j++) {
                        if (inputData[j] > 0xff) {
                            count += 16;
                        } else {
                            count += 8;
                        }
                    }
                    break;
                case 'A':

                    alphalength = blocklength;
                    if (gs1) {
                        // In alphanumeric mode % becomes %%
                        for (j = i; j < (i + blocklength); j++) {
                            if (inputData[j] == '%') {
                                alphalength++;
                            }
                        }

                    }
                    switch (alphalength % 2) {
                        case 0:
                            count += (alphalength / 2) * 11;
                            break;
                        case 1:
                            count += ((alphalength - 1) / 2) * 11;
                            count += 6;
                            break;
                    }
                    break;
                case 'N':

                    switch (blocklength % 3) {
                        case 0:
                            count += (blocklength / 3) * 10;
                            break;
                        case 1:
                            count += ((blocklength - 1) / 3) * 10;
                            count += 4;
                            break;
                        case 2:
                            count += ((blocklength - 2) / 3) * 10;
                            count += 7;
                            break;
                    }
                    break;
            }
            currentMode = inputMode[i];
        }
    }

    if (debug & ZINT_DEBUG_PRINT) {
        printf("Estimated Binary Length: %d (version %d, eci %d, gs1 %d)\n", count, version, eci, gs1);
    }

    return count;
}

INTERNAL int qr_code(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    int i, j, est_binlen;
    int ecc_level, autosize, version, max_cw, target_codewords, blocks, size;
    int bitmask, gs1;
    int canShrink;

#ifndef _MSC_VER

    unsigned int jisdata[length + 1];
    char mode[length + 1];
#else
    unsigned char* datastream;
    unsigned char* fullstream;
    unsigned char* grid;
    unsigned int* jisdata = (unsigned int *) _alloca((length + 1) * sizeof (unsigned int));

    char* mode = (char *) _alloca(length + 1);
#endif

    gs1 = ((symbol->input_mode & 0x07) == GS1_MODE);

    if ((symbol->input_mode & 0x07) == DATA_MODE) {

        sjis_cpy(source, &length, jisdata);

    } else {
        int done = 0;
        if (symbol->eci != 20) { /* Unless ECI 20 (Shift JIS) */
            /* Try single byte (Latin) conversion first */
            int error_number = sjis_utf8tosb(symbol->eci && symbol->eci <= 899 ? symbol->eci : 3, source, &length, jisdata);
            if (error_number == 0) {
                done = 1;
            } else if (symbol->eci && symbol->eci <= 899) {
                strcpy(symbol->errtxt, "575: Invalid characters in input data");
                return error_number;
            }
        }

        if (!done) {


            /* Try Shift-JIS */



            int error_number = sjis_utf8tomb(symbol, source, &length, jisdata);



            if (error_number != 0) {

                return error_number;
            }

        }
    }



    est_binlen = getBinaryLength(40, mode, jisdata, length, gs1, symbol->eci, symbol->debug);

    ecc_level = LEVEL_L;
    max_cw = 2956;
    if ((symbol->option_1 >= 1) && (symbol->option_1 <= 4)) {
        switch (symbol->option_1) {
            case 1:

                break;
            case 2: ecc_level = LEVEL_M;
                max_cw = 2334;
                break;
            case 3: ecc_level = LEVEL_Q;
                max_cw = 1666;
                break;
1505
1506
1507
1508
1509
1510
1511



1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
            case LEVEL_H:
                if ((8 * qr_data_codewords_H[i]) >= est_binlen) {
                    autosize = i + 1;
                }
                break;
        }
    }




    // Now see if the optimised binary will fit in a smaller symbol.
    canShrink = 1;

    do {
        if (autosize == 1) {
            canShrink = 0;
        } else {
            est_binlen = getBinaryLength(autosize - 1, mode, jisdata, length, gs1, symbol->eci);

            switch (ecc_level) {
                case LEVEL_L:
                    if ((8 * qr_data_codewords_L[autosize - 2]) < est_binlen) {
                        canShrink = 0;
                    }
                    break;







>
>
>








|







1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
            case LEVEL_H:
                if ((8 * qr_data_codewords_H[i]) >= est_binlen) {
                    autosize = i + 1;
                }
                break;
        }
    }
    if (autosize != 40) {
        est_binlen = getBinaryLength(autosize, mode, jisdata, length, gs1, symbol->eci, symbol->debug);
    }

    // Now see if the optimised binary will fit in a smaller symbol.
    canShrink = 1;

    do {
        if (autosize == 1) {
            canShrink = 0;
        } else {
            est_binlen = getBinaryLength(autosize - 1, mode, jisdata, length, gs1, symbol->eci, symbol->debug);

            switch (ecc_level) {
                case LEVEL_L:
                    if ((8 * qr_data_codewords_L[autosize - 2]) < est_binlen) {
                        canShrink = 0;
                    }
                    break;
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573

1574
1575
1576
1577
1578
1579
1580
1581
1582
1583

1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606



1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
            }

            if (canShrink == 1) {
                // Optimisation worked - data will fit in a smaller symbol
                autosize--;
            } else {
                // Data did not fit in the smaller symbol, revert to original size
                est_binlen = getBinaryLength(autosize, mode, jisdata, length, gs1, symbol->eci);
            }
        }
    } while (canShrink == 1);

    version = autosize;

    if ((symbol->option_2 >= 1) && (symbol->option_2 <= 40)) {
        /* If the user has selected a larger symbol than the smallest available,
         then use the size the user has selected, and re-optimise for this
         symbol size.
         */
        if (symbol->option_2 > version) {
            version = symbol->option_2;
            est_binlen = getBinaryLength(symbol->option_2, mode, jisdata, length, gs1, symbol->eci);
        }

        if (symbol->option_2 < version) {
            strcpy(symbol->errtxt, "569: Input too long for selected symbol size");
            return ZINT_ERROR_TOO_LONG;
        }
    }
    
    /* Ensure maxium error correction capacity */

    if (est_binlen <= qr_data_codewords_M[version - 1] * 8) {
        ecc_level = LEVEL_M;
    }
    if (est_binlen <= qr_data_codewords_Q[version - 1] * 8) {
        ecc_level = LEVEL_Q;
    }
    if (est_binlen <= qr_data_codewords_H[version - 1] * 8) {
        ecc_level = LEVEL_H;
    }


    target_binlen = qr_data_codewords_L[version - 1];
    blocks = qr_blocks_L[version - 1];
    switch (ecc_level) {
        case LEVEL_M: target_binlen = qr_data_codewords_M[version - 1];
            blocks = qr_blocks_M[version - 1];
            break;
        case LEVEL_Q: target_binlen = qr_data_codewords_Q[version - 1];
            blocks = qr_blocks_Q[version - 1];
            break;
        case LEVEL_H: target_binlen = qr_data_codewords_H[version - 1];
            blocks = qr_blocks_H[version - 1];
            break;
    }

#ifndef _MSC_VER
    int datastream[target_binlen + 1];
    int fullstream[qr_total_codewords[version - 1] + 1];
#else
    datastream = (int *) _alloca((target_binlen + 1) * sizeof (int));
    fullstream = (int *) _alloca((qr_total_codewords[version - 1] + 1) * sizeof (int));
#endif

    qr_binary(datastream, version, target_binlen, mode, jisdata, length, gs1, symbol->eci, est_binlen, symbol->debug);



    add_ecc(fullstream, datastream, version, target_binlen, blocks);

    size = qr_sizes[version - 1];
#ifndef _MSC_VER
    unsigned char grid[size * size];
#else
    grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
#endif

    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            grid[(i * size) + j] = 0;
        }
    }

    setup_grid(grid, size, version);
    populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]);

    if (version >= 7) {
        add_version_info(grid, size, version);
    }

    bitmask = apply_bitmask(grid, size, ecc_level);

    add_format_info(grid, size, ecc_level, bitmask);



    symbol->width = size;
    symbol->rows = size;

    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            if (grid[(i * size) + j] & 0x01) {
                set_module(symbol, i, j);
            }
        }
        symbol->row_height[i] = 1;
    }

    return 0;
}

/* NOTE: From this point forward concerns Micro QR Code only */

static int micro_qr_intermediate(char binary[], const int jisdata[], const char mode[], const size_t length, int *kanji_used, int *alphanum_used, int *byte_used,const int debug) {
    /* Convert input data to an "intermediate stage" where data is binary encoded but
       control information is not */
    int position = 0;
    int i;
    char buffer[2];

    strcpy(binary, "");

    if (debug) {
        for (i = 0; i < length; i++) {
            printf("%c", mode[i]);
        }
        printf("\n");
    }

    do {
        char data_block;
        int short_data_block_length = 0;
        if (strlen(binary) > 128) {
            return ZINT_ERROR_TOO_LONG;
        }

        data_block = mode[position];
        do {
            short_data_block_length++;
        } while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block));

        switch (data_block) {
            case 'K':
                /* Kanji mode */
                /* Mode indicator */
                strcat(binary, "K");
                *kanji_used = 1;

                /* Character count indicator */
                buffer[0] = short_data_block_length;
                buffer[1] = '\0';
                strcat(binary, buffer);

                if (debug) {
                    printf("Kanji block (length %d)\n\t", short_data_block_length);
                }

                /* Character representation */
                for (i = 0; i < short_data_block_length; i++) {
                    int jis = jisdata[position + i];
                    int prod;

                    if (jis >= 0x8140 && jis <= 0x9ffc)
                        jis -= 0x8140;

                    else if (jis >= 0xe040 && jis <= 0xebbf)
                        jis -= 0xc140;

                    prod = ((jis >> 8) * 0xc0) + (jis & 0xff);

                    bin_append(prod, 13, binary);

                    if (debug) {
                        printf("0x%4X ", prod);
                    }

                    if (strlen(binary) > 128) {
                        return ZINT_ERROR_TOO_LONG;
                    }
                }

                if (debug) {
                    printf("\n");
                }

                break;
            case 'B':
                /* Byte mode */
                /* Mode indicator */
                strcat(binary, "B");
                *byte_used = 1;

                /* Character count indicator */
                buffer[0] = short_data_block_length;
                buffer[1] = '\0';
                strcat(binary, buffer);

                if (debug) {
                    printf("Byte block (length %d)\n\t", short_data_block_length);
                }

                /* Character representation */
                for (i = 0; i < short_data_block_length; i++) {
                    int byte = jisdata[position + i];

                    bin_append(byte, 8, binary);

                    if (debug) {
                        printf("0x%4X ", byte);
                    }

                    if (strlen(binary) > 128) {
                        return ZINT_ERROR_TOO_LONG;
                    }
                }

                if (debug) {
                    printf("\n");
                }

                break;
            case 'A':
                /* Alphanumeric mode */
                /* Mode indicator */
                strcat(binary, "A");
                *alphanum_used = 1;

                /* Character count indicator */
                buffer[0] = short_data_block_length;
                buffer[1] = '\0';
                strcat(binary, buffer);

                if (debug) {
                    printf("Alpha block (length %d)\n\t", short_data_block_length);
                }

                /* Character representation */
                i = 0;
                while (i < short_data_block_length) {
                    int count;
                    int first = 0, prod;

                    first = posn(RHODIUM, (char) jisdata[position + i]);
                    count = 1;
                    prod = first;

                    if (i + 1 < short_data_block_length && mode[position + i + 1] == 'A') {
                        int second = posn(RHODIUM, (char) jisdata[position + i + 1]);
                        count = 2;
                        prod = (first * 45) + second;
                    }

                    bin_append(prod, 1 + (5 * count), binary);

                    if (debug) {
                        printf("0x%4X ", prod);
                    }

                    if (strlen(binary) > 128) {
                        return ZINT_ERROR_TOO_LONG;
                    }

                    i += 2;
                };

                if (debug) {
                    printf("\n");
                }

                break;
            case 'N':
                /* Numeric mode */
                /* Mode indicator */
                strcat(binary, "N");

                /* Character count indicator */
                buffer[0] = short_data_block_length;
                buffer[1] = '\0';
                strcat(binary, buffer);

                if (debug) {
                    printf("Number block (length %d)\n\t", short_data_block_length);
                }

                /* Character representation */
                i = 0;
                while (i < short_data_block_length) {
                    int count;
                    int first = 0, prod;

                    first = posn(NEON, (char) jisdata[position + i]);
                    count = 1;
                    prod = first;

                    if (i + 1 < short_data_block_length && mode[position + i + 1] == 'N') {
                        int second = posn(NEON, (char) jisdata[position + i + 1]);
                        count = 2;
                        prod = (prod * 10) + second;
                    }

                    if (i + 2 < short_data_block_length && mode[position + i + 2] == 'N') {
                        int third = posn(NEON, (char) jisdata[position + i + 2]);
                        count = 3;
                        prod = (prod * 10) + third;
                    }

                    bin_append(prod, 1 + (3 * count), binary);

                    if (debug) {
                        printf("0x%4X (%d)", prod, prod);
                    }

                    if (strlen(binary) > 128) {
                        return ZINT_ERROR_TOO_LONG;
                    }

                    i += 3;
                };

                if (debug) {
                    printf("\n");
                }

                break;
        }

        position += short_data_block_length;
    } while (position < length - 1);

    return 0;
}

static void get_bitlength(int count[],const char stream[]) {
    size_t length;
    int    i;

    length = strlen(stream);

    for (i = 0; i < 4; i++) {
        count[i] = 0;
    }

    i = 0;
    do {
        if ((stream[i] == '0') || (stream[i] == '1')) {
            count[0]++;
            count[1]++;
            count[2]++;
            count[3]++;
            i++;
        } else {
            switch (stream[i]) {
                case 'K':
                    count[2] += 5;
                    count[3] += 7;
                    i += 2;
                    break;
                case 'B':
                    count[2] += 6;
                    count[3] += 8;
                    i += 2;
                    break;
                case 'A':
                    count[1] += 4;
                    count[2] += 6;
                    count[3] += 8;
                    i += 2;
                    break;
                case 'N':
                    count[0] += 3;
                    count[1] += 5;
                    count[2] += 7;
                    count[3] += 9;
                    i += 2;
                    break;
            }
        }
    } while (i < length);
}

static void microqr_expand_binary(const char binary_stream[], char full_stream[],const int version) {
    int    i;
    size_t length;

    length = strlen(binary_stream);

    i = 0;
    do {
        switch (binary_stream[i]) {
            case '1': strcat(full_stream, "1");
                i++;
                break;
            case '0': strcat(full_stream, "0");
                i++;
                break;
            case 'N':
                /* Numeric Mode */
                /* Mode indicator */
                switch (version) {
                    case 1: strcat(full_stream, "0");
                        break;
                    case 2: strcat(full_stream, "00");
                        break;
                    case 3: strcat(full_stream, "000");
                        break;
                }

                /* Character count indicator */
                bin_append(binary_stream[i + 1], 3 + version, full_stream); /* version = 0..3 */

                i += 2;
                break;
            case 'A':
                /* Alphanumeric Mode */
                /* Mode indicator */
                switch (version) {
                    case 1: strcat(full_stream, "1");
                        break;
                    case 2: strcat(full_stream, "01");
                        break;
                    case 3: strcat(full_stream, "001");
                        break;
                }

                /* Character count indicator */
                bin_append(binary_stream[i + 1], 2 + version, full_stream); /* version = 1..3 */

                i += 2;
                break;
            case 'B':
                /* Byte Mode */
                /* Mode indicator */
                switch (version) {
                    case 2: strcat(full_stream, "10");
                        break;
                    case 3: strcat(full_stream, "010");
                        break;
                }

                /* Character count indicator */
                bin_append(binary_stream[i + 1], 2 + version, full_stream); /* version = 2..3 */

                i += 2;
                break;
            case 'K':
                /* Kanji Mode */
                /* Mode indicator */
                switch (version) {
                    case 2: strcat(full_stream, "11");
                        break;
                    case 3: strcat(full_stream, "011");
                        break;
                }

                /* Character count indicator */
                bin_append(binary_stream[i + 1], 1 + version, full_stream); /* version = 2..3 */

                i += 2;
                break;
        }

    } while (i < length);
}

static void micro_qr_m1(char binary_data[]) {
    int i, j, latch;
    int bits_total, bits_left;
    int data_codewords, ecc_codewords;
    unsigned char data_blocks[4], ecc_blocks[3];

    bits_total = 20;
    latch = 0;







|













|







|
|
>
|
|
|
|
|
|
|
|
|
|
>
|


|


|


|





|
|

|
|


|
>
>
>
|















|








<
<
















<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|







1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744


1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760

































































































































































































































































































































































1761
1762
1763
1764
1765
1766
1767
1768
            }

            if (canShrink == 1) {
                // Optimisation worked - data will fit in a smaller symbol
                autosize--;
            } else {
                // Data did not fit in the smaller symbol, revert to original size
                est_binlen = getBinaryLength(autosize, mode, jisdata, length, gs1, symbol->eci, symbol->debug);
            }
        }
    } while (canShrink == 1);

    version = autosize;

    if ((symbol->option_2 >= 1) && (symbol->option_2 <= 40)) {
        /* If the user has selected a larger symbol than the smallest available,
         then use the size the user has selected, and re-optimise for this
         symbol size.
         */
        if (symbol->option_2 > version) {
            version = symbol->option_2;
            est_binlen = getBinaryLength(symbol->option_2, mode, jisdata, length, gs1, symbol->eci, symbol->debug);
        }

        if (symbol->option_2 < version) {
            strcpy(symbol->errtxt, "569: Input too long for selected symbol size");
            return ZINT_ERROR_TOO_LONG;
        }
    }

    /* Ensure maxium error correction capacity unless user-specified */
    if (symbol->option_1 == -1 || symbol->option_1 != ecc_level) {
        if (est_binlen <= qr_data_codewords_M[version - 1] * 8) {
            ecc_level = LEVEL_M;
        }
        if (est_binlen <= qr_data_codewords_Q[version - 1] * 8) {
            ecc_level = LEVEL_Q;
        }
        if (est_binlen <= qr_data_codewords_H[version - 1] * 8) {
            ecc_level = LEVEL_H;
        }
    }

    target_codewords = qr_data_codewords_L[version - 1];
    blocks = qr_blocks_L[version - 1];
    switch (ecc_level) {
        case LEVEL_M: target_codewords = qr_data_codewords_M[version - 1];
            blocks = qr_blocks_M[version - 1];
            break;
        case LEVEL_Q: target_codewords = qr_data_codewords_Q[version - 1];
            blocks = qr_blocks_Q[version - 1];
            break;
        case LEVEL_H: target_codewords = qr_data_codewords_H[version - 1];
            blocks = qr_blocks_H[version - 1];
            break;
    }

#ifndef _MSC_VER
    unsigned char datastream[target_codewords + 1];
    unsigned char fullstream[qr_total_codewords[version - 1] + 1];
#else
    datastream = (unsigned char *) _alloca(target_codewords + 1);
    fullstream = (unsigned char *) _alloca(qr_total_codewords[version - 1] + 1);
#endif

    qr_binary(datastream, version, target_codewords, mode, jisdata, length, gs1, symbol->eci, est_binlen, symbol->debug);
#ifdef ZINT_TEST
    if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, datastream, target_codewords);
#endif
    add_ecc(fullstream, datastream, version, target_codewords, blocks, symbol->debug);

    size = qr_sizes[version - 1];
#ifndef _MSC_VER
    unsigned char grid[size * size];
#else
    grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
#endif

    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            grid[(i * size) + j] = 0;
        }
    }

    setup_grid(grid, size, version);
    populate_grid(grid, size, size, fullstream, qr_total_codewords[version - 1]);

    if (version >= 7) {
        add_version_info(grid, size, version);
    }

    bitmask = apply_bitmask(grid, size, ecc_level);

    add_format_info(grid, size, ecc_level, bitmask);



    symbol->width = size;
    symbol->rows = size;

    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            if (grid[(i * size) + j] & 0x01) {
                set_module(symbol, i, j);
            }
        }
        symbol->row_height[i] = 1;
    }

    return 0;
}


































































































































































































































































































































































static void micro_qr_m1(struct zint_symbol *symbol, char binary_data[]) {
    int i, j, latch;
    int bits_total, bits_left;
    int data_codewords, ecc_codewords;
    unsigned char data_blocks[4], ecc_blocks[3];

    bits_total = 20;
    latch = 0;
2066
2067
2068
2069
2070
2071
2072



2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
    }
    data_blocks[2] = 0;
    for (j = 0; j < 4; j++) {
        if (binary_data[16 + j] == '1') {
            data_blocks[2] += 0x80 >> j;
        }
    }




    /* Calculate Reed-Solomon error codewords */
    rs_init_gf(0x11d);
    rs_init_code(ecc_codewords, 0);
    rs_encode(data_codewords, data_blocks, ecc_blocks);
    rs_free();

    /* Add Reed-Solomon codewords to binary data */
    for (i = 0; i < ecc_codewords; i++) {
        bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
    }
}

static void micro_qr_m2(char binary_data[],const int ecc_mode) {
    int i, j, latch;
    int bits_total=0, bits_left;
    int data_codewords=0, ecc_codewords=0;
    unsigned char data_blocks[6], ecc_blocks[7];

    latch = 0;








>
>
>













|







1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
    }
    data_blocks[2] = 0;
    for (j = 0; j < 4; j++) {
        if (binary_data[16 + j] == '1') {
            data_blocks[2] += 0x80 >> j;
        }
    }
#ifdef ZINT_TEST
    if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, data_blocks, data_codewords);
#endif

    /* Calculate Reed-Solomon error codewords */
    rs_init_gf(0x11d);
    rs_init_code(ecc_codewords, 0);
    rs_encode(data_codewords, data_blocks, ecc_blocks);
    rs_free();

    /* Add Reed-Solomon codewords to binary data */
    for (i = 0; i < ecc_codewords; i++) {
        bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
    }
}

static void micro_qr_m2(struct zint_symbol *symbol, char binary_data[], const int ecc_mode) {
    int i, j, latch;
    int bits_total=0, bits_left;
    int data_codewords=0, ecc_codewords=0;
    unsigned char data_blocks[6], ecc_blocks[7];

    latch = 0;

2144
2145
2146
2147
2148
2149
2150



2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173

        for (j = 0; j < 8; j++) {
            if (binary_data[(i * 8) + j] == '1') {
                data_blocks[i] += 0x80 >> j;
            }
        }
    }




    /* Calculate Reed-Solomon error codewords */
    rs_init_gf(0x11d);
    rs_init_code(ecc_codewords, 0);
    rs_encode(data_codewords, data_blocks, ecc_blocks);
    rs_free();

    /* Add Reed-Solomon codewords to binary data */
    for (i = 0; i < ecc_codewords; i++) {
        bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
    }

    return;
}

static void micro_qr_m3(char binary_data[],const int ecc_mode) {
    int i, j, latch;
    int bits_total=0, bits_left;
    int data_codewords=0, ecc_codewords=0;
    unsigned char data_blocks[12], ecc_blocks[9];

    latch = 0;








>
>
>















|







1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937

        for (j = 0; j < 8; j++) {
            if (binary_data[(i * 8) + j] == '1') {
                data_blocks[i] += 0x80 >> j;
            }
        }
    }
#ifdef ZINT_TEST
    if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, data_blocks, data_codewords);
#endif

    /* Calculate Reed-Solomon error codewords */
    rs_init_gf(0x11d);
    rs_init_code(ecc_codewords, 0);
    rs_encode(data_codewords, data_blocks, ecc_blocks);
    rs_free();

    /* Add Reed-Solomon codewords to binary data */
    for (i = 0; i < ecc_codewords; i++) {
        bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
    }

    return;
}

static void micro_qr_m3(struct zint_symbol *symbol, char binary_data[], const int ecc_mode) {
    int i, j, latch;
    int bits_total=0, bits_left;
    int data_codewords=0, ecc_codewords=0;
    unsigned char data_blocks[12], ecc_blocks[9];

    latch = 0;

2256
2257
2258
2259
2260
2261
2262



2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
        data_blocks[8] = 0;
        for (j = 0; j < 4; j++) {
            if (binary_data[64 + j] == '1') {
                data_blocks[8] += 0x80 >> j;
            }
        }
    }




    /* Calculate Reed-Solomon error codewords */
    rs_init_gf(0x11d);
    rs_init_code(ecc_codewords, 0);
    rs_encode(data_codewords, data_blocks, ecc_blocks);
    rs_free();

    /* Add Reed-Solomon codewords to binary data */
    for (i = 0; i < ecc_codewords; i++) {
        bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
    }

    return;
}

static void micro_qr_m4(char binary_data[],const int ecc_mode) {
    int i, j, latch;
    int bits_total=0, bits_left;
    int data_codewords=0, ecc_codewords=0;
    unsigned char data_blocks[17], ecc_blocks[15];

    latch = 0;








>
>
>















|







2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
        data_blocks[8] = 0;
        for (j = 0; j < 4; j++) {
            if (binary_data[64 + j] == '1') {
                data_blocks[8] += 0x80 >> j;
            }
        }
    }
#ifdef ZINT_TEST
    if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, data_blocks, data_codewords);
#endif

    /* Calculate Reed-Solomon error codewords */
    rs_init_gf(0x11d);
    rs_init_code(ecc_codewords, 0);
    rs_encode(data_codewords, data_blocks, ecc_blocks);
    rs_free();

    /* Add Reed-Solomon codewords to binary data */
    for (i = 0; i < ecc_codewords; i++) {
        bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data);
    }

    return;
}

static void micro_qr_m4(struct zint_symbol *symbol, char binary_data[], const int ecc_mode) {
    int i, j, latch;
    int bits_total=0, bits_left;
    int data_codewords=0, ecc_codewords=0;
    unsigned char data_blocks[17], ecc_blocks[15];

    latch = 0;

2343
2344
2345
2346
2347
2348
2349



2350
2351
2352
2353
2354
2355
2356

        for (j = 0; j < 8; j++) {
            if (binary_data[(i * 8) + j] == '1') {
                data_blocks[i] += 0x80 >> j;
            }
        }
    }




    /* Calculate Reed-Solomon error codewords */
    rs_init_gf(0x11d);
    rs_init_code(ecc_codewords, 0);
    rs_encode(data_codewords, data_blocks, ecc_blocks);
    rs_free();








>
>
>







2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126

        for (j = 0; j < 8; j++) {
            if (binary_data[(i * 8) + j] == '1') {
                data_blocks[i] += 0x80 >> j;
            }
        }
    }
#ifdef ZINT_TEST
    if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, data_blocks, data_codewords);
#endif

    /* Calculate Reed-Solomon error codewords */
    rs_init_gf(0x11d);
    rs_init_code(ecc_codewords, 0);
    rs_encode(data_codewords, data_blocks, ecc_blocks);
    rs_free();

2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
            }
        }
    }

    return best_pattern;
}

int microqr(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    size_t i;
    int    j, size;
    char binary_stream[200];
    char full_stream[200];
    int utfdata[40];

    int jisdata[40];
    char mode[40];
    int error_number, kanji_used = 0, alphanum_used = 0, byte_used = 0;
    int version_valid[4];
    int binary_count[4];
    int ecc_level, autoversion, version;
    int n_count, a_count, bitmask, format, format_full;
#ifdef _MSC_VER
    unsigned char* grid;
#endif

    if (length > 35) {
        strcpy(symbol->errtxt, "562: Input data too long");
        return ZINT_ERROR_TOO_LONG;







|


<

<

|

|



|







2329
2330
2331
2332
2333
2334
2335
2336
2337
2338

2339

2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
            }
        }
    }

    return best_pattern;
}

INTERNAL int microqr(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    size_t i;
    int    j, size;

    char full_stream[200];


    unsigned int jisdata[40];
    char mode[40];
    int alpha_used = 0, byte_or_kanji_used = 0;
    int version_valid[4];
    int binary_count[4];
    int ecc_level, autoversion, version;
    int bitmask, format, format_full;
#ifdef _MSC_VER
    unsigned char* grid;
#endif

    if (length > 35) {
        strcpy(symbol->errtxt, "562: Input data too long");
        return ZINT_ERROR_TOO_LONG;
2601
2602
2603
2604
2605
2606
2607

























2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
            if (symbol->option_2 != 4 && symbol->option_1 == 3) {
                strcpy(symbol->errtxt, "575: Error correction level Q requires Version M4");
                return ZINT_ERROR_INVALID_OPTION;
            }
        }
        ecc_level = symbol->option_1;
    }


























    for (i = 0; i < 4; i++) {
        version_valid[i] = 1;
    }

    if (symbol->input_mode == DATA_MODE) {
        for (i = 0; i < length; i++) {
            jisdata[i] = (int) source[i];
        }
    } else {
        /* Convert Unicode input to Shift-JIS */
        error_number = utf8toutf16(symbol, source, utfdata, &length);
        if (error_number != 0) {
            return error_number;
        }

        for (i = 0; i < length; i++) {
            if (utfdata[i] <= 0xff) {
                jisdata[i] = utfdata[i];
            } else {
                int glyph = 0;
                j = 0;
                do {
                    if (sjis_lookup[j * 2] == utfdata[i]) {
                        glyph = sjis_lookup[(j * 2) + 1];
                    }
                    j++;
                } while ((j < 6843) && (glyph == 0));
                if (glyph == 0) {
                    strcpy(symbol->errtxt, "563: Invalid character in input data");
                    return ZINT_ERROR_INVALID_DATA;
                }
                jisdata[i] = glyph;
            }
        }
    }

    define_mode(mode, jisdata, length, 0);

    n_count = 0;
    a_count = 0;
    for (i = 0; i < length; i++) {
        if ((jisdata[i] >= '0') && (jisdata[i] <= '9')) {
            n_count++;
        }
        if (in_alpha(jisdata[i])) {
            a_count++;
        }
    }

    if (a_count == length) {
        /* All data can be encoded in Alphanumeric mode */
        for (i = 0; i < length; i++) {
            mode[i] = 'A';
        }
    }

    if (n_count == length) {
        /* All data can be encoded in Numeric mode */
        for (i = 0; i < length; i++) {
            mode[i] = 'N';
        }
    }

    error_number = micro_qr_intermediate(binary_stream, jisdata, mode, length, &kanji_used, &alphanum_used, &byte_used, symbol->debug);
    if (error_number != 0) {
        strcpy(symbol->errtxt, "564: Input data too long");
        return error_number;
    }

    get_bitlength(binary_count, binary_stream);

    /* Eliminate possivle versions depending on type of content */
    if (byte_used) {
        version_valid[0] = 0;
        version_valid[1] = 0;
    }

    if (alphanum_used) {
        version_valid[0] = 0;
    }

    if (kanji_used) {
        version_valid[0] = 0;
        version_valid[1] = 0;
    }

    /* Eliminate possible versions depending on length of binary data */
    if (binary_count[0] > 20) {
        version_valid[0] = 0;
    }
    if (binary_count[1] > 40) {
        version_valid[1] = 0;
    }
    if (binary_count[2] > 84) {
        version_valid[2] = 0;
    }
    if (binary_count[3] > 128) {
        strcpy(symbol->errtxt, "565: Input data too long");
        return ZINT_ERROR_TOO_LONG;
    }

    /* Eliminate possible versions depending on error correction level specified */
    if (ecc_level == LEVEL_Q) {
        version_valid[0] = 0;
        version_valid[1] = 0;
        version_valid[2] = 0;
        if (binary_count[3] > 80) {
            strcpy(symbol->errtxt, "567: Input data too long");
            return ZINT_ERROR_TOO_LONG;
        }
    }

    if (ecc_level == LEVEL_M) {
        version_valid[0] = 0;
        if (binary_count[1] > 32) {
            version_valid[1] = 0;
        }
        if (binary_count[2] > 68) {
            version_valid[2] = 0;
        }
        if (binary_count[3] > 112) {







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





|
<
<
<
<
<
<
<
<
<
|
|
<
|
|
<
|
<
<
<
|
<
<
<
<
<
|
<
<
<
<
|
<
|
|
|
|
|
|
|
<
<
|
<
|
<
<
|
<
<
<
|
<
<
<
<
<
<
|
<
<
<
<
<
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<

















|

<
<
<




<
<
|
<







2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406









2407
2408

2409
2410

2411



2412





2413




2414

2415
2416
2417
2418
2419
2420
2421


2422

2423


2424



2425






2426





2427
2428
2429













2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448



2449
2450
2451
2452


2453

2454
2455
2456
2457
2458
2459
2460
            if (symbol->option_2 != 4 && symbol->option_1 == 3) {
                strcpy(symbol->errtxt, "575: Error correction level Q requires Version M4");
                return ZINT_ERROR_INVALID_OPTION;
            }
        }
        ecc_level = symbol->option_1;
    }

    if ((symbol->input_mode & 0x07) == DATA_MODE) {
        sjis_cpy(source, &length, jisdata);
    } else {
        /* Try ISO 8859-1 conversion first */
        int error_number = sjis_utf8tosb(3, source, &length, jisdata);
        if (error_number != 0) {
            /* Try Shift-JIS */
            error_number = sjis_utf8tomb(symbol, source, &length, jisdata);
            if (error_number != 0) {
                return error_number;
            }
        }
    }

    /* Determine if alpha (excluding numerics), byte or kanji used */
    for (i = 0; i < length && (alpha_used == 0 || byte_or_kanji_used == 0); i++) {
        if (jisdata[i] < '0' || jisdata[i] > '9') {
            if (is_alpha(jisdata[i], 0 /*gs1*/)) {
                alpha_used = 1;
            } else {
                byte_or_kanji_used = 1;
            }
        }
    }

    for (i = 0; i < 4; i++) {
        version_valid[i] = 1;
    }

    /* Eliminate possible versions depending on type of content */









    if (byte_or_kanji_used) {
        version_valid[0] = 0;

        version_valid[1] = 0;
    } else if (alpha_used) {

        version_valid[0] = 0;



    }










    /* Eliminate possible versions depending on error correction level specified */

    if (ecc_level == LEVEL_Q) {
        version_valid[0] = 0;
        version_valid[1] = 0;
        version_valid[2] = 0;
    } else if (ecc_level == LEVEL_M) {
        version_valid[0] = 0;
    }




    /* Determine length of binary data */


    for (i = 0; i < 4; i++) {



        if (version_valid[i]) {






            binary_count[i] = getBinaryLength(MICROQR_VERSION + i, mode, jisdata, length, 0 /*gs1*/, 0 /*eci*/, symbol->debug);





        } else {
            binary_count[i] = 128 + 1;
        }













    }

    /* Eliminate possible versions depending on length of binary data */
    if (binary_count[0] > 20) {
        version_valid[0] = 0;
    }
    if (binary_count[1] > 40) {
        version_valid[1] = 0;
    }
    if (binary_count[2] > 84) {
        version_valid[2] = 0;
    }
    if (binary_count[3] > 128) {
        strcpy(symbol->errtxt, "565: Input data too long");
        return ZINT_ERROR_TOO_LONG;
    }

    /* Eliminate possible versions depending on binary length and error correction level specified */
    if (ecc_level == LEVEL_Q) {



        if (binary_count[3] > 80) {
            strcpy(symbol->errtxt, "567: Input data too long");
            return ZINT_ERROR_TOO_LONG;
        }


    } else if (ecc_level == LEVEL_M) {

        if (binary_count[1] > 32) {
            version_valid[1] = 0;
        }
        if (binary_count[2] > 68) {
            version_valid[2] = 0;
        }
        if (binary_count[3] > 112) {
2750
2751
2752
2753
2754
2755
2756
2757

2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779

2780

2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
            version = symbol->option_2 - 1;
        } else {
            strcpy(symbol->errtxt, "570: Input too long for selected symbol size");
            return ZINT_ERROR_TOO_LONG;
        }
    }

    /* If there is enough unused space then increase the error correction level */

    if (version == 3) {
        if (binary_count[3] <= 112) {
            ecc_level = LEVEL_M;
        }
        if (binary_count[3] <= 80) {
            ecc_level = LEVEL_Q;
        }
    }

    if (version == 2) {
        if (binary_count[2] <= 68) {
            ecc_level = LEVEL_M;
        }
    }

    if (version == 1) {
        if (binary_count[1] <= 32) {
            ecc_level = LEVEL_M;
        }
    }

    strcpy(full_stream, "");

    microqr_expand_binary(binary_stream, full_stream, version);


    switch (version) {
        case 0: micro_qr_m1(full_stream);
            break;
        case 1: micro_qr_m2(full_stream, ecc_level);
            break;
        case 2: micro_qr_m3(full_stream, ecc_level);
            break;
        case 3: micro_qr_m4(full_stream, ecc_level);
            break;
    }

    size = micro_qr_sizes[version];
#ifndef _MSC_VER
    unsigned char grid[size * size];
#else







|
>
|
|
|
|
|
|
|
<
<
|
|
|
|
<
<
|
|
|
|
|
|
|
>
|
>


|

|

|

|







2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496


2497
2498
2499
2500


2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
            version = symbol->option_2 - 1;
        } else {
            strcpy(symbol->errtxt, "570: Input too long for selected symbol size");
            return ZINT_ERROR_TOO_LONG;
        }
    }

    /* If there is enough unused space then increase the error correction level, unless user-specified */
    if (symbol->option_1 == -1 || symbol->option_1 != ecc_level) {
        if (version == 3) {
            if (binary_count[3] <= 112) {
                ecc_level = LEVEL_M;
            }
            if (binary_count[3] <= 80) {
                ecc_level = LEVEL_Q;
            }


        } else if (version == 2) {
            if (binary_count[2] <= 68) {
                ecc_level = LEVEL_M;
            }


        } else if (version == 1) {
            if (binary_count[1] <= 32) {
                ecc_level = LEVEL_M;
            }
        }
    }

    qr_define_mode(mode, jisdata, length, 0 /*gs1*/, MICROQR_VERSION + version, symbol->debug);

    qr_binary((unsigned char*)full_stream, MICROQR_VERSION + version, 0 /*target_codewords*/, mode, jisdata, length, 0 /*gs1*/, 0 /*eci*/, binary_count[version], symbol->debug);

    switch (version) {
        case 0: micro_qr_m1(symbol, full_stream);
            break;
        case 1: micro_qr_m2(symbol, full_stream, ecc_level);
            break;
        case 2: micro_qr_m3(symbol, full_stream, ecc_level);
            break;
        case 3: micro_qr_m4(symbol, full_stream, ecc_level);
            break;
    }

    size = micro_qr_sizes[version];
#ifndef _MSC_VER
    unsigned char grid[size * size];
#else
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923


2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972



2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
        symbol->row_height[i] = 1;
    }

    return 0;
}

/* For UPNQR the symbol size and error correction capacity is fixed */
int upnqr(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    int i, j, est_binlen;
    int ecc_level, version, target_binlen, blocks, size;
    int bitmask, error_number;

#ifndef _MSC_VER
    int jisdata[length + 1];
    char mode[length + 1];
#else
    int* datastream;
    int* fullstream;
    unsigned char* grid;
    int* jisdata = (int *) _alloca((length + 1) * sizeof (int));
    char* mode = (char *) _alloca(length + 1);
#endif

#ifndef _MSC_VER
    unsigned char preprocessed[length + 1];
#else
    unsigned char* preprocessed = (unsigned char*) _alloca(length + 1);
#endif



    switch(symbol->input_mode) {
        case DATA_MODE:
            /* Input is already in ISO-8859-2 format */
            for (i = 0; i < length; i++) {
                jisdata[i] = (int) source[i];
                mode[i] = 'B';
            }
            break;
        case GS1_MODE:
            strcpy(symbol->errtxt, "571: UPNQR does not support GS-1 encoding");
            return ZINT_ERROR_INVALID_OPTION;
            break;
        case UNICODE_MODE:
            error_number = utf_to_eci(4, source, preprocessed, &length);
            if (error_number != 0) {
                strcpy(symbol->errtxt, "572: Invalid characters in input data");
                return error_number;
            }
            for (i = 0; i < length; i++) {
                jisdata[i] = (int) preprocessed[i];
                mode[i] = 'B';
            }
            break;
    }

    symbol->eci = 4;
    est_binlen = getBinaryLength(15, mode, jisdata, length, 0, symbol->eci);

    ecc_level = LEVEL_M;

    if (est_binlen > 3320) {
        strcpy(symbol->errtxt, "573: Input too long for selected symbol");
        return ZINT_ERROR_TOO_LONG;
    }

    version = 15; // 77 x 77

    target_binlen = qr_data_codewords_M[version - 1];
    blocks = qr_blocks_M[version - 1];

#ifndef _MSC_VER
    int datastream[target_binlen + 1];
    int fullstream[qr_total_codewords[version - 1] + 1];
#else
    datastream = (int *) _alloca((target_binlen + 1) * sizeof (int));
    fullstream = (int *) _alloca((qr_total_codewords[version - 1] + 1) * sizeof (int));
#endif

    qr_binary(datastream, version, target_binlen, mode, jisdata, length, 0, symbol->eci, est_binlen, symbol->debug);



    add_ecc(fullstream, datastream, version, target_binlen, blocks);

    size = qr_sizes[version - 1];
#ifndef _MSC_VER
    unsigned char grid[size * size];
#else
    grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
#endif

    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            grid[(i * size) + j] = 0;
        }
    }

    setup_grid(grid, size, version);
    populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]);

    add_version_info(grid, size, version);

    bitmask = apply_bitmask(grid, size, ecc_level);

    add_format_info(grid, size, ecc_level, bitmask);








|

|



|


|
|

|









>
>
|



|














|





<
|










|

<

|
|

|
|


|
>
>
>
|















|







2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680

2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693

2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
        symbol->row_height[i] = 1;
    }

    return 0;
}

/* For UPNQR the symbol size and error correction capacity is fixed */
INTERNAL int upnqr(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    int i, j, est_binlen;
    int ecc_level, version, target_codewords, blocks, size;
    int bitmask, error_number;

#ifndef _MSC_VER
    unsigned int jisdata[length + 1];
    char mode[length + 1];
#else
    unsigned char* datastream;
    unsigned char* fullstream;
    unsigned char* grid;
    unsigned int* jisdata = (unsigned int *) _alloca((length + 1) * sizeof (unsigned int));
    char* mode = (char *) _alloca(length + 1);
#endif

#ifndef _MSC_VER
    unsigned char preprocessed[length + 1];
#else
    unsigned char* preprocessed = (unsigned char*) _alloca(length + 1);
#endif

    symbol->eci = 4; /* Set before any processing */

    switch (symbol->input_mode & 0x07) {
        case DATA_MODE:
            /* Input is already in ISO-8859-2 format */
            for (i = 0; i < length; i++) {
                jisdata[i] = source[i];
                mode[i] = 'B';
            }
            break;
        case GS1_MODE:
            strcpy(symbol->errtxt, "571: UPNQR does not support GS-1 encoding");
            return ZINT_ERROR_INVALID_OPTION;
            break;
        case UNICODE_MODE:
            error_number = utf_to_eci(4, source, preprocessed, &length);
            if (error_number != 0) {
                strcpy(symbol->errtxt, "572: Invalid characters in input data");
                return error_number;
            }
            for (i = 0; i < length; i++) {
                jisdata[i] = preprocessed[i];
                mode[i] = 'B';
            }
            break;
    }


    est_binlen = getBinaryLength(15, mode, jisdata, length, 0, symbol->eci, symbol->debug);

    ecc_level = LEVEL_M;

    if (est_binlen > 3320) {
        strcpy(symbol->errtxt, "573: Input too long for selected symbol");
        return ZINT_ERROR_TOO_LONG;
    }

    version = 15; // 77 x 77

    target_codewords = qr_data_codewords_M[version - 1];
    blocks = qr_blocks_M[version - 1];

#ifndef _MSC_VER
    unsigned char datastream[target_codewords + 1];
    unsigned char fullstream[qr_total_codewords[version - 1] + 1];
#else
    datastream = (unsigned char *) _alloca(target_codewords + 1);
    fullstream = (unsigned char *) _alloca(qr_total_codewords[version - 1] + 1);
#endif

    qr_binary(datastream, version, target_codewords, mode, jisdata, length, 0, symbol->eci, est_binlen, symbol->debug);
#ifdef ZINT_TEST
    if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, datastream, target_codewords);
#endif
    add_ecc(fullstream, datastream, version, target_codewords, blocks, symbol->debug);

    size = qr_sizes[version - 1];
#ifndef _MSC_VER
    unsigned char grid[size * size];
#else
    grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char));
#endif

    for (i = 0; i < size; i++) {
        for (j = 0; j < size; j++) {
            grid[(i * size) + j] = 0;
        }
    }

    setup_grid(grid, size, version);
    populate_grid(grid, size, size, fullstream, qr_total_codewords[version - 1]);

    add_version_info(grid, size, version);

    bitmask = apply_bitmask(grid, size, ecc_level);

    add_format_info(grid, size, ecc_level, bitmask);

3005
3006
3007
3008
3009
3010
3011




3012






















































































































































































































































































































































        }
        symbol->row_height[i] = 1;
    }

    return 0;
}



































































































































































































































































































































































>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
        }
        symbol->row_height[i] = 1;
    }

    return 0;
}

static void setup_rmqr_grid(unsigned char* grid,const int h_size,const int v_size,const int version) {
    int i, j;
    char alignment[] = {0x1F, 0x11, 0x15, 0x11, 0x1F};
    int h_version, finder_position;

    /* Add timing patterns - top and bottom */
    for (i = 0; i < h_size; i++) {
        if (i % 2) {
            grid[i] = 0x20;
            grid[((v_size - 1) * h_size) + i] = 0x20;
        } else {
            grid[i] = 0x21;
            grid[((v_size - 1) * h_size) + i] = 0x21;
        }
    }

    /* Add timing patterns - left and right */
    for (i = 0; i < v_size; i++) {
        if (i % 2) {
            grid[i * h_size] = 0x20;
            grid[(i * h_size) + (h_size - 1)] = 0x20;
        } else {
            grid[i * h_size] = 0x21;
            grid[(i * h_size) + (h_size - 1)] = 0x21;
        }
    }

    /* Add finder pattern */
    place_finder(grid, h_size, 0, 0); // This works because finder is always top left

    /* Add finder sub-pattern to bottom right */
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            if (alignment[j] & 0x10 >> i) {
                grid[((v_size - 5) * h_size) + (h_size * i) + (h_size - 5) + j] = 0x11;
            } else {
                grid[((v_size - 5) * h_size) + (h_size * i) + (h_size - 5) + j] = 0x10;
            }
        }
    }

    /* Add corner finder pattern - bottom left */
    grid[(v_size - 2) * h_size] = 0x11;
    grid[((v_size - 2) * h_size) + 1] = 0x10;
    grid[((v_size - 1) * h_size) + 1] = 0x11;

    /* Add corner finder pattern - top right */
    grid[h_size - 2] = 0x11;
    grid[(h_size * 2) - 2] = 0x10;
    grid[(h_size * 2) - 1] = 0x11;

    /* Add seperator */
    for (i = 0; i < 7; i++) {
        grid[(i * h_size) + 7] = 0x20;
    }
    if (v_size > 7) {
        // Note for v_size = 9 this overrides the bottom right corner finder pattern
        for(i = 0; i < 8; i++) {
            grid[(7 * h_size) + i] = 0x20;
        }
    }

    /* Add alignment patterns */
    if (h_size > 27) {
        for(i = 0; i < 5; i++) {
            if (h_size == rmqr_width[i]) {
                h_version = i;
            }
        }

        for(i = 0; i < 4; i++) {
            finder_position = rmqr_table_d1[(h_version * 4) + i];

            if (finder_position != 0) {
                for (j = 0; j < v_size; j++) {
                    if (j % 2) {
                        grid[(j * h_size) + finder_position] = 0x10;
                    } else {
                        grid[(j * h_size) + finder_position] = 0x11;
                    }
                }

                // Top square
                grid[h_size + finder_position - 1] = 0x11;
                grid[(h_size * 2) + finder_position - 1] = 0x11;
                grid[h_size + finder_position + 1] = 0x11;
                grid[(h_size * 2) + finder_position + 1] = 0x11;

                // Bottom square
                grid[(h_size * (v_size - 3)) + finder_position - 1] = 0x11;
                grid[(h_size * (v_size - 2)) + finder_position - 1] = 0x11;
                grid[(h_size * (v_size - 3)) + finder_position + 1] = 0x11;
                grid[(h_size * (v_size - 2)) + finder_position + 1] = 0x11;
            }
        }
    }

    /* Reserve space for format information */
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 3; j++) {
            grid[(h_size * (i + 1)) + j + 8] = 0x20;
            grid[(h_size * (v_size - 6)) + (h_size * i) + j + (h_size - 8)] = 0x20;
        }
    }
    grid[(h_size * 1) + 11] = 0x20;
    grid[(h_size * 2) + 11] = 0x20;
    grid[(h_size * 3) + 11] = 0x20;
    grid[(h_size * (v_size - 6)) + (h_size - 5)] = 0x20;
    grid[(h_size * (v_size - 6)) + (h_size - 4)] = 0x20;
    grid[(h_size * (v_size - 6)) + (h_size - 3)] = 0x20;
}

/* rMQR according to 2018 draft standard */
INTERNAL int rmqr(struct zint_symbol *symbol, const unsigned char source[], size_t length) {
    int i, j, est_binlen;
    int ecc_level, autosize, version, max_cw, target_codewords, blocks, h_size, v_size;
    int gs1;
    int footprint, best_footprint, format_data;
    unsigned int left_format_info, right_format_info;

#ifndef _MSC_VER
    unsigned int jisdata[length + 1];
    char mode[length + 1];
#else
    unsigned char* datastream;
    unsigned char* fullstream;
    unsigned char* grid;
    unsigned int* jisdata = (unsigned int *) _alloca((length + 1) * sizeof (unsigned int));
    char* mode = (char *) _alloca(length + 1);
#endif

    gs1 = ((symbol->input_mode & 0x07) == GS1_MODE);

    if ((symbol->input_mode & 0x07) == DATA_MODE) {
        sjis_cpy(source, &length, jisdata);
    } else {
        /* Try ISO 8859-1 conversion first */
        int error_number = sjis_utf8tosb(3, source, &length, jisdata);
        if (error_number != 0) {
            /* Try Shift-JIS */
            error_number = sjis_utf8tomb(symbol, source, &length, jisdata);
            if (error_number != 0) {
                return error_number;
            }
        }
    }

    est_binlen = getBinaryLength(RMQR_VERSION + 31, mode, jisdata, length, gs1, 0 /*eci*/, symbol->debug);

    ecc_level = LEVEL_M;
    max_cw = 152;
    if (symbol->option_1 == 1) {
        strcpy(symbol->errtxt, "576: Error correction level L not available in rMQR");
        return ZINT_ERROR_INVALID_OPTION;
    }

    if (symbol->option_1 == 3) {
        strcpy(symbol->errtxt, "577: Error correction level Q not available in rMQR");
        return ZINT_ERROR_INVALID_OPTION;
    }

    if (symbol->option_1 == 4) {
        ecc_level = LEVEL_H;
        max_cw = 76;
    }

    if (est_binlen > (8 * max_cw)) {
        strcpy(symbol->errtxt, "578: Input too long for selected error correction level");
        return ZINT_ERROR_TOO_LONG;
    }

    if ((symbol->option_2 < 0) || (symbol->option_2 > 38)) {
        strcpy(symbol->errtxt, "579: Invalid rMQR symbol size");
        return ZINT_ERROR_INVALID_OPTION;
    }

    version = 31; // Set default to keep compiler happy

    if (symbol->option_2 == 0) {
        // Automatic symbol size
        autosize = 31;
        best_footprint = rmqr_height[31] * rmqr_width[31];
        for (version = 30; version >= 0; version--) {
            est_binlen = getBinaryLength(RMQR_VERSION + version, mode, jisdata, length, gs1, 0 /*eci*/, symbol->debug);
            footprint = rmqr_height[version] * rmqr_width[version];
            if (ecc_level == LEVEL_M) {
                if (8 * rmqr_data_codewords_M[version] >= est_binlen) {
                    if (footprint < best_footprint) {
                        autosize = version;
                        best_footprint = footprint;
                    }
                }
            } else {
                if (8 * rmqr_data_codewords_H[version] >= est_binlen) {
                    if (footprint < best_footprint) {
                        autosize = version;
                        best_footprint = footprint;
                    }
                }
            }
        }
        version = autosize;
        est_binlen = getBinaryLength(RMQR_VERSION + version, mode, jisdata, length, gs1, 0 /*eci*/, symbol->debug);
    }

    if ((symbol->option_2 >= 1) && (symbol->option_2 <= 32)) {
        // User specified symbol size
        version = symbol->option_2 - 1;
        est_binlen = getBinaryLength(RMQR_VERSION + version, mode, jisdata, length, gs1, 0 /*eci*/, symbol->debug);
    }

    if (symbol->option_2 >= 33) {
        // User has specified symbol height only
        version = rmqr_fixed_height_upper_bound[symbol->option_2 - 32];
        for(i = version - 1; i > rmqr_fixed_height_upper_bound[symbol->option_2 - 33]; i--) {
            est_binlen = getBinaryLength(RMQR_VERSION + i, mode, jisdata, length, gs1, 0 /*eci*/, symbol->debug);
            if (ecc_level == LEVEL_M) {
                if (8 * rmqr_data_codewords_M[i] >= est_binlen) {
                    version = i;
                }
            } else {
                if (8 * rmqr_data_codewords_H[i] >= est_binlen) {
                    version = i;
                }
            }
        }
        est_binlen = getBinaryLength(RMQR_VERSION + version, mode, jisdata, length, gs1, 0 /*eci*/, symbol->debug);
    }

    if (symbol->option_1 == -1) {
        // Detect if there is enough free space to increase ECC level
        if (est_binlen < (rmqr_data_codewords_H[version] * 8)) {
            ecc_level = LEVEL_H;
        }
    }

    if (ecc_level == LEVEL_M) {
        target_codewords = rmqr_data_codewords_M[version];
        blocks = rmqr_blocks_M[version];
    } else {
        target_codewords = rmqr_data_codewords_H[version];
        blocks = rmqr_blocks_H[version];
    }

    if (est_binlen > (target_codewords * 8)) {
        // User has selected a symbol too small for the data
        strcpy(symbol->errtxt, "580: Input too long for selected symbol size");
        return ZINT_ERROR_TOO_LONG;
    }

    if (symbol->debug & ZINT_DEBUG_PRINT) {
        printf("Minimum codewords = %d\n", est_binlen / 8);
        printf("Selected version: %d = R%dx%d-", (version + 1), rmqr_height[version], rmqr_width[version]);
        if (ecc_level == LEVEL_M) {
            printf("M\n");
        } else {
            printf("H\n");
        }
        printf("Number of data codewords in symbol = %d\n", target_codewords);
        printf("Number of ECC blocks = %d\n", blocks);
    }

#ifndef _MSC_VER
    unsigned char datastream[target_codewords + 1];
    unsigned char fullstream[rmqr_total_codewords[version] + 1];
#else
    datastream = (unsigned char *) _alloca((target_codewords + 1) * sizeof (unsigned char));
    fullstream = (unsigned char *) _alloca((rmqr_total_codewords[version] + 1) * sizeof (unsigned char));
#endif

    qr_binary(datastream, RMQR_VERSION + version, target_codewords, mode, jisdata, length, gs1, 0 /*eci*/, est_binlen, symbol->debug);
#ifdef ZINT_TEST
    if (symbol->debug & ZINT_DEBUG_TEST) debug_test_codeword_dump(symbol, datastream, target_codewords);
#endif
    add_ecc(fullstream, datastream, RMQR_VERSION + version, target_codewords, blocks, symbol->debug);

    h_size = rmqr_width[version];
    v_size = rmqr_height[version];

#ifndef _MSC_VER
    unsigned char grid[h_size * v_size];
#else
    grid = (unsigned char *) _alloca((h_size * v_size) * sizeof (unsigned char));
#endif

    for (i = 0; i < v_size; i++) {
        for (j = 0; j < h_size; j++) {
            grid[(i * h_size) + j] = 0;
        }
    }

    setup_rmqr_grid(grid, h_size, v_size, version);
    populate_grid(grid, h_size, v_size, fullstream, rmqr_total_codewords[version]);

    /* apply bitmask */
    for (i = 0; i < v_size; i++) {
        for (j = 0; j < h_size; j++) {
            if ((grid[(i * h_size) + j] & 0xf0) == 0) {
                // This is a data module
                if (((i / 2) + (j / 3)) % 2 == 0) { // < This is the data mask from section 7.8.2
                    // This module needs to be changed
                    if (grid[(i * h_size) + j] == 0x01) {
                        grid[(i * h_size) + j] = 0x00;
                    } else {
                        grid[(i * h_size) + j] = 0x01;
                    }
                }
            }
        }
    }

    /* add format information */
    format_data = version;
    if (ecc_level == LEVEL_H) {
        format_data += 32;
    }
    left_format_info = rmqr_format_info_left[format_data];
    right_format_info = rmqr_format_info_right[format_data];

    for (i = 0; i < 5; i++) {
        for (j = 0; j < 3; j++) {
            grid[(h_size * (i + 1)) + j + 8] = (left_format_info >> ((j * 5) + i)) & 0x01;
            grid[(h_size * (v_size - 6)) + (h_size * i) + j + (h_size - 8)] = (right_format_info >> ((j * 5) + i)) & 0x01;
        }
    }
    grid[(h_size * 1) + 11] = (left_format_info >> 15) & 0x01;
    grid[(h_size * 2) + 11] = (left_format_info >> 16) & 0x01;
    grid[(h_size * 3) + 11] = (left_format_info >> 17) & 0x01;
    grid[(h_size * (v_size - 6)) + (h_size - 5)] = (right_format_info >> 15) & 0x01;
    grid[(h_size * (v_size - 6)) + (h_size - 4)] = (right_format_info >> 16) & 0x01;
    grid[(h_size * (v_size - 6)) + (h_size - 3)] = (right_format_info >> 17) & 0x01;


    symbol->width = h_size;
    symbol->rows = v_size;

    for (i = 0; i < v_size; i++) {
        for (j = 0; j < h_size; j++) {
            if (grid[(i * h_size) + j] & 0x01) {
                set_module(symbol, i, j);
            }
        }
        symbol->row_height[i] = 1;
    }

    return 0;
}
Changes to jni/zint/backend/qr.h.
1
2
3
4
5
6
7
8
9
10
11
12
/* qr.h Data for QR Code */

/*
    libzint - the open source barcode library
    Copyright (C) 2008-2017 Robin Stuart <rstuart114@gmail.com>
    Copyright (C) 2006 Kentaro Fukuchi <fukuchi@megaui.net>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
|

<

|







1
2

3
4
5
6
7
8
9
10
11
/* qr.h Data for QR Code, Micro QR Code and rMQR


    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>
    Copyright (C) 2006 Kentaro Fukuchi <fukuchi@megaui.net>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
27
28
29
30
31
32
33
34
35
36
37
38
39



40
41
42
43
44
45
46
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#define LEVEL_L	1
#define LEVEL_M	2
#define LEVEL_Q	3
#define LEVEL_H	4

#define RHODIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"




/* From ISO/IEC 18004:2006 Table 7 */
static const unsigned short int qr_data_codewords_L[] = {
    19, 34, 55, 80, 108, 136, 156, 194, 232, 274, 324, 370, 428, 461, 523, 589, 647,
    721, 795, 861, 932, 1006, 1094, 1174, 1276, 1370, 1468, 1531, 1631,
    1735, 1843, 1955, 2071, 2191, 2306, 2434, 2566, 2702, 2812, 2956
};







|
|
|
|


>
>
>







26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#define LEVEL_L    1
#define LEVEL_M    2
#define LEVEL_Q    3
#define LEVEL_H    4

#define RHODIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:"

#define RMQR_VERSION    100
#define MICROQR_VERSION 200

/* From ISO/IEC 18004:2006 Table 7 */
static const unsigned short int qr_data_codewords_L[] = {
    19, 34, 55, 80, 108, 136, 156, 194, 232, 274, 324, 370, 428, 461, 523, 589, 647,
    721, 795, 861, 932, 1006, 1094, 1174, 1276, 1370, 1468, 1531, 1631,
    1735, 1843, 1955, 2071, 2191, 2306, 2434, 2566, 2702, 2812, 2956
};
64
65
66
67
68
69
70






















































































71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90


















91
92
93
94
95
96
97
98
99
100
101
102
103
104

105
106
107
108
109
110
111
};

static const unsigned short int qr_total_codewords[] = {
    26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815,
    901, 991, 1085, 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051,
    2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706
};























































































static const char qr_blocks_L[] = {
    1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12,
    12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25
};

static const char qr_blocks_M[] = {
    1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20,
    21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49
};

static const char qr_blocks_Q[] = {
    1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25,
    27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68
};

static const char qr_blocks_H[] = {
    1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30,
    32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81
};



















static const unsigned short int qr_sizes[] = {
    21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97,
    101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177
};

static const char micro_qr_sizes[] = {
    11, 13, 15, 17
};

static const char qr_align_loopsize[] = {
    0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7
};


static const unsigned short int qr_table_e1[] = {
    6, 18, 0, 0, 0, 0, 0,
    6, 22, 0, 0, 0, 0, 0,
    6, 26, 0, 0, 0, 0, 0,
    6, 30, 0, 0, 0, 0, 0,
    6, 34, 0, 0, 0, 0, 0,
    6, 22, 38, 0, 0, 0, 0,







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>




















>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>














>







66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
};

static const unsigned short int qr_total_codewords[] = {
    26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815,
    901, 991, 1085, 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051,
    2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706
};

static const unsigned short int rmqr_height[] = {
    7, 7, 7, 7, 7,
    9, 9, 9, 9, 9,
    11, 11, 11, 11, 11, 11,
    13, 13, 13, 13, 13, 13,
    15, 15, 15, 15, 15,
    17, 17, 17, 17, 17
};

static const unsigned short int rmqr_width[] = {
    43, 59, 77, 99, 139,
    43, 59, 77, 99, 139,
    27, 43, 59, 77, 99, 139,
    27, 43, 59, 77, 99, 139,
    43, 59, 77, 99, 139,
    43, 59, 77, 99, 139
};

static const unsigned short int rmqr_data_codewords_M[] = {
    6, 12, 20, 28, 44, // R7x
    12, 21, 31, 42, 63, // R9x
    7, 19, 31, 43, 57, 84, // R11x
    12, 27, 38, 53, 73, 106, // R13x
    33, 48, 67, 88, 127, // R15x
    39, 56, 78, 100, 152 // R17x
};

static const unsigned short int rmqr_data_codewords_H[] = {
    3, 7, 10, 14, 24, // R7x
    7, 11, 17, 22, 33, // R9x
    5, 11, 15, 23, 29, 42, // R11x
    7, 13, 20, 29, 35, 54, // R13x
    15, 26, 31, 48, 69, // R15x
    21, 28, 38, 56, 76 // R17x
};

static const short int rmqr_fixed_height_upper_bound[] = {
    -1, 4, 9, 15, 21, 26, 31
};

static const unsigned short int rmqr_total_codewords[] = {
    13, 21, 32, 44, 68, // R7x
    21, 33, 49, 66, 99, // R9x
    15, 31, 47, 67, 89, 132, // R11x
    21, 41, 60, 85, 113, 166, // R13x
    51, 74, 103, 136, 199, // R15x
    61, 88, 122, 160, 232 // R17x
};


static const unsigned short int rmqr_numeric_cci[] = {
    4, 5, 6, 7, 7,
    5, 6, 7, 7, 8,
    5, 6, 7, 7, 8, 8,
    5, 7, 7, 8, 8, 8,
    7, 7, 8, 8, 9,
    7, 8, 8, 8, 9
};

static const unsigned short int rmqr_alphanum_cci[] = {
    4, 5, 5, 6, 6,
    5, 5, 6, 6, 7,
    4, 5, 6, 6, 7, 7,
    5, 6, 6, 7, 7, 8,
    6, 7, 7, 7, 8,
    6, 7, 7, 8, 8
};

static const unsigned short int rmqr_byte_cci[] = {
    3, 4, 5, 5, 6,
    4, 5, 5, 6, 6,
    3, 5, 5, 6, 6, 7,
    4, 5, 6, 6, 7, 7,
    6, 6, 7, 7, 7,
    6, 6, 7, 7, 8
};

static const unsigned short int rmqr_kanji_cci[] = {
    2, 3, 4, 5, 5,
    3, 4, 5, 5, 6,
    2, 4, 5, 5, 6, 6,
    3, 5, 5, 6, 6, 7,
    5, 5, 6, 6, 7,
    5, 6, 6, 6, 7
};

static const char qr_blocks_L[] = {
    1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12,
    12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25
};

static const char qr_blocks_M[] = {
    1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20,
    21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49
};

static const char qr_blocks_Q[] = {
    1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25,
    27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68
};

static const char qr_blocks_H[] = {
    1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30,
    32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81
};

static const char rmqr_blocks_M[] = {
    1, 1, 1, 1, 1, // R7x
    1, 1, 1, 1, 2, // R9x
    1, 1, 1, 1, 2, 2, // R11x
    1, 1, 1, 2, 2, 3, // R13x
    1, 1, 2, 2, 3, // R15x
    1, 2, 2, 3, 4 // R17x
};

static const char rmqr_blocks_H[] = {
    1, 1, 1, 1, 2, // R7x
    1, 1, 2, 2, 3, // R9x
    1, 1, 2, 2, 2, 3, // R11x
    1, 1, 2, 2, 3, 4, // R13x
    2, 2, 3, 4, 5, // R15x
    2, 2, 3, 4, 6 // R17x
};

static const unsigned short int qr_sizes[] = {
    21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97,
    101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177
};

static const char micro_qr_sizes[] = {
    11, 13, 15, 17
};

static const char qr_align_loopsize[] = {
    0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7
};

// Table E1 - Row/column coordinates of center module of alignment patterns
static const unsigned short int qr_table_e1[] = {
    6, 18, 0, 0, 0, 0, 0,
    6, 22, 0, 0, 0, 0, 0,
    6, 26, 0, 0, 0, 0, 0,
    6, 30, 0, 0, 0, 0, 0,
    6, 34, 0, 0, 0, 0, 0,
    6, 22, 38, 0, 0, 0, 0,
139
140
141
142
143
144
145









146
147
148
149
150
151
152
    6, 30, 54, 78, 102, 126, 150,
    6, 24, 50, 76, 102, 128, 154,
    6, 28, 54, 80, 106, 132, 158,
    6, 32, 58, 84, 110, 136, 162,
    6, 26, 54, 82, 110, 138, 166,
    6, 30, 58, 86, 114, 142, 170
};










static const unsigned int qr_annex_c[] = {
    /* Format information bit sequences */
    0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, 0x77c4, 0x72f3, 0x7daa, 0x789d,
    0x662f, 0x6318, 0x6c41, 0x6976, 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b,
    0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed
};







>
>
>
>
>
>
>
>
>







246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
    6, 30, 54, 78, 102, 126, 150,
    6, 24, 50, 76, 102, 128, 154,
    6, 28, 54, 80, 106, 132, 158,
    6, 32, 58, 84, 110, 136, 162,
    6, 26, 54, 82, 110, 138, 166,
    6, 30, 58, 86, 114, 142, 170
};

// Table D1 - Column coordinates of centre module of alignment patterns
static const unsigned short int rmqr_table_d1[] = {
    21, 0, 0, 0,
    19, 39, 0, 0,
    25, 51, 0, 0,
    23, 49, 75, 0,
    27, 55, 83, 111
};

static const unsigned int qr_annex_c[] = {
    /* Format information bit sequences */
    0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, 0x77c4, 0x72f3, 0x7daa, 0x789d,
    0x662f, 0x6318, 0x6c41, 0x6976, 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b,
    0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed
};
161
162
163
164
165
166
167























static const unsigned int qr_annex_c1[] = {
    /* Micro QR Code format information */
    0x4445, 0x4172, 0x4e2b, 0x4b1c, 0x55ae, 0x5099, 0x5fc0, 0x5af7, 0x6793, 0x62a4, 0x6dfd, 0x68ca, 0x7678, 0x734f,
    0x7c16, 0x7921, 0x06de, 0x03e9, 0x0cb0, 0x0987, 0x1735, 0x1202, 0x1d5b, 0x186c, 0x2508, 0x203f, 0x2f66, 0x2a51, 0x34e3,
    0x31d4, 0x3e8d, 0x3bba
};





























>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305

static const unsigned int qr_annex_c1[] = {
    /* Micro QR Code format information */
    0x4445, 0x4172, 0x4e2b, 0x4b1c, 0x55ae, 0x5099, 0x5fc0, 0x5af7, 0x6793, 0x62a4, 0x6dfd, 0x68ca, 0x7678, 0x734f,
    0x7c16, 0x7921, 0x06de, 0x03e9, 0x0cb0, 0x0987, 0x1735, 0x1202, 0x1d5b, 0x186c, 0x2508, 0x203f, 0x2f66, 0x2a51, 0x34e3,
    0x31d4, 0x3e8d, 0x3bba
};

static const unsigned int rmqr_format_info_left[] = {
    /* rMQR format information for finder pattern side */
    0x1FAB2, 0x1E597, 0x1DBDD, 0x1C4F8, 0x1B86C, 0x1A749, 0x19903, 0x18626, 0x17F0E, 0x1602B,
    0x15E61, 0x14144, 0x13DD0, 0x122F5, 0x11CBF, 0x1039A, 0x0F1CA, 0x0EEEF, 0x0D0A5, 0x0CF80,
    0x0B314, 0x0AC31, 0x0927B, 0x08D5E, 0x07476, 0x06B53, 0x05519, 0x04A3C, 0x036A8, 0x0298D,
    0x017C7, 0x008E2, 0x3F367, 0x3EC42, 0x3D208, 0x3CD2D, 0x3B1B9, 0x3AE9C, 0x390D6, 0x38FF3,
    0x376DB, 0x369FE, 0x357B4, 0x34891, 0x33405, 0x32B20, 0x3156A, 0x30A4F, 0x2F81F, 0x2E73A,
    0x2D970, 0x2C655, 0x2BAC1, 0x2A5E4, 0x29BAE, 0x2848B, 0x27DA3, 0x26286, 0x25CCC, 0x243E9,
    0x23F7D, 0x22058, 0x21E12, 0x20137
};

static const unsigned int rmqr_format_info_right[] = {
    /* rMQR format information for subfinder pattern side */
    0x20A7B, 0x2155E, 0x22B14, 0x23431, 0x248A5, 0x25780, 0x269CA, 0x276EF, 0x28FC7, 0x290E2,
    0x2AEA8, 0x2B18D, 0x2CD19, 0x2D23C, 0x2EC76, 0x2F353, 0x30103, 0x31E26, 0x3206C, 0x33F49,
    0x343DD, 0x35CF8, 0x362B2, 0x37D97, 0x384BF, 0x39B9A, 0x3A5D0, 0x3BAF5, 0x3C661, 0x3D944,
    0x3E70E, 0x3F82B, 0x003AE, 0x01C8B, 0x022C1, 0x03DE4, 0x04170, 0x05E55, 0x0601F, 0x07F3A,
    0x08612, 0x09937, 0x0A77D, 0x0B858, 0x0C4CC, 0x0DBE9, 0x0E5A3, 0x0FA86, 0x108D6, 0x117F3,
    0x129B9, 0x1369C, 0x14A08, 0x1552D, 0x16B67, 0x17442, 0x18D6A, 0x1924F, 0x1AC05, 0x1B320,
    0x1CFB4, 0x1D091, 0x1EEDB, 0x1F1FE
};
Changes to jni/zint/backend/raster.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#ifdef _MSC_VER
#include <fcntl.h>
#include <io.h>
#endif
#include <stdlib.h>
#include <string.h>
#include "common.h"

#ifdef _MSC_VER
#include <malloc.h>
#endif /* _MSC_VER */

#include "font.h" /* Font for human readable text */

#define SSET	"0123456789ABCDEF"

#ifndef NO_PNG
extern int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
#endif /* NO_PNG */
extern int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
extern int pcx_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
extern int gif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
extern int tif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);

void buffer_plot(struct zint_symbol *symbol, char *pixelbuf) {
    /* Place pixelbuffer into symbol */
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int row, column, i;

    symbol->bitmap = (char *) malloc(symbol->bitmap_width * symbol->bitmap_height * 3);

    fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);







>



















|

|
|
|
|

|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#ifdef _MSC_VER
#include <fcntl.h>
#include <io.h>
#endif
#include <stdlib.h>
#include <string.h>
#include "common.h"

#ifdef _MSC_VER
#include <malloc.h>
#endif /* _MSC_VER */

#include "font.h" /* Font for human readable text */

#define SSET	"0123456789ABCDEF"

#ifndef NO_PNG
INTERNAL int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
#endif /* NO_PNG */
INTERNAL int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
INTERNAL int pcx_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
INTERNAL int gif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);
INTERNAL int tif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf);

static void buffer_plot(struct zint_symbol *symbol, char *pixelbuf) {
    /* Place pixelbuffer into symbol */
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int row, column, i;

    symbol->bitmap = (char *) malloc(symbol->bitmap_width * symbol->bitmap_height * 3);

    fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
                    break;

            }
        }
    }
}

int save_raster_image_to_file(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle, int image_type) {
    int error_number;
    int row, column;

    char *rotated_pixbuf;

    if (!(rotated_pixbuf = (char *) malloc(image_width * image_height))) {
        strcpy(symbol->errtxt, "650: Insufficient memory for pixel buffer");







|







86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
                    break;

            }
        }
    }
}

static int save_raster_image_to_file(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle, int image_type) {
    int error_number;
    int row, column;

    char *rotated_pixbuf;

    if (!(rotated_pixbuf = (char *) malloc(image_width * image_height))) {
        strcpy(symbol->errtxt, "650: Insufficient memory for pixel buffer");
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
            break;
    }

    free(rotated_pixbuf);
    return error_number;
}

void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height) {
    /* Draw a rectangle */
    int i, j, png_ypos;

    png_ypos = image_height - ypos - ylen;
    /* This fudge is needed because EPS measures height from the bottom up but
    PNG measures y position from the top down */

    for (i = (xpos); i < (xpos + xlen); i++) {
        for (j = (png_ypos); j < (png_ypos + ylen); j++) {
            *(pixelbuf + (image_width * j) + i) = '1';
        }
    }
}

void draw_circle(char *pixelbuf, int image_width, int image_height, int x0, int y0, float radius, char fill) {
    int x, y;
    int radius_i = (int) radius;

    for (y = -radius_i; y <= radius_i; y++) {
        for (x = -radius_i; x <= radius_i; x++) {
            if ((x * x) + (y * y) <= (radius_i * radius_i)) {
                if ((y + y0 >= 0) && (y + y0 < image_height)
                        && (x + x0 >= 0) && (x + x0 < image_width)) {
                    *(pixelbuf + ((y + y0) * image_width) + (x + x0)) = fill;
                }
            }
        }
    }
}

void draw_bullseye(char *pixelbuf, int image_width, int image_height, int xoffset, int yoffset, int scaler) {
    /* Central bullseye in Maxicode symbols */
    float x = 14.5 * scaler;
    float y = 15.0 * scaler;
    if(scaler < 10) {
        x = 16.0 * scaler;
        y = 16.5 * scaler;
    }
    
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (4.571 * scaler) + 1, '1');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (3.779 * scaler) + 1, '0');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (2.988 * scaler) + 1, '1');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (2.196 * scaler) + 1, '0');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (1.394 * scaler) + 1, '1');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (0.602 * scaler) + 1, '0');
}

void draw_hexagon(char *pixelbuf, int image_width, char *scaled_hexagon, int hexagon_size, int xposn, int yposn) {
    /* Put a hexagon into the pixel buffer */
    int i, j;

    for (i = 0; i < hexagon_size; i++) {
        for (j = 0; j < hexagon_size; j++) {
            if (scaled_hexagon[(i * hexagon_size) + j] == '1') {
                *(pixelbuf + (image_width * i) + (image_width * yposn) + xposn + j) = '1';
            }
        }
    }
}

void draw_letter(char *pixelbuf, unsigned char letter, int xposn, int yposn, int textflags, int image_width, int image_height) {
    /* Put a letter into a position */
    int skip;

    skip = 0;

    if (letter < 33) {
        skip = 1;







|














|















|
















|












|







204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
            break;
    }

    free(rotated_pixbuf);
    return error_number;
}

static void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height) {
    /* Draw a rectangle */
    int i, j, png_ypos;

    png_ypos = image_height - ypos - ylen;
    /* This fudge is needed because EPS measures height from the bottom up but
    PNG measures y position from the top down */

    for (i = (xpos); i < (xpos + xlen); i++) {
        for (j = (png_ypos); j < (png_ypos + ylen); j++) {
            *(pixelbuf + (image_width * j) + i) = '1';
        }
    }
}

static void draw_circle(char *pixelbuf, int image_width, int image_height, int x0, int y0, float radius, char fill) {
    int x, y;
    int radius_i = (int) radius;

    for (y = -radius_i; y <= radius_i; y++) {
        for (x = -radius_i; x <= radius_i; x++) {
            if ((x * x) + (y * y) <= (radius_i * radius_i)) {
                if ((y + y0 >= 0) && (y + y0 < image_height)
                        && (x + x0 >= 0) && (x + x0 < image_width)) {
                    *(pixelbuf + ((y + y0) * image_width) + (x + x0)) = fill;
                }
            }
        }
    }
}

static void draw_bullseye(char *pixelbuf, int image_width, int image_height, int xoffset, int yoffset, int scaler) {
    /* Central bullseye in Maxicode symbols */
    float x = 14.5 * scaler;
    float y = 15.0 * scaler;
    if(scaler < 10) {
        x = 16.0 * scaler;
        y = 16.5 * scaler;
    }
    
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (4.571 * scaler) + 1, '1');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (3.779 * scaler) + 1, '0');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (2.988 * scaler) + 1, '1');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (2.196 * scaler) + 1, '0');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (1.394 * scaler) + 1, '1');
    draw_circle(pixelbuf, image_width, image_height, x + xoffset, y + yoffset, (0.602 * scaler) + 1, '0');
}

static void draw_hexagon(char *pixelbuf, int image_width, char *scaled_hexagon, int hexagon_size, int xposn, int yposn) {
    /* Put a hexagon into the pixel buffer */
    int i, j;

    for (i = 0; i < hexagon_size; i++) {
        for (j = 0; j < hexagon_size; j++) {
            if (scaled_hexagon[(i * hexagon_size) + j] == '1') {
                *(pixelbuf + (image_width * i) + (image_width * yposn) + xposn + j) = '1';
            }
        }
    }
}

static void draw_letter(char *pixelbuf, unsigned char letter, int xposn, int yposn, int textflags, int image_width, int image_height) {
    /* Put a letter into a position */
    int skip;

    skip = 0;

    if (letter < 33) {
        skip = 1;
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
                }
                break;
        }
    }
}

/* Plot a string into the pixel buffer */
void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, int textflags, int image_width, int image_height) {
    int i, string_length, string_left_hand, letter_width = 7;

    switch (textflags) {
        case 1: // small font 5x9
            letter_width = 5;
            break;








|







383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
                }
                break;
        }
    }
}

/* Plot a string into the pixel buffer */
static void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, int textflags, int image_width, int image_height) {
    int i, string_length, string_left_hand, letter_width = 7;

    switch (textflags) {
        case 1: // small font 5x9
            letter_width = 5;
            break;

408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439

    for (i = 0; i < string_length; i++) {
        draw_letter(pixbuf, input_string[i], string_left_hand + (i * letter_width), yposn, textflags, image_width, image_height);
    }

}

void plot_hexline(char *scaled_hexagon, int hexagon_size, float start_x, float start_y, float end_x, float end_y) {
    /* Draw a straight line from start to end */
    int i;
    float inc_x, inc_y;

    inc_x = (end_x - start_x) / hexagon_size;
    inc_y = (end_y - start_y) / hexagon_size;

    for (i = 0; i < hexagon_size; i++) {
        float this_x = start_x + ((float)i * inc_x);
        float this_y = start_y + ((float)i * inc_y);
        if (((this_x >= 0) && (this_x < hexagon_size)) && ((this_y >= 0) && (this_y < hexagon_size))) {
                scaled_hexagon[(hexagon_size * (int)this_y) + (int)this_x] = '1';
        }
    }
}

void plot_hexagon(char *scaled_hexagon, int hexagon_size) {
    /* Create a hexagon shape and fill it */
    int line, i;

    float x_offset[6];
    float y_offset[6];
    float start_x, start_y;
    float end_x, end_y;







|
















|







409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440

    for (i = 0; i < string_length; i++) {
        draw_letter(pixbuf, input_string[i], string_left_hand + (i * letter_width), yposn, textflags, image_width, image_height);
    }

}

static void plot_hexline(char *scaled_hexagon, int hexagon_size, float start_x, float start_y, float end_x, float end_y) {
    /* Draw a straight line from start to end */
    int i;
    float inc_x, inc_y;

    inc_x = (end_x - start_x) / hexagon_size;
    inc_y = (end_y - start_y) / hexagon_size;

    for (i = 0; i < hexagon_size; i++) {
        float this_x = start_x + ((float)i * inc_x);
        float this_y = start_y + ((float)i * inc_y);
        if (((this_x >= 0) && (this_x < hexagon_size)) && ((this_y >= 0) && (this_y < hexagon_size))) {
                scaled_hexagon[(hexagon_size * (int)this_y) + (int)this_x] = '1';
        }
    }
}

static void plot_hexagon(char *scaled_hexagon, int hexagon_size) {
    /* Create a hexagon shape and fill it */
    int line, i;

    float x_offset[6];
    float y_offset[6];
    float start_x, start_y;
    float end_x, end_y;
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
            if (ink == '1') {
                scaled_hexagon[(hexagon_size * line) + i] = ink;
            }
        }
    }
}

int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, int data_type) {
    /* Plot a MaxiCode symbol with hexagons and bullseye */
    int i, row, column, xposn;
    int image_height, image_width;
    char *pixelbuf;
    int error_number;
    int xoffset, yoffset;
    float scaler = symbol->scale;







|







482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
            if (ink == '1') {
                scaled_hexagon[(hexagon_size * line) + i] = ink;
            }
        }
    }
}

static int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, int data_type) {
    /* Plot a MaxiCode symbol with hexagons and bullseye */
    int i, row, column, xposn;
    int image_height, image_width;
    char *pixelbuf;
    int error_number;
    int xoffset, yoffset;
    float scaler = symbol->scale;
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
    error_number = save_raster_image_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type);
    free(scaled_hexagon);
    free(pixelbuf);
    return error_number;
}

/* Convert UTF-8 to Latin1 Codepage for the interpretation line */
void to_latin1(unsigned char source[], unsigned char preprocessed[]) {
    int j, i, input_length;

    input_length = ustrlen(source);

    j = 0;
    i = 0;
    while (i < input_length) {







|







562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
    error_number = save_raster_image_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type);
    free(scaled_hexagon);
    free(pixelbuf);
    return error_number;
}

/* Convert UTF-8 to Latin1 Codepage for the interpretation line */
static void to_latin1(unsigned char source[], unsigned char preprocessed[]) {
    int j, i, input_length;

    input_length = ustrlen(source);

    j = 0;
    i = 0;
    while (i < input_length) {
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
        i++;
    }
    preprocessed[j] = '\0';

    return;
}

int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int data_type) {
    float scaler = 2 * symbol->scale;
    char *scaled_pixelbuf;
    int r, i;
    int scale_width, scale_height;
    int error_number = 0;
    int xoffset, yoffset, image_width, image_height;








|







600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
        i++;
    }
    preprocessed[j] = '\0';

    return;
}

static int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int data_type) {
    float scaler = 2 * symbol->scale;
    char *scaled_pixelbuf;
    int r, i;
    int scale_width, scale_height;
    int error_number = 0;
    int xoffset, yoffset, image_width, image_height;

649
650
651
652
653
654
655
656
657
658
659
660
661
662
663

    error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle, data_type);
    free(scaled_pixelbuf);

    return error_number;
}

int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int data_type) {
    int textdone, main_width, comp_offset, large_bar_count;
    char textpart[10], addon[6];
    float addon_text_posn, preset_height, large_bar_height;
    int i, r, textoffset, yoffset, xoffset, latch, image_width, image_height;
    char *pixelbuf;
    int addon_latch = 0, textflags = 0;
    int block_width, textpos;







|







650
651
652
653
654
655
656
657
658
659
660
661
662
663
664

    error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle, data_type);
    free(scaled_pixelbuf);

    return error_number;
}

static int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int data_type) {
    int textdone, main_width, comp_offset, large_bar_count;
    char textpart[10], addon[6];
    float addon_text_posn, preset_height, large_bar_height;
    int i, r, textoffset, yoffset, xoffset, latch, image_width, image_height;
    char *pixelbuf;
    int addon_latch = 0, textflags = 0;
    int block_width, textpos;
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
#endif

    if (symbol->show_hrt != 0) {
        /* Copy text from symbol */
        to_latin1(symbol->text, local_text);
    } else {
        /* No text needed */
        switch (symbol->symbology) {
            case BARCODE_EANX:
            case BARCODE_EANX_CC:
            case BARCODE_ISBNX:
            case BARCODE_UPCA:
            case BARCODE_UPCE:
            case BARCODE_UPCA_CC:
            case BARCODE_UPCE_CC:
                /* For these symbols use dummy text to ensure formatting is done
                 * properly even if no text is required */
                for (i = 0; i < ustrlen(symbol->text); i++) {
                    if (symbol->text[i] == '+') {
                        local_text[i] = '+';
                    } else {
                        local_text[i] = ' ';
                    }
                    local_text[ustrlen(symbol->text)] = '\0';
                }
                break;
            default:
                /* For everything else, just remove the text */
                local_text[0] = '\0';
                break;
        }
    }

    textdone = 0;
    main_width = symbol->width;
    strcpy(addon, "");
    comp_offset = 0;







|
<
<
<
<
<
<
<
|
|
|
|
|
|
|
|
|
|
|
<
|
|
<







677
678
679
680
681
682
683
684







685
686
687
688
689
690
691
692
693
694
695

696
697

698
699
700
701
702
703
704
#endif

    if (symbol->show_hrt != 0) {
        /* Copy text from symbol */
        to_latin1(symbol->text, local_text);
    } else {
        /* No text needed */
        if (is_extendable(symbol->symbology)) {







            /* For these symbols use dummy text to ensure formatting is done
             * properly even if no text is required */
            for (i = 0; i < ustrlen(symbol->text); i++) {
                if (symbol->text[i] == '+') {
                    local_text[i] = '+';
                } else {
                    local_text[i] = ' ';
                }
                local_text[ustrlen(symbol->text)] = '\0';
            }
        } else {

            /* For everything else, just remove the text */
            local_text[0] = '\0';

        }
    }

    textdone = 0;
    main_width = symbol->width;
    strcpy(addon, "");
    comp_offset = 0;
734
735
736
737
738
739
740

741
742

743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768

769
770
771
772
773

774
775
776
777
778
779
780
    if (large_bar_count == 0) {
        symbol->height = preset_height;
        large_bar_height = 10;
    } else {
        large_bar_height = (symbol->height - preset_height) / large_bar_count;
    }


    while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {
        comp_offset++;

    }

    /* Certain symbols need whitespace otherwise characters get chopped off the sides */
    if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC))
            || (symbol->symbology == BARCODE_ISBNX)) {
        switch (ustrlen(local_text)) {
            case 13: /* EAN 13 */
            case 16:
            case 19:
                if (symbol->whitespace_width == 0) {
                    symbol->whitespace_width = 10;
                }
                main_width = 96 + comp_offset;
                break;
            default:
                main_width = 68 + comp_offset;
        }
    }

    if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
        if (symbol->whitespace_width == 0) {
            symbol->whitespace_width = 10;
            main_width = 96 + comp_offset;
        }
    }


    if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
        if (symbol->whitespace_width == 0) {
            symbol->whitespace_width = 10;
            main_width = 51 + comp_offset;
        }

    }

    latch = 0;
    r = 0;
    /* Isolate add-on text */
    if (is_extendable(symbol->symbology)) {
        for (i = 0; i < ustrlen(local_text); i++) {







>
|
|
>



|
|












<
|
|


<

<
|
>
|


<

>







726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753

754
755
756
757

758

759
760
761
762
763

764
765
766
767
768
769
770
771
772
    if (large_bar_count == 0) {
        symbol->height = preset_height;
        large_bar_height = 10;
    } else {
        large_bar_height = (symbol->height - preset_height) / large_bar_count;
    }

    if (is_composite(symbol->symbology)) {
        while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) {
            comp_offset++;
        }
    }

    /* Certain symbols need whitespace otherwise characters get chopped off the sides */
    if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CHK)
            || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) {
        switch (ustrlen(local_text)) {
            case 13: /* EAN 13 */
            case 16:
            case 19:
                if (symbol->whitespace_width == 0) {
                    symbol->whitespace_width = 10;
                }
                main_width = 96 + comp_offset;
                break;
            default:
                main_width = 68 + comp_offset;
        }

    } else if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CHK)
            || (symbol->symbology == BARCODE_UPCA_CC)) {
        if (symbol->whitespace_width == 0) {
            symbol->whitespace_width = 10;

        }

        main_width = 96 + comp_offset;
    } else if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CHK)
            || (symbol->symbology == BARCODE_UPCE_CC)) {
        if (symbol->whitespace_width == 0) {
            symbol->whitespace_width = 10;

        }
        main_width = 51 + comp_offset;
    }

    latch = 0;
    r = 0;
    /* Isolate add-on text */
    if (is_extendable(symbol->symbology)) {
        for (i = 0; i < ustrlen(local_text); i++) {
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
            latch = 0;
        }

        do {
            block_width = 0;
            do {
                block_width++;
            } while ((i + block_width < symbol->width )&& module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
            if ((addon_latch == 0) && (r == 0) && (i > main_width)) {
                plot_height = (int) (row_height - 5.0);
                plot_yposn = (int) (row_posn - 5.0);
                addon_text_posn = row_posn + row_height - 8.0;
                addon_latch = 1;
            }
            if (latch == 1) {







|







833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
            latch = 0;
        }

        do {
            block_width = 0;
            do {
                block_width++;
            } while ((i + block_width < symbol->width) && module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
            if ((addon_latch == 0) && (r == 0) && (i > main_width)) {
                plot_height = (int) (row_height - 5.0);
                plot_yposn = (int) (row_posn - 5.0);
                addon_text_posn = row_posn + row_height - 8.0;
                addon_latch = 1;
            }
            if (latch == 1) {
863
864
865
866
867
868
869

870
871
872
873
874
875
876
877
            i += block_width;

        } while (i < symbol->width);
    }

    xoffset += comp_offset;


    if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || (symbol->symbology == BARCODE_ISBNX)) {
        /* guard bar extensions and text formatting for EAN8 and EAN13 */
        switch (ustrlen(local_text)) {
            case 8: /* EAN-8 */
            case 11:
            case 14:
                draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
                draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);







>
|







855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
            i += block_width;

        } while (i < symbol->width);
    }

    xoffset += comp_offset;

    if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CHK)
            || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) {
        /* guard bar extensions and text formatting for EAN8 and EAN13 */
        switch (ustrlen(local_text)) {
            case 8: /* EAN-8 */
            case 11:
            case 14:
                draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
                draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
                        textpos = 2 * (xoffset + 128);
                        draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
                        break;
                }
                break;

        }
    }

    if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
        /* guard bar extensions and text formatting for UPCA */
        latch = 1;

        i = 0 + comp_offset;
        do {
            block_width = 0;
            do {
                block_width++;
            } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
            if (latch == 1) {
                /* a bar */
                draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
                latch = 0;
            } else {
                /* a space */
                latch = 1;
            }
            i += block_width;
        } while (i < 11 + comp_offset);
        draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        latch = 1;
        i = 85 + comp_offset;
        do {
            block_width = 0;
            do {
                block_width++;
            } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
            if (latch == 1) {
                /* a bar */
                draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
                latch = 0;
            } else {
                /* a space */
                latch = 1;







|
|
|








|


















|







934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
                        textpos = 2 * (xoffset + 128);
                        draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
                        break;
                }
                break;

        }

    } else if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CHK)
            || (symbol->symbology == BARCODE_UPCA_CC)) {
        /* guard bar extensions and text formatting for UPCA */
        latch = 1;

        i = 0 + comp_offset;
        do {
            block_width = 0;
            do {
                block_width++;
            } while ((i + block_width < symbol->width) && module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
            if (latch == 1) {
                /* a bar */
                draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
                latch = 0;
            } else {
                /* a space */
                latch = 1;
            }
            i += block_width;
        } while (i < 11 + comp_offset);
        draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        latch = 1;
        i = 85 + comp_offset;
        do {
            block_width = 0;
            do {
                block_width++;
            } while ((i + block_width < symbol->width) && module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i));
            if (latch == 1) {
                /* a bar */
                draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
                latch = 0;
            } else {
                /* a space */
                latch = 1;
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
                break;
            case 5:
                textpos = 2 * (xoffset + 130);
                draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
                break;
        }

    }

    if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
        /* guard bar extensions and text formatting for UPCE */
        draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (50 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);








<
|
|







1007
1008
1009
1010
1011
1012
1013

1014
1015
1016
1017
1018
1019
1020
1021
1022
                break;
            case 5:
                textpos = 2 * (xoffset + 130);
                draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height);
                break;
        }


    } else if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CHK)
            || (symbol->symbology == BARCODE_UPCE_CC)) {
        /* guard bar extensions and text formatting for UPCE */
        draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);
        draw_bar(pixelbuf, (50 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height);

1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151

    error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle, data_type);
    free(scaled_pixelbuf);
    free(pixelbuf);
    return error_number;
}

int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_type) {
    int error;

#ifdef NO_PNG
    if (file_type == OUT_PNG_FILE) {
        return ZINT_ERROR_INVALID_OPTION;
    }
#endif /* NO_PNG */

    if (symbol->output_options & BARCODE_DOTTY_MODE) {
        error = plot_raster_dotty(symbol, rotate_angle, file_type);
    } else {
        if (symbol->symbology == BARCODE_MAXICODE) {
            error = plot_raster_maxicode(symbol, rotate_angle, file_type);
        } else {
            error = plot_raster_default(symbol, rotate_angle, file_type);
        }
    }

    return error;
}









|




















<
<
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141



    error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle, data_type);
    free(scaled_pixelbuf);
    free(pixelbuf);
    return error_number;
}

INTERNAL int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_type) {
    int error;

#ifdef NO_PNG
    if (file_type == OUT_PNG_FILE) {
        return ZINT_ERROR_INVALID_OPTION;
    }
#endif /* NO_PNG */

    if (symbol->output_options & BARCODE_DOTTY_MODE) {
        error = plot_raster_dotty(symbol, rotate_angle, file_type);
    } else {
        if (symbol->symbology == BARCODE_MAXICODE) {
            error = plot_raster_maxicode(symbol, rotate_angle, file_type);
        } else {
            error = plot_raster_default(symbol, rotate_angle, file_type);
        }
    }

    return error;
}


Changes to jni/zint/backend/reedsol.c.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76





77
78
79
80
81
82
83
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


// It is not written with high efficiency in mind, so is probably
// not suitable for real-time encoding.  The aim was to keep it
// simple, general and clear.
//
// <Some notes on the theory and implementation need to be added here>

// Usage:
// First call rs_init_gf(poly) to set up the Galois Field parameters.
// Then  call rs_init_code(size, index) to set the encoding size
// Then  call rs_encode(datasize, data, out) to encode the data.
//
// These can be called repeatedly as required - but note that
// rs_init_code must be called following any rs_init_gf call.
//
// If the parameters are fixed, some of the statics below can be
// replaced with constants in the obvious way, and additionally
// malloc/free can be avoided by using static arrays of a suitable
// size.


#include <stdio.h>		// only needed for debug (main)

#include <stdlib.h>		// only needed for malloc/free
#include "reedsol.h"
static int logmod; // 2**symsize - 1
static int rlen;

static int *logt = NULL, *alog = NULL, *rspoly = NULL;

// rs_init_gf(poly) initialises the parameters for the Galois Field.
// The symbol size is determined from the highest bit set in poly
// This implementation will support sizes up to 30 bits (though that
// will result in very large log/antilog tables) - bit sizes of
// 8 or 4 are typical
//
// The poly is the bit pattern representing the GF characteristic
// polynomial.  e.g. for ECC200 (8-bit symbols) the polynomial is
// a**8 + a**5 + a**3 + a**2 + 1, which translates to 0x12d.

void rs_init_gf(const int poly) {
    int m, b, p, v;

    // Find the top bit, and hence the symbol size
    for (b = 1, m = 0; b <= poly; b <<= 1)
        m++;
    b >>= 1;
    m--;






    // Calculate the log/alog tables
    logmod = (1 << m) - 1;
    logt = (int *) malloc(sizeof (int) * (logmod + 1));
    alog = (int *) malloc(sizeof (int) * logmod);

    for (p = 1, v = 0; v < logmod; v++) {







>




















>
|
>
|
















|







>
>
>
>
>







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

// It is not written with high efficiency in mind, so is probably
// not suitable for real-time encoding.  The aim was to keep it
// simple, general and clear.
//
// <Some notes on the theory and implementation need to be added here>

// Usage:
// First call rs_init_gf(poly) to set up the Galois Field parameters.
// Then  call rs_init_code(size, index) to set the encoding size
// Then  call rs_encode(datasize, data, out) to encode the data.
//
// These can be called repeatedly as required - but note that
// rs_init_code must be called following any rs_init_gf call.
//
// If the parameters are fixed, some of the statics below can be
// replaced with constants in the obvious way, and additionally
// malloc/free can be avoided by using static arrays of a suitable
// size.

#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "reedsol.h"
static int logmod; // 2**symsize - 1
static int rlen;

static int *logt = NULL, *alog = NULL, *rspoly = NULL;

// rs_init_gf(poly) initialises the parameters for the Galois Field.
// The symbol size is determined from the highest bit set in poly
// This implementation will support sizes up to 30 bits (though that
// will result in very large log/antilog tables) - bit sizes of
// 8 or 4 are typical
//
// The poly is the bit pattern representing the GF characteristic
// polynomial.  e.g. for ECC200 (8-bit symbols) the polynomial is
// a**8 + a**5 + a**3 + a**2 + 1, which translates to 0x12d.

INTERNAL void rs_init_gf(const int poly) {
    int m, b, p, v;

    // Find the top bit, and hence the symbol size
    for (b = 1, m = 0; b <= poly; b <<= 1)
        m++;
    b >>= 1;
    m--;

    // Ensure m not negative to supress gcc -Walloc-size-larger-than
    if (m < 0) {
        m = 0;
    }

    // Calculate the log/alog tables
    logmod = (1 << m) - 1;
    logt = (int *) malloc(sizeof (int) * (logmod + 1));
    alog = (int *) malloc(sizeof (int) * logmod);

    for (p = 1, v = 0; v < logmod; v++) {
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// rs_init_code(nsym, index) initialises the Reed-Solomon encoder
// nsym is the number of symbols to be generated (to be appended
// to the input data).  index is usually 1 - it is the index of
// the constant in the first term (i) of the RS generator polynomial:
// (x + 2**i)*(x + 2**(i+1))*...   [nsym terms]
// For ECC200, index is 1.

void rs_init_code(const int nsym, int index) {
    int i, k;

    rspoly = (int *) malloc(sizeof (int) * (nsym + 1));

    rlen = nsym;

    rspoly[0] = 1;
    for (i = 1; i <= nsym; i++) {
        rspoly[i] = 1;
        for (k = i - 1; k > 0; k--) {
            if (rspoly[k])
                rspoly[k] = alog[(logt[rspoly[k]] + index) % logmod];
            rspoly[k] ^= rspoly[k - 1];
        }
        rspoly[0] = alog[(logt[rspoly[0]] + index) % logmod];
        index++;
    }
}

void rs_encode(const size_t len,const unsigned char *data, unsigned char *res) {
    int i, k;
    for (i = 0; i < rlen; i++)
        res[i] = 0;
    for (i = 0; i < len; i++) {
        int m = res[rlen - 1] ^ data[i];
        for (k = rlen - 1; k > 0; k--) {
            if (m && rspoly[k])
                res[k] = (unsigned char) (res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod]);
            else
                res[k] = res[k - 1];
        }
        if (m && rspoly[0])
            res[0] = (unsigned char) (alog[(logt[m] + logt[rspoly[0]]) % logmod]);
        else
            res[0] = 0;
    }
}

/* The same as above but for larger bitlengths - Aztec code compatible */
void rs_encode_long(const int len, const unsigned int *data, unsigned int *res) {
    int i, k;
    for (i = 0; i < rlen; i++)
        res[i] = 0;
    for (i = 0; i < len; i++) {
        int m = res[rlen - 1] ^ data[i];
        for (k = rlen - 1; k > 0; k--) {
            if (m && rspoly[k])
                res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod];
            else
                res[k] = res[k - 1];
        }
        if (m && rspoly[0])
            res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod];
        else
            res[0] = 0;
    }
}

/* Free memory */
void rs_free(void) {
    free(logt);
    free(alog);
    free(rspoly);
    rspoly = NULL;
}








|



















|



















|



















|





<
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172

// rs_init_code(nsym, index) initialises the Reed-Solomon encoder
// nsym is the number of symbols to be generated (to be appended
// to the input data).  index is usually 1 - it is the index of
// the constant in the first term (i) of the RS generator polynomial:
// (x + 2**i)*(x + 2**(i+1))*...   [nsym terms]
// For ECC200, index is 1.

INTERNAL void rs_init_code(const int nsym, int index) {
    int i, k;

    rspoly = (int *) malloc(sizeof (int) * (nsym + 1));

    rlen = nsym;

    rspoly[0] = 1;
    for (i = 1; i <= nsym; i++) {
        rspoly[i] = 1;
        for (k = i - 1; k > 0; k--) {
            if (rspoly[k])
                rspoly[k] = alog[(logt[rspoly[k]] + index) % logmod];
            rspoly[k] ^= rspoly[k - 1];
        }
        rspoly[0] = alog[(logt[rspoly[0]] + index) % logmod];
        index++;
    }
}

INTERNAL void rs_encode(const size_t len,const unsigned char *data, unsigned char *res) {
    int i, k;
    for (i = 0; i < rlen; i++)
        res[i] = 0;
    for (i = 0; i < len; i++) {
        int m = res[rlen - 1] ^ data[i];
        for (k = rlen - 1; k > 0; k--) {
            if (m && rspoly[k])
                res[k] = (unsigned char) (res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod]);
            else
                res[k] = res[k - 1];
        }
        if (m && rspoly[0])
            res[0] = (unsigned char) (alog[(logt[m] + logt[rspoly[0]]) % logmod]);
        else
            res[0] = 0;
    }
}

/* The same as above but for larger bitlengths - Aztec code compatible */
INTERNAL void rs_encode_long(const int len, const unsigned int *data, unsigned int *res) {
    int i, k;
    for (i = 0; i < rlen; i++)
        res[i] = 0;
    for (i = 0; i < len; i++) {
        int m = res[rlen - 1] ^ data[i];
        for (k = rlen - 1; k > 0; k--) {
            if (m && rspoly[k])
                res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod];
            else
                res[k] = res[k - 1];
        }
        if (m && rspoly[0])
            res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod];
        else
            res[0] = 0;
    }
}

/* Free memory */
INTERNAL void rs_free(void) {
    free(logt);
    free(alog);
    free(rspoly);
    rspoly = NULL;
}

Changes to jni/zint/backend/reedsol.h.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

 */


#ifndef __REEDSOL_H
#define __REEDSOL_H

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

extern void rs_init_gf(const int poly);
extern void rs_init_code(const int nsym,int index);
extern void rs_encode(const size_t len,const unsigned char *data, unsigned char *res);
extern void rs_encode_long(const int len,const unsigned int *data, unsigned int *res);
    extern void rs_free(void);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif				/* __REEDSOL_H */








>








|
|
|
|
|






<
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.

 */
/* vim: set ts=4 sw=4 et : */

#ifndef __REEDSOL_H
#define __REEDSOL_H

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

INTERNAL void rs_init_gf(const int poly);
INTERNAL void rs_init_code(const int nsym,int index);
INTERNAL void rs_encode(const size_t len,const unsigned char *data, unsigned char *res);
INTERNAL void rs_encode_long(const int len,const unsigned int *data, unsigned int *res);
INTERNAL void rs_free(void);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif				/* __REEDSOL_H */

Deleted jni/zint/backend/render.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
/*
 * render.c - Generic Rendered Format
 *
 * Initiall written by Sam Lown for use in gLabels. Converts encoded
 * data into a generic internal structure of lines and characters
 * usable in external applications.
 */

/*
    libzint - the open source barcode library
    Copyright (C) 2009-2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"

#define   GL_CONST  2.8346

struct zint_render_line *render_plot_create_line(float x, float y, float width, float length);
int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line);
struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width);
int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring);
struct zint_render_hexagon *render_plot_create_hexagon(float x, float y, float height);
int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *hexagon, struct zint_render_hexagon **last_hexagon);

int render_plot_add_string(struct zint_symbol *symbol, unsigned char *text, float x, float y, float fsize, float width, struct zint_render_string **last_string);
void render_free(struct zint_symbol *symbol);

int render_plot(struct zint_symbol *symbol, float width, float height) {
    struct zint_render *render;
    struct zint_render_line *line, *last_line = NULL;
    struct zint_render_string *last_string = NULL;
    struct zint_render_ring *last_ring = NULL;
    struct zint_render_hexagon *last_hexagon = NULL;

    int i, r, latch;
    float textpos, large_bar_height, preset_height, row_height, row_posn = 0.0;
    // int error_number = 0;
    int text_offset, text_height, xoffset, yoffset, textdone, main_symbol_width_x, addon_width_x;
    char addon[6];
    int large_bar_count, symbol_lead_in, total_symbol_width_x, total_area_width_x;
    float addon_text_posn;
    float default_text_posn;
    float scaler;
    const char *locale = NULL;
    int hide_text = 0;
    float symbol_aspect = 1;
    float x_dimension;
    int upceanflag = 0;

    // Free any previous rendering structures
    render_free(symbol);
    // Allocate memory for the rendered version
    render = symbol->rendered = (struct zint_render *) malloc(sizeof (struct zint_render));
    if (!symbol->rendered) return ZINT_ERROR_MEMORY;
    render->lines = NULL;
    render->strings = NULL;
    render->rings = NULL;
    render->hexagons = NULL;

    locale = setlocale(LC_ALL, "C");

    row_height = 0;
    textdone = 0;
    textpos = 0.0;
    main_symbol_width_x = symbol->width;
    strcpy(addon, "");
    symbol_lead_in = 0;
    addon_text_posn = 0.0;
    addon_width_x = 0;

    /*
     * Determine if there will be any addon texts and text height
     */
    latch = 0;
    r = 0;
    /* Isolate add-on text */
    if (is_extendable(symbol->symbology)) {
        for(i = 0; i < (int)ustrlen(symbol->text); i++) {
            if (latch == 1) {
                addon[r] = symbol->text[i];
                r++;
            }
            if (symbol->text[i] == '+') {
                latch = 1;
            }
        }
    }
    addon[r] = '\0';


    /*
     * Calculate the width of the barcode, especially if there are any extra
     * borders or white space to add.
     */

    while (!(module_is_set(symbol, symbol->rows - 1, symbol_lead_in))) {
        symbol_lead_in++;
    }

    /* Certain symbols need whitespace otherwise characters get chopped off the sides */
    if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC))
            || (symbol->symbology == BARCODE_ISBNX)) {
        switch (ustrlen(symbol->text)) {
            case 13: /* EAN 13 */
            case 16:
            case 19:
                if (symbol->whitespace_width == 0) {
                    symbol->whitespace_width = 10;
                }
                main_symbol_width_x = 96 + symbol_lead_in;
                upceanflag = 13;
                break;
            case 2:
                main_symbol_width_x = 22 + symbol_lead_in;
                upceanflag = 2;
                break;
            case 5:
                main_symbol_width_x = 49 + symbol_lead_in;
                upceanflag = 5;
                break;
            default:
                main_symbol_width_x = 68 + symbol_lead_in;
                upceanflag = 8;
        }
        switch (ustrlen(symbol->text)) {
            case 11:
            case 16:
                /* EAN-2 add-on */
                addon_width_x = 31;
                break;
            case 14:
            case 19:
                /* EAN-5 add-on */
                addon_width_x = 58;
                break;
        }
    }
    else if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) {
        upceanflag = 12;
        if (symbol->whitespace_width < 10) {
            symbol->whitespace_width = 10;
            main_symbol_width_x = 96 + symbol_lead_in;
        }
        switch (ustrlen(symbol->text)) {
            case 15:
                /* EAN-2 add-on */
                addon_width_x = 31;
                break;
            case 18:
                /* EAN-5 add-on */
                addon_width_x = 58;
                break;
        }
    }
    else if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) {
        upceanflag = 6;
        if (symbol->whitespace_width == 0) {
            symbol->whitespace_width = 10;
            main_symbol_width_x = 51 + symbol_lead_in;
        }
        switch (ustrlen(symbol->text)) {
            case 11:
                /* EAN-2 add-on */
                addon_width_x = 31;
                break;
            case 14:
                /* EAN-5 add-on */
                addon_width_x = 58;
                break;
        }
    }

    if ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)) {
        hide_text = 1;
        text_height = text_offset = 0.0;
    }
    else {
        text_height = upceanflag ? 11.0 : 9.0;
        text_offset = 2.0;
    }
    if (symbol->output_options & SMALL_TEXT)
        text_height *= 0.8;

    total_symbol_width_x = 0.0 + main_symbol_width_x + addon_width_x;
    total_area_width_x = total_symbol_width_x + (2 * (symbol->border_width + symbol->whitespace_width));

    xoffset = symbol->border_width + symbol->whitespace_width;
    yoffset = symbol->border_width;


    // Determine if height should be overridden
    large_bar_count = 0;
    preset_height = 0.0;
    for (i = 0; i < symbol->rows; i++) {
        preset_height += symbol->row_height[i];
        if (symbol->row_height[i] == 0) {
            large_bar_count++;
        }
    }


    /* Set minimum size of symbol */
    /* Barcode must be at least 2mm high by 2mm across */
    if (width < (2.0 * GL_CONST)) {
        width = (2.0 * GL_CONST);
    }
    x_dimension = width / total_area_width_x / GL_CONST;
    if (height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST) {
        height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST;
    }

    if (symbol->symbology == BARCODE_CODABAR) {
        /* The minimum X-dimension of Codabar is 0.191mm. The minimum bar height is 5mm */
        if (x_dimension < 0.191) {
            x_dimension = 0.191;
            width = 0.191 * GL_CONST * total_area_width_x;
        }
        if (height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST) {
            height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST;
        }
    }
    else if (symbol->symbology == BARCODE_CODE49) {
        /* The minimum X-dimension of Code 49 is 0.191mm */
        if (x_dimension < 0.191) {
            float encoded_symbol_aspect;
            x_dimension = 0.191;
            width = 0.191 * GL_CONST * total_area_width_x;
            encoded_symbol_aspect = total_area_width_x;
            encoded_symbol_aspect /= (preset_height + (2 * yoffset) + text_offset + text_height);
            height = width / encoded_symbol_aspect;
        }
    }

    if (upceanflag != 0) {
        /* The X-dimension of UPC/EAN symbols is fixed at 0.330mm */
        /* The phrase before is questionable. It may scale in certain percentages (80% - 200%).
           see https://internationalbarcodes.com/ean-13-specifications/ */
        // Can now cope with sizes between 80% and 200%, enforces correct aspect ratio
        /* NOTE: This code will need adjustment before it correctly deals with composite symbols */
        //x_dimension = 0.330;
        if (x_dimension < 0.26) {
            x_dimension = 0.26;
        }
        if (x_dimension > 0.66) {
            x_dimension = 0.66;
        }
        width = x_dimension * GL_CONST * total_area_width_x;

        switch (upceanflag) {
            case 6:
            case 12:
            case 13:
                /* UPC-A, UPC-E and EAN-13 */
                /* Height of bars should be 22.85mm */
                height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + (22.85 * (x_dimension / 0.33))) * GL_CONST;
                break;
            case 8:
                /* EAN-8 */
                /* Height of bars should be 18.23mm */
                height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + (18.23 * (x_dimension / 0.33))) * GL_CONST;
                break;
            default:
                /* EAN-2 and EAN-5 */
                /* Height of bars should be 21.10mm */
                height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + (21.10 * (x_dimension / 0.33))) * GL_CONST;
        }
    }

    if (symbol->symbology == BARCODE_ONECODE) {
        /* The size of USPS Intelligent Mail barcode is fixed */
        x_dimension = 0.508;
        width = 0.508 * GL_CONST * total_area_width_x;
        height = 4.064 * GL_CONST;
    }
    else if ((symbol->symbology == BARCODE_POSTNET) || (symbol->symbology == BARCODE_PLANET)) {
        /* The size of PostNet and PLANET are fized */
        x_dimension = 0.508;
        width = 0.508 * GL_CONST * total_area_width_x;
        height = 2.921 * GL_CONST;
    }
    else if (((symbol->symbology == BARCODE_AUSPOST) || (symbol->symbology == BARCODE_AUSREPLY)) ||
            ((symbol->symbology == BARCODE_AUSROUTE) || (symbol->symbology == BARCODE_AUSREDIRECT))) {
        /* Australia Post use the same sizes as USPS */
        x_dimension = 0.508;
        width = 0.508 * GL_CONST * total_area_width_x;
        height = 4.064 * GL_CONST;
    }
    else if ((symbol->symbology == BARCODE_RM4SCC) || (symbol->symbology == BARCODE_KIX)) {
        /* Royal Mail and KIX Code uses 22 bars per inch */
        x_dimension = 0.577;
        width = 0.577 * GL_CONST * total_area_width_x;
        height = 5.22 * GL_CONST;
    }


    if (large_bar_count == 0) {
        float required_aspect = width / height;
        symbol_aspect = (total_symbol_width_x + (2 * xoffset)) / (preset_height + (2 * yoffset) + text_offset + text_height);
        symbol->height = (int) preset_height;
        if (required_aspect > symbol_aspect) {
            /* the area is too wide */
            scaler = height / (preset_height + (2 * yoffset) + text_offset + text_height);
            render->width = symbol_aspect * height;
            render->height = height;
        } else {
            /* the area is too high */
            scaler = width / (total_symbol_width_x + (2 * xoffset));
            render->width = width;
            render->height = width / symbol_aspect;
        }
    } else {
        scaler = width / (total_symbol_width_x + (2 * xoffset));
        symbol->height = (int) ((height / scaler) - ((2 * yoffset) + text_offset + text_height));

        render->width = width;
        render->height = height;
    }
    large_bar_height = (symbol->height - preset_height) / large_bar_count;

    if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) {
        default_text_posn = (symbol->height + text_offset + symbol->border_width + symbol->border_width) * scaler;
    } else {
        default_text_posn = (symbol->height + text_offset + symbol->border_width) * scaler;
    }


    if (symbol->symbology == BARCODE_MAXICODE) {
        struct zint_render_ring *ring;
        /* Maxicode is a fixed size */
        scaler = GL_CONST; /* Converts from millimeters to the scale used by glabels */
        render->width = 28.16 * scaler;
        render->height = 26.86 * scaler;

        /* Central bullseye pattern */
        ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 0.85 * scaler, 0.67 * scaler);
        render_plot_add_ring(symbol, ring, &last_ring);
        ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 2.20 * scaler, 0.67 * scaler);
        render_plot_add_ring(symbol, ring, &last_ring);
        ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 3.54 * scaler, 0.67 * scaler);
        render_plot_add_ring(symbol, ring, &last_ring);

        /* Hexagons */
        for (r = 0; r < symbol->rows; r++) {
            for (i = 0; i < symbol->width; i++) {
                if (module_is_set(symbol, r, i)) {
                    struct zint_render_hexagon *hexagon = render_plot_create_hexagon(((i * 0.88) + ((r & 1) ? 1.76 : 1.32)) * scaler, ((r * 0.76) + 0.76) * scaler, 1. * scaler);
                    render_plot_add_hexagon(symbol, hexagon, &last_hexagon);
                }
            }
        }

    } else {
        /* everything else uses rectangles (or squares) */
        /* Works from the bottom of the symbol up */
        int addon_latch = 0;

        for (r = 0; r < symbol->rows; r++) {
            int this_row = r;
            if (symbol->row_height[this_row] == 0) {
                row_height = large_bar_height;
            } else {
                row_height = symbol->row_height[this_row];
            }
            row_posn = 0;
            for (i = 0; i < r; i++) {
                if (symbol->row_height[i] == 0) {
                    row_posn += large_bar_height;
                } else {
                    row_posn += symbol->row_height[i];
                }
            }
            row_posn += yoffset;

            i = 0;
            if (module_is_set(symbol, this_row, 0)) {
                latch = 1;
            } else {
                latch = 0;
            }

            do {
                int block_width = 0;
                do {
                    block_width++;
                } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
                if ((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_symbol_width_x)) {
                    addon_text_posn = row_posn * scaler;
                    addon_latch = 1;
                }
                if (latch == 1) {
                    /* a bar */
                    if (addon_latch == 0) {
                        line = render_plot_create_line((i + xoffset) * scaler, (row_posn) * scaler, block_width * scaler, row_height * scaler);
                    } else {
                        line = render_plot_create_line((i + xoffset) * scaler, (row_posn + 10.0) * scaler, block_width * scaler, (row_height - 5.0) * scaler);
                    }
                    latch = 0;

                    render_plot_add_line(symbol, line, &last_line);
                } else {
                    /* a space */
                    latch = 1;
                }
                i += block_width;

            } while (i < symbol->width);
        }
    }
    /* That's done the actual data area, everything else is human-friendly */


    /* Add the text */
    xoffset -= symbol_lead_in;
    row_posn = (row_posn + large_bar_height) * scaler;

    if (!hide_text) {
        char textpart[10];
        float textwidth;
        if (upceanflag == 8) {
            /* guard bar extensions and text formatting for EAN-8 */
            i = 0;
            for (line = symbol->rendered->lines; line != NULL; line = line->next) {
                switch (i) {
                    case 0:
                    case 1:
                    case 10:
                    case 11:
                    case 20:
                    case 21:
                        line->length += (5.0 * scaler);
                        break;
                }
                i++;
            }

            for (i = 0; i < 4; i++) {
                textpart[i] = symbol->text[i];
            }
            textpart[4] = '\0';
            textpos = 17;
            textwidth = 4.0 * 8.5;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, text_height * scaler, textwidth * scaler, &last_string);
            for (i = 0; i < 4; i++) {
                textpart[i] = symbol->text[i + 4];
            }
            textpart[4] = '\0';
            textpos = 50;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, text_height * scaler, textwidth * scaler, &last_string);
            textdone = 1;
            switch (strlen(addon)) {
                case 2:
                    textpos = xoffset + 86;
                    textwidth = 2.0 * 8.5;
                    render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, text_height * scaler, textwidth * scaler, &last_string);
                    break;
                case 5:
                    textpos = xoffset + 100;
                    textwidth = 5.0 * 8.5;
                    render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, text_height * scaler, textwidth * scaler, &last_string);
                    break;
            }

        }

        if (upceanflag == 13) {
            /* guard bar extensions and text formatting for EAN-13 */
            i = 0;
            for (line = symbol->rendered->lines; line != NULL; line = line->next) {
                switch (i) {
                    case 0:
                    case 1:
                    case 14:
                    case 15:
                    case 28:
                    case 29:
                        line->length += (5.0 * scaler);
                        break;
                }
                i++;
            }

            textpart[0] = symbol->text[0];
            textpart[1] = '\0';
            textpos = -5; // 7
            textwidth = 8.5;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, text_height * scaler, textwidth * scaler, &last_string);

            for (i = 0; i < 6; i++) {
                textpart[i] = symbol->text[i + 1];
            }
            textpart[6] = '\0';
            textpos = 25;
            textwidth = 6.0 * 8.5;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, text_height * scaler, textwidth * scaler, &last_string);
            for (i = 0; i < 6; i++) {
                textpart[i] = symbol->text[i + 7];
            }
            textpart[6] = '\0';
            textpos = 72;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, text_height * scaler, textwidth * scaler, &last_string);
            textdone = 1;
            switch (strlen(addon)) {
                case 2:
                    textpos = xoffset + 114;
                    textwidth = 2.0 * 8.5;
                    render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, text_height * scaler, textwidth * scaler, &last_string);
                    break;
                case 5:
                    textpos = xoffset + 128;
                    textwidth = 5.0 * 8.5;
                    render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, text_height * scaler, textwidth * scaler, &last_string);
                    break;
            }
        }

        if (upceanflag == 12) {
            /* guard bar extensions and text formatting for UPCA */
            i = 0;
            for (line = symbol->rendered->lines; line != NULL; line = line->next) {
                switch (i) {
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                    case 14:
                    case 15:
                    case 26:
                    case 27:
                    case 28:
                    case 29:
                        line->length += (5.0 * scaler);
                        break;
                }
                i++;
            }

            textpart[0] = symbol->text[0];
            textpart[1] = '\0';
            textpos = -5;
            textwidth = 6.2;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), text_height * (8.0 / 11.0) * scaler, textwidth * scaler, &last_string);
            for (i = 0; i < 5; i++) {
                textpart[i] = symbol->text[i + 1];
            }
            textpart[5] = '\0';
            textpos = 27;
            textwidth = 5.0 * 8.5;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, text_height * scaler, textwidth * scaler, &last_string);
            for (i = 0; i < 5; i++) {
                textpart[i] = symbol->text[i + 6];
            }
            textpos = 68;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, text_height * scaler, textwidth * scaler, &last_string);
            textpart[0] = symbol->text[11];
            textpart[1] = '\0';
            textpos = 100;
            textwidth = 6.2;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), text_height * (8.0 / 11.0) * scaler, textwidth * scaler, &last_string);
            textdone = 1;
            switch (strlen(addon)) {
                case 2:
                    textpos = xoffset + 116;
                    textwidth = 2.0 * 8.5;
                    render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, text_height * scaler, textwidth * scaler, &last_string);
                    break;
                case 5:
                    textpos = xoffset + 130;
                    textwidth = 5.0 * 8.5;
                    render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, text_height * scaler, textwidth * scaler, &last_string);
                    break;
            }
        }

        if (upceanflag == 6) {
            /* guard bar extensions and text formatting for UPCE */
            i = 0;
            for (line = symbol->rendered->lines; line != NULL; line = line->next) {
                switch (i) {
                    case 0:
                    case 1:
                    case 14:
                    case 15:
                    case 16:
                        line->length += (5.0 * scaler);
                        break;
                }
                i++;
            }

            textpart[0] = symbol->text[0];
            textpart[1] = '\0';
            textpos = -5;
            textwidth = 6.2;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), text_height * (8.0 / 11.0) * scaler, textwidth * scaler, &last_string);
            for (i = 0; i < 6; i++) {
                textpart[i] = symbol->text[i + 1];
            }
            textpart[6] = '\0';
            textpos = 24;
            textwidth = 6.0 * 8.5;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, text_height * scaler, textwidth * scaler, &last_string);
            textpart[0] = symbol->text[7];
            textpart[1] = '\0';
            textpos = 55;
            textwidth = 6.2;
            render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), text_height * (8.0 / 11.0) * scaler, textwidth * scaler, &last_string);
            textdone = 1;
            switch (strlen(addon)) {
                case 2:
                    textpos = xoffset + 70;
                    textwidth = 2.0 * 8.5;
                    render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, text_height * scaler, textwidth * scaler, &last_string);
                    break;
                case 5:
                    textpos = xoffset + 84;
                    textwidth = 5.0 * 8.5;
                    render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, text_height * scaler, textwidth * scaler, &last_string);
                    break;
            }
        }

        /* Put normal human readable text at the bottom (and centered) */
        if (textdone == 0) {
            // caculate start xoffset to center text
            render_plot_add_string(symbol, symbol->text, ((symbol->width / 2.0) + xoffset) * scaler, default_text_posn, text_height * scaler, symbol->width * scaler, &last_string);
        }
    }

    switch (symbol->symbology) {
        case BARCODE_MAXICODE:
            /* Do nothing! */
            break;
        default:
            if ((symbol->output_options & BARCODE_BIND) != 0) {
                if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) {
                    /* row binding */
                    for (r = 1; r < symbol->rows; r++) {
                        line = render_plot_create_line(xoffset * scaler, ((r * row_height) + yoffset - 1) * scaler, symbol->width * scaler, 2.0 * scaler);
                        render_plot_add_line(symbol, line, &last_line);
                    }
                }
            }
            if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) {
                line = render_plot_create_line(0, 0, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler);
                render_plot_add_line(symbol, line, &last_line);
                line = render_plot_create_line(0, (symbol->height + symbol->border_width) * scaler, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler);
                render_plot_add_line(symbol, line, &last_line);
            }
            if (symbol->output_options & BARCODE_BOX) {
                /* side bars */
                line = render_plot_create_line(0, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler);
                render_plot_add_line(symbol, line, &last_line);
                line = render_plot_create_line((symbol->width + xoffset + xoffset - symbol->border_width) * scaler, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler);
                render_plot_add_line(symbol, line, &last_line);
            }
            break;
    }

    if (locale)
        setlocale(LC_ALL, locale);

    return 1;
}

/*
 * Create a new line with its memory allocated ready for adding to the
 * rendered structure.
 *
 * This is much quicker than writing out each line manually (in some cases!)
 */
struct zint_render_line *render_plot_create_line(float x, float y, float width, float length) {
    struct zint_render_line *line;

    line = (struct zint_render_line*) malloc(sizeof (struct zint_render_line));
    if (!line) return NULL;

    line->next = NULL;
    line->x = x;
    line->y = y;
    line->width = width;
    line->length = length;

    return line;
}

/*
 * Add the line to the current rendering and update the last line's
 * next value.
 */
int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line) {
    if (!line) return ZINT_ERROR_MEMORY;
    if (*last_line)
        (*last_line)->next = line;
    else
        symbol->rendered->lines = line; // first line

    *last_line = line;
    return 1;
}

struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width) {
    struct zint_render_ring *ring;

    ring = (struct zint_render_ring *) malloc(sizeof (struct zint_render_ring));
    if (!ring) return NULL;
    ring->next = NULL;
    ring->x = x;
    ring->y = y;
    ring->radius = radius;
    ring->line_width = line_width;

    return ring;
}

int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring) {
    if (!ring) return ZINT_ERROR_MEMORY;
    if (*last_ring)
        (*last_ring)->next = ring;
    else
        symbol->rendered->rings = ring; // first ring

    *last_ring = ring;
    return 1;
}

struct zint_render_hexagon *render_plot_create_hexagon(float x, float y, float height) {
    struct zint_render_hexagon *hexagon;

    hexagon = (struct zint_render_hexagon*) malloc(sizeof (struct zint_render_hexagon));
    if (!hexagon) return NULL;
    hexagon->next = NULL;
    hexagon->x = x;
    hexagon->y = y;
    hexagon->height = height;

    return hexagon;
}

int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *hexagon, struct zint_render_hexagon **last_hexagon) {
    if (!hexagon) return ZINT_ERROR_MEMORY;
    if (*last_hexagon)
        (*last_hexagon)->next = hexagon;
    else
        symbol->rendered->hexagons = hexagon; // first hexagon

    *last_hexagon = hexagon;
    return 1;
}

/*
 * Add a string structure to the symbol.
 * Coordinates assumed to be from top-center.
 */
int render_plot_add_string(struct zint_symbol *symbol,
        unsigned char *text, float x, float y, float fsize, float width,
        struct zint_render_string **last_string) {
    struct zint_render_string *string;

    string = (struct zint_render_string*) malloc(sizeof (struct zint_render_string));
    string->next = NULL;
    string->x = x;
    string->y = y;
    string->width = width;
    string->fsize = fsize;
    string->length = ustrlen(text);
    string->text = (unsigned char*) malloc(sizeof (unsigned char) * (ustrlen(text) + 1));
    ustrcpy(string->text, text);

    if (*last_string)
        (*last_string)->next = string;
    else
        symbol->rendered->strings = string; // First character
    *last_string = string;

    return 1;
}

/*
 * Free the data structures created by render_plot
 */
void render_free(struct zint_symbol *symbol) {
  if (symbol->rendered != NULL) {
    struct zint_render_line *line;
    struct zint_render_string *string;
    struct zint_render_ring *ring;
    struct zint_render_hexagon *hexagon;

    // Free lines
    line = symbol->rendered->lines;
    while (line) {
      struct zint_render_line *l = line;
      line = line->next;
      free(l);
    }
    // Free Strings
    string = symbol->rendered->strings;
    while (string) {
      struct zint_render_string *s = string;
      string = string->next;
      free(s->text);
      free(s);
    }

    // Free Rings
    ring = symbol->rendered->rings;
    while (ring) {
      struct zint_render_ring *r = ring;
      ring = ring->next;
      free(r);
    }

    // Free Hexagons
    hexagon = symbol->rendered->hexagons;
    while (hexagon) {
      struct zint_render_hexagon *h = hexagon;
      hexagon = hexagon->next;
      free(h);
    }

    // Free Render
    free(symbol->rendered);
    symbol->rendered = NULL;
  }
}


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Changes to jni/zint/backend/rss.c.
1
2
3
4
5
6
7
8
9
10
11
12
/* rss.c - Handles Reduced Space Symbology (GS1 DataBar) */

/*
    libzint - the open source barcode library
    Copyright (C) 2008-2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.




|







1
2
3
4
5
6
7
8
9
10
11
12
/* rss.c - Handles Reduced Space Symbology (GS1 DataBar) */

/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


/* The functions "combins" and "getRSSwidths" are copyright BSI and are
   released with permission under the following terms:

   "Copyright subsists in all BSI publications. BSI also holds the copyright, in the
   UK, of the international standardisation bodies. Except as
   permitted under the Copyright, Designs and Patents Act 1988 no extract may be







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

/* The functions "combins" and "getRSSwidths" are copyright BSI and are
   released with permission under the following terms:

   "Copyright subsists in all BSI publications. BSI also holds the copyright, in the
   UK, of the international standardisation bodies. Except as
   permitted under the Copyright, Designs and Patents Act 1988 no extract may be
68
69
70
71
72
73
74

75
76
77
78
79
80
81
82
83
84
85
86
87
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "large.h"
#include "rss.h"
#include "gs1.h"


/**********************************************************************
 * combins(n,r): returns the number of Combinations of r selected from n:
 *   Combinations = n! / ((n - r)! * r!)
 **********************************************************************/
int combins(int n, int r) {
    int i, j;
    int maxDenom, minDenom;
    int val;

    if (n - r > r) {
        minDenom = r;
        maxDenom = n - r;







>





|







69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#ifdef _MSC_VER
#include <malloc.h>
#endif
#include "common.h"
#include "large.h"
#include "rss.h"
#include "gs1.h"
#include "general_field.h"

/**********************************************************************
 * combins(n,r): returns the number of Combinations of r selected from n:
 *   Combinations = n! / ((n - r)! * r!)
 **********************************************************************/
static int combins(int n, int r) {
    int i, j;
    int maxDenom, minDenom;
    int val;

    if (n - r > r) {
        minDenom = r;
        maxDenom = n - r;
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
 * elements = elements in a set (RSS-14 & Expanded = 4; RSS Limited = 7)
 * maxWidth = maximum module width of an element
 * noNarrow = 0 will skip patterns without a one module wide element
 *
 * Return:
 * static int widths[] = element widths
 **********************************************************************/
void getRSSwidths(int val, int n, int elements, int maxWidth, int noNarrow) {
    int bar;
    int elmWidth;
    int mxwElement;
    int subVal, lessVal;
    int narrowMask = 0;
    for (bar = 0; bar < elements - 1; bar++) {
        for (elmWidth = 1, narrowMask |= (1 << bar);







|







116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 * elements = elements in a set (RSS-14 & Expanded = 4; RSS Limited = 7)
 * maxWidth = maximum module width of an element
 * noNarrow = 0 will skip patterns without a one module wide element
 *
 * Return:
 * static int widths[] = element widths
 **********************************************************************/
static void getRSSwidths(int val, int n, int elements, int maxWidth, int noNarrow) {
    int bar;
    int elmWidth;
    int mxwElement;
    int subVal, lessVal;
    int narrowMask = 0;
    for (bar = 0; bar < elements - 1; bar++) {
        for (elmWidth = 1, narrowMask |= (1 << bar);
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
        widths[bar] = elmWidth;
    }
    widths[bar] = n;
    return;
}

/* GS1 DataBar-14 */
int rss14(struct zint_symbol *symbol, unsigned char source[], int src_len) {
    int error_number = 0, i, j, mask;
    short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112];
    int data_character[4], data_group[4], v_odd[4], v_even[4];
    int data_widths[8][4], checksum, c_left, c_right, total_widths[46], writer;
    char latch, temp[32];
    int separator_row;








|







157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
        widths[bar] = elmWidth;
    }
    widths[bar] = n;
    return;
}

/* GS1 DataBar-14 */
INTERNAL int rss14(struct zint_symbol *symbol, unsigned char source[], int src_len) {
    int error_number = 0, i, j, mask;
    short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112];
    int data_character[4], data_group[4], v_odd[4], v_even[4];
    int data_widths[8][4], checksum, c_left, c_right, total_widths[46], writer;
    char latch, temp[32];
    int separator_row;

726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
    }


    return error_number;
}

/* GS1 DataBar Limited */
int rsslimited(struct zint_symbol *symbol, unsigned char source[], int src_len) {
    int error_number = 0, i, mask;
    short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112];
    int left_group, right_group, left_odd, left_even, right_odd, right_even;
    int left_character, right_character, left_widths[14], right_widths[14];
    int checksum, check_elements[14], total_widths[46], writer, j, check_digit, count;
    char latch, hrt[15], temp[32];
    int separator_row;







|







728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
    }


    return error_number;
}

/* GS1 DataBar Limited */
INTERNAL int rsslimited(struct zint_symbol *symbol, unsigned char source[], int src_len) {
    int error_number = 0, i, mask;
    short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112];
    int left_group, right_group, left_odd, left_even, right_odd, right_even;
    int left_character, right_character, left_widths[14], right_widths[14];
    int checksum, check_elements[14], total_widths[46], writer, j, check_digit, count;
    char latch, hrt[15], temp[32];
    int separator_row;
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
    strcat((char*) symbol->text, hrt);

    set_minimum_height(symbol, 10);

    return error_number;
}

/* Attempts to apply encoding rules from secions 7.2.5.5.1 to 7.2.5.5.3
 * of ISO/IEC 24724:2006 */
int general_rules(char type[]) {

    int block[2][200], block_count, i, j, k;
    char current;

    block_count = 0;

    block[0][block_count] = 1;
    block[1][block_count] = type[0];

    for (i = 1; i < strlen(type); i++) {
        char last;
        current = type[i];
        last = type[i - 1];

        if (current == last) {
            block[0][block_count] = block[0][block_count] + 1;
        } else {
            block_count++;
            block[0][block_count] = 1;
            block[1][block_count] = type[i];
        }
    }

    block_count++;

    for (i = 0; i < block_count; i++) {
        char next;
        current = block[1][i];
        next = (block[1][i + 1] & 0xFF);

        if ((current == ISOIEC) && (i != (block_count - 1))) {
            if ((next == ANY_ENC) && (block[0][i + 1] >= 4)) {
                block[1][i + 1] = NUMERIC;
            }
            if ((next == ANY_ENC) && (block[0][i + 1] < 4)) {
                block[1][i + 1] = ISOIEC;
            }
            if ((next == ALPHA_OR_ISO) && (block[0][i + 1] >= 5)) {
                block[1][i + 1] = ALPHA;
            }
            if ((next == ALPHA_OR_ISO) && (block[0][i + 1] < 5)) {
                block[1][i + 1] = ISOIEC;
            }
        }

        if (current == ALPHA_OR_ISO) {
            block[1][i] = ALPHA;
            current = ALPHA;
        }

        if ((current == ALPHA) && (i != (block_count - 1))) {
            if ((next == ANY_ENC) && (block[0][i + 1] >= 6)) {
                block[1][i + 1] = NUMERIC;
            }
            if ((next == ANY_ENC) && (block[0][i + 1] < 6)) {
                if ((i == block_count - 2) && (block[0][i + 1] >= 4)) {
                    block[1][i + 1] = NUMERIC;
                } else {
                    block[1][i + 1] = ALPHA;
                }
            }
        }

        if (current == ANY_ENC) {
            block[1][i] = NUMERIC;
        }
    }

    if (block_count > 1) {
        i = 1;
        while (i < block_count) {
            if (block[1][i - 1] == block[1][i]) {
                /* bring together */
                block[0][i - 1] = block[0][i - 1] + block[0][i];
                j = i + 1;

                /* decreace the list */
                while (j < block_count) {
                    block[0][j - 1] = block[0][j];
                    block[1][j - 1] = block[1][j];
                    j++;
                }
                block_count--;
                i--;
            }
            i++;
        }
    }

    for (i = 0; i < block_count - 1; i++) {
        if ((block[1][i] == NUMERIC) && (block[0][i] & 1)) {
            /* Odd size numeric block */
            block[0][i] = block[0][i] - 1;
            block[0][i + 1] = block[0][i + 1] + 1;
        }
    }

    j = 0;
    for (i = 0; i < block_count; i++) {
        for (k = 0; k < block[0][i]; k++) {
            type[j] = block[1][i];
            j++;
        }
    }

    if ((block[1][block_count - 1] == NUMERIC) && (block[0][block_count - 1] & 1)) {
        /* If the last block is numeric and an odd size, further
        processing needs to be done outside this procedure */
        return 1;
    } else {
        return 0;
    }
}

/* Handles all data encodation from section 7.2.5 of ISO/IEC 24724 */
int rss_binary_string(struct zint_symbol *symbol, char source[], char binary_string[]) {
    int encoding_method, i, j, read_posn, latch, debug = symbol->debug, last_mode = ISOIEC;
    int symbol_characters, characters_per_row;
#ifndef _MSC_VER
    char general_field[strlen(source) + 1], general_field_type[strlen(source) + 1];
#else
    char* general_field = (char*) _alloca(strlen(source) + 1);
    char* general_field_type = (char*) _alloca(strlen(source) + 1);
#endif
    int remainder, d1, d2;
    char padstring[40];

    read_posn = 0;

    /* Decide whether a compressed data field is required and if so what







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
|


|


<







1053
1054
1055
1056
1057
1058
1059





















































































































1060
1061
1062
1063
1064
1065
1066
1067

1068
1069
1070
1071
1072
1073
1074
    strcat((char*) symbol->text, hrt);

    set_minimum_height(symbol, 10);

    return error_number;
}






















































































































/* Handles all data encodation from section 7.2.5 of ISO/IEC 24724 */
static int rss_binary_string(struct zint_symbol *symbol, char source[], char binary_string[]) {
    int encoding_method, i, j, read_posn, last_digit, debug = symbol->debug, mode = NUMERIC;
    int symbol_characters, characters_per_row;
#ifndef _MSC_VER
    char general_field[strlen(source) + 1];
#else
    char* general_field = (char*) _alloca(strlen(source) + 1);

#endif
    int remainder, d1, d2;
    char padstring[40];

    read_posn = 0;

    /* Decide whether a compressed data field is required and if so what
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
    for (i = read_posn; i < strlen(source); i++) {
        general_field[j] = source[i];
        j++;
    }
    general_field[j] = '\0';
    if (debug) printf("General field data = %s\n", general_field);

    latch = 0;
    for (i = 0; i < strlen(general_field); i++) {
        /* Table 13 - ISO/IEC 646 encodation */
        if ((general_field[i] < ' ') || (general_field[i] > 'z')) {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        } else {
            general_field_type[i] = ISOIEC;
        }

        if (general_field[i] == '#') {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == '$') {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == '@') {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == 92) {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == '^') {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }
        if (general_field[i] == 96) {
            general_field_type[i] = INVALID_CHAR;
            latch = 1;
        }

        /* Table 12 - Alphanumeric encodation */
        if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == '*') {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == ',') {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == '-') {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == '.') {
            general_field_type[i] = ALPHA_OR_ISO;
        }
        if (general_field[i] == '/') {
            general_field_type[i] = ALPHA_OR_ISO;
        }

        /* Numeric encodation */
        if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
            general_field_type[i] = ANY_ENC;
        }
        if (general_field[i] == '[') {
            /* FNC1 can be encoded in any system */
            general_field_type[i] = ANY_ENC;
        }
    }

    general_field_type[strlen(general_field)] = '\0';
    if (debug) printf("General field type: %s\n", general_field_type);

    if (latch == 1) {
        /* Invalid characters in input data */
        strcpy(symbol->errtxt, "386: Invalid characters in input data");
        return ZINT_ERROR_INVALID_DATA;
    }

    for (i = 0; i < strlen(general_field); i++) {
        if ((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) {
            general_field_type[i + 1] = ISOIEC;
        }
    }

    for (i = 0; i < strlen(general_field); i++) {
        if ((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) {
            general_field_type[i + 1] = ALPHA_OR_ISO;
        }
    }

    latch = general_rules(general_field_type);
    if (debug) printf("General field type: %s\n", general_field_type);

    last_mode = NUMERIC;

    /* Set initial mode if not NUMERIC */
    if (general_field_type[0] == ALPHA) {
        bin_append(0, 4, binary_string); /* Alphanumeric latch */
        last_mode = ALPHA;
    }
    if (general_field_type[0] == ISOIEC) {
        bin_append(0, 4, binary_string); /* Alphanumeric latch */
        bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */
        last_mode = ISOIEC;
    }

    i = 0;
    do {
        if (debug) printf("Processing character %d ", i);
        switch (general_field_type[i]) {
            case NUMERIC:
                if (debug) printf("as NUMERIC:");

                if (last_mode != NUMERIC) {
                    bin_append(0, 3, binary_string); /* Numeric latch */
                    if (debug) printf("<NUMERIC LATCH>\n");
                }

                if (debug) printf("  %c%c > ", general_field[i], general_field[i + 1]);
                if (general_field[i] != '[') {
                    d1 = ctoi(general_field[i]);
                } else {
                    d1 = 10;
                }

                if (general_field[i + 1] != '[') {
                    d2 = ctoi(general_field[i + 1]);
                } else {
                    d2 = 10;
                }

                bin_append((11 * d1) + d2 + 8, 7, binary_string);

                i += 2;
                if (debug) printf("\n");
                last_mode = NUMERIC;
                break;

            case ALPHA:
                if (debug) printf("as ALPHA\n");
                if (i != 0) {
                    if (last_mode == NUMERIC) {
                        bin_append(0, 4, binary_string); /* Alphanumeric latch */
                    }
                    if (last_mode == ISOIEC) {
                        bin_append(4, 5, binary_string); /* Alphanumeric latch */
                    }
                }

                if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
                    bin_append(general_field[i] - 43, 5, binary_string);
                }

                if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
                    bin_append(general_field[i] - 33, 6, binary_string);
                }

                last_mode = ALPHA;

                if (general_field[i] == '[') {
                    bin_append(15, 5, binary_string);
                    last_mode = NUMERIC;
                } /* FNC1/Numeric latch */

                if (general_field[i] == '*') bin_append(58, 6, binary_string); /* asterisk */
                if (general_field[i] == ',') bin_append(59, 6, binary_string); /* comma */
                if (general_field[i] == '-') bin_append(60, 6, binary_string); /* minus or hyphen */
                if (general_field[i] == '.') bin_append(61, 6, binary_string); /* period or full stop */
                if (general_field[i] == '/') bin_append(62, 6, binary_string); /* slash or solidus */

                i++;
                break;

            case ISOIEC:
                if (debug) printf("as ISOIEC\n");
                if (i != 0) {
                    if (last_mode == NUMERIC) {
                        bin_append(0, 4, binary_string); /* Alphanumeric latch */
                        bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */
                    }
                    if (last_mode == ALPHA) {
                        bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */
                    }
                }

                if ((general_field[i] >= '0') && (general_field[i] <= '9')) {
                    bin_append(general_field[i] - 43, 5, binary_string);
                }

                if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) {
                    bin_append(general_field[i] - 1, 7, binary_string);
                }

                if ((general_field[i] >= 'a') && (general_field[i] <= 'z')) {
                    bin_append(general_field[i] - 7, 7, binary_string);
                }
                last_mode = ISOIEC;

                if (general_field[i] == '[') {
                    bin_append(15, 5, binary_string);
                    last_mode = NUMERIC;
                } /* FNC1/Numeric latch */

                if (general_field[i] == '!') bin_append(232, 8, binary_string); /* exclamation mark */
                if (general_field[i] == 34)  bin_append(233, 8, binary_string); /* quotation mark */
                if (general_field[i] == 37)  bin_append(234, 8, binary_string); /* percent sign */
                if (general_field[i] == '&') bin_append(235, 8, binary_string); /* ampersand */
                if (general_field[i] == 39)  bin_append(236, 8, binary_string); /* apostrophe */
                if (general_field[i] == '(') bin_append(237, 8, binary_string); /* left parenthesis */
                if (general_field[i] == ')') bin_append(238, 8, binary_string); /* right parenthesis */
                if (general_field[i] == '*') bin_append(239, 8, binary_string); /* asterisk */
                if (general_field[i] == '+') bin_append(240, 8, binary_string); /* plus sign */
                if (general_field[i] == ',') bin_append(241, 8, binary_string); /* comma */
                if (general_field[i] == '-') bin_append(242, 8, binary_string); /* minus or hyphen */
                if (general_field[i] == '.') bin_append(243, 8, binary_string); /* period or full stop */
                if (general_field[i] == '/') bin_append(244, 8, binary_string); /* slash or solidus */
                if (general_field[i] == ':') bin_append(245, 8, binary_string); /* colon */
                if (general_field[i] == ';') bin_append(246, 8, binary_string); /* semicolon */
                if (general_field[i] == '<') bin_append(247, 8, binary_string); /* less-than sign */
                if (general_field[i] == '=') bin_append(248, 8, binary_string); /* equals sign */
                if (general_field[i] == '>') bin_append(249, 8, binary_string); /* greater-than sign */
                if (general_field[i] == '?') bin_append(250, 8, binary_string); /* question mark */
                if (general_field[i] == '_') bin_append(251, 8, binary_string); /* underline or low line */
                if (general_field[i] == ' ') bin_append(252, 8, binary_string); /* space */

                i++;
                break;
        }
    } while (i + latch < strlen(general_field));
    if (debug) printf("Resultant binary = %s\n", binary_string);
    if (debug) printf("\tLength: %d\n", (int) strlen(binary_string));

    remainder = 12 - (strlen(binary_string) % 12);
    if (remainder == 12) {
        remainder = 0;
    }
    symbol_characters = ((strlen(binary_string) + remainder) / 12) + 1;

    if ((symbol->symbology == BARCODE_RSS_EXPSTACK) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) {
        characters_per_row = symbol->option_2 * 2;

        if ((characters_per_row < 2) || (characters_per_row > 20)) {
            characters_per_row = 4;
        }

        if ((symbol_characters % characters_per_row) == 1) {
            symbol_characters++;
        }

        if (symbol_characters < 4) {
            symbol_characters = 4;
        }
    }

    if (symbol_characters < 3) {
        symbol_characters = 3;
    }

    remainder = (12 * (symbol_characters - 1)) - strlen(binary_string);

    if (latch == 1) {
        /* There is still one more numeric digit to encode */
        if (debug) printf("Adding extra (odd) numeric digit\n");

        if (last_mode == NUMERIC) {
            if ((remainder >= 4) && (remainder <= 6)) {
                bin_append(ctoi(general_field[i]) + 1, 4, binary_string);
            } else {
                d1 = ctoi(general_field[i]);
                d2 = 10;

                bin_append((11 * d1) + d2 + 8, 7, binary_string);
            }
        } else {
            bin_append(general_field[i] - 43, 5, binary_string);
        }

        remainder = 12 - (strlen(binary_string) % 12);
        if (remainder == 12) {
            remainder = 0;
        }
        symbol_characters = ((strlen(binary_string) + remainder) / 12) + 1;

        if ((symbol->symbology == BARCODE_RSS_EXPSTACK) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) {
            characters_per_row = symbol->option_2 * 2;

            if ((characters_per_row < 2) || (characters_per_row > 20)) {
                characters_per_row = 4;
            }

            if ((symbol_characters % characters_per_row) == 1) {
                symbol_characters++;
            }

            if (symbol_characters < 4) {
                symbol_characters = 4;
            }
        }

        if (symbol_characters < 3) {
            symbol_characters = 3;
        }

        remainder = (12 * (symbol_characters - 1)) - strlen(binary_string);

        if (debug) printf("Resultant binary = %s\n", binary_string);
        if (debug) printf("\tLength: %d\n", (int) strlen(binary_string));
    }

    if (strlen(binary_string) > 252) {
        strcpy(symbol->errtxt, "387: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }

    /* Now add padding to binary string (7.2.5.5.4) */
    i = remainder;
    if ((strlen(general_field) != 0) && (last_mode == NUMERIC)) {
        strcpy(padstring, "0000");
        i -= 4;
    } else {
        strcpy(padstring, "");
    }
    for (; i > 0; i -= 5) {
        strcat(padstring, "00100");







<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<



















|
<
<
|
<
<
|
|




|



<
|
|
|
|
|

|
<
<
<


















|
<
<
|
<
<
|
|








|






|







1386
1387
1388
1389
1390
1391
1392









1393



























































1394
1395
1396
1397
























































































































































1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417


1418


1419
1420
1421
1422
1423
1424
1425
1426
1427
1428

1429
1430
1431
1432
1433
1434
1435



1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454


1455


1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
    for (i = read_posn; i < strlen(source); i++) {
        general_field[j] = source[i];
        j++;
    }
    general_field[j] = '\0';
    if (debug) printf("General field data = %s\n", general_field);










    if (!general_field_encode(general_field, &mode, &last_digit, binary_string)) {



























































        /* Invalid characters in input data */
        strcpy(symbol->errtxt, "386: Invalid characters in input data");
        return ZINT_ERROR_INVALID_DATA;
    }
























































































































































    if (debug) printf("Resultant binary = %s\n", binary_string);
    if (debug) printf("\tLength: %d\n", (int) strlen(binary_string));

    remainder = 12 - (strlen(binary_string) % 12);
    if (remainder == 12) {
        remainder = 0;
    }
    symbol_characters = ((strlen(binary_string) + remainder) / 12) + 1;

    if ((symbol->symbology == BARCODE_RSS_EXPSTACK) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) {
        characters_per_row = symbol->option_2 * 2;

        if ((characters_per_row < 2) || (characters_per_row > 20)) {
            characters_per_row = 4;
        }

        if ((symbol_characters % characters_per_row) == 1) {
            symbol_characters++;
        }
    }





    if (symbol_characters < 4) {
        symbol_characters = 4;
    }

    remainder = (12 * (symbol_characters - 1)) - strlen(binary_string);

    if (last_digit) {
        /* There is still one more numeric digit to encode */
        if (debug) printf("Adding extra (odd) numeric digit\n");


        if ((remainder >= 4) && (remainder <= 6)) {
            bin_append(ctoi(last_digit) + 1, 4, binary_string);
        } else {
            d1 = ctoi(last_digit);
            d2 = 10;

            bin_append((11 * d1) + d2 + 8, 7, binary_string);



        }

        remainder = 12 - (strlen(binary_string) % 12);
        if (remainder == 12) {
            remainder = 0;
        }
        symbol_characters = ((strlen(binary_string) + remainder) / 12) + 1;

        if ((symbol->symbology == BARCODE_RSS_EXPSTACK) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) {
            characters_per_row = symbol->option_2 * 2;

            if ((characters_per_row < 2) || (characters_per_row > 20)) {
                characters_per_row = 4;
            }

            if ((symbol_characters % characters_per_row) == 1) {
                symbol_characters++;
            }
        }





        if (symbol_characters < 4) {
            symbol_characters = 4;
        }

        remainder = (12 * (symbol_characters - 1)) - strlen(binary_string);

        if (debug) printf("Resultant binary = %s\n", binary_string);
        if (debug) printf("\tLength: %d\n", (int) strlen(binary_string));
    }

    if (strlen(binary_string) > 252) { /* 252 = (21 * 12) */
        strcpy(symbol->errtxt, "387: Input too long");
        return ZINT_ERROR_TOO_LONG;
    }

    /* Now add padding to binary string (7.2.5.5.4) */
    i = remainder;
    if (mode == NUMERIC) {
        strcpy(padstring, "0000");
        i -= 4;
    } else {
        strcpy(padstring, "");
    }
    for (; i > 0; i -= 5) {
        strcat(padstring, "00100");
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866

1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
    }
    if (debug) printf("Resultant binary = %s\n", binary_string);
    if (debug) printf("\tLength: %d\n", (int) strlen(binary_string));
    return 0;
}

/* GS1 DataBar Expanded */
int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len) {
    int i, j, k, p, data_chars, vs[21], group[21], v_odd[21], v_even[21];
    char substring[21][14], latch;
    int char_widths[21][8], checksum, check_widths[8], c_group;
    int check_char, c_odd, c_even, elements[235], pattern_width, reader, writer;
    int separator_row;

#ifndef _MSC_VER
    char reduced[src_len + 1], binary_string[(7 * src_len) + 1];
#else
    char* reduced = (char*) _alloca(src_len + 1);
    char* binary_string = (char*) _alloca((7 * src_len) + 1);
#endif

    separator_row = 0;
    reader = 0;

    if (symbol->input_mode != GS1_MODE) {
        /* GS1 data has not been verified yet */
        i = gs1_verify(symbol, source, src_len, reduced);
        if (i != 0) {
            return i;
        }
    }

    if ((symbol->symbology == BARCODE_RSS_EXP_CC) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) {
        /* make space for a composite separator pattern */
        separator_row = symbol->rows;
        symbol->row_height[separator_row] = 1;
        symbol->rows += 1;







|





>

|


|





<
<
|
|
|
<







1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529


1530
1531
1532

1533
1534
1535
1536
1537
1538
1539
    }
    if (debug) printf("Resultant binary = %s\n", binary_string);
    if (debug) printf("\tLength: %d\n", (int) strlen(binary_string));
    return 0;
}

/* GS1 DataBar Expanded */
INTERNAL int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len) {
    int i, j, k, p, data_chars, vs[21], group[21], v_odd[21], v_even[21];
    char substring[21][14], latch;
    int char_widths[21][8], checksum, check_widths[8], c_group;
    int check_char, c_odd, c_even, elements[235], pattern_width, reader, writer;
    int separator_row;
    unsigned int bin_len = 13 * src_len + 200 + 1; /* Allow for 8 bits + 5-bit latch per char + 200 bits overhead/padding */
#ifndef _MSC_VER
    char reduced[src_len + 1], binary_string[bin_len];
#else
    char* reduced = (char*) _alloca(src_len + 1);
    char* binary_string = (char*) _alloca(bin_len);
#endif

    separator_row = 0;
    reader = 0;



    i = gs1_verify(symbol, source, src_len, reduced);
    if (i != 0) {
        return i;

    }

    if ((symbol->symbology == BARCODE_RSS_EXP_CC) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) {
        /* make space for a composite separator pattern */
        separator_row = symbol->rows;
        symbol->row_height[separator_row] = 1;
        symbol->rows += 1;
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
            if (current_row != 1) {
                /* middle separator pattern (above current row) */
                for (j = 5; j < (49 * symbol->option_2); j += 2) {
                    set_module(symbol, symbol->rows - 2, j);
                }
                symbol->row_height[symbol->rows - 2] = 1;
                /* bottom separator pattern (above current row) */
                for (j = 4; j < (writer - 4); j++) {
                    if (module_is_set(symbol, symbol->rows, j)) {
                        unset_module(symbol, symbol->rows - 1, j);
                    } else {
                        set_module(symbol, symbol->rows - 1, j);
                    }
                }
                symbol->row_height[symbol->rows - 1] = 1;







|







1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
            if (current_row != 1) {
                /* middle separator pattern (above current row) */
                for (j = 5; j < (49 * symbol->option_2); j += 2) {
                    set_module(symbol, symbol->rows - 2, j);
                }
                symbol->row_height[symbol->rows - 2] = 1;
                /* bottom separator pattern (above current row) */
                for (j = 4 + special_case_row; j < (writer - 4); j++) {
                    if (module_is_set(symbol, symbol->rows, j)) {
                        unset_module(symbol, symbol->rows - 1, j);
                    } else {
                        set_module(symbol, symbol->rows - 1, j);
                    }
                }
                symbol->row_height[symbol->rows - 1] = 1;
2303
2304
2305
2306
2307
2308
2309
2310
2311
        if (symbol->row_height[i] == 0) {
            symbol->row_height[i] = 34;
        }
    }

    return 0;
}









<
<
1953
1954
1955
1956
1957
1958
1959


        if (symbol->row_height[i] == 0) {
            symbol->row_height[i] = 34;
        }
    }

    return 0;
}


Changes to jni/zint/backend/rss.h.
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#define NUMERIC		110
#define ALPHA		97
#define ISOIEC		105
#define	INVALID_CHAR	100
#define	ANY_ENC		120
#define ALPHA_OR_ISO	121

/* RSS-14 Tables */
static const unsigned short int g_sum_table[9] = {
    0, 161, 961, 2015, 2715, 0, 336, 1036, 1516
};

static const char t_table[9] = {







|
<
<
<
<
<
<







25
26
27
28
29
30
31
32






33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */







/* RSS-14 Tables */
static const unsigned short int g_sum_table[9] = {
    0, 161, 961, 2015, 2715, 0, 336, 1036, 1516
};

static const char t_table[9] = {
Added jni/zint/backend/sjis.c.
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */
/*
 * Adapted from the GNU LIBICONV library and patched to make compatible with
 * https://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT
 * with the exception of one duplicate mapping to reverse solidus 0x815F
 * and the mapping of user-defined PUA codepoints U+E000..E757.
 */
/*
 * Copyright (C) 1999-2002, 2016 Free Software Foundation, Inc.
 * This file is part of the GNU LIBICONV Library.
 *
 * The GNU LIBICONV Library is free software; you can redistribute it
 * and/or modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * The GNU LIBICONV Library is distributed in the hope that it will be
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with the GNU LIBICONV Library; see the file COPYING.LIB.
 * If not, see <https://www.gnu.org/licenses/>.
 */
#include <string.h>
#include "common.h"
#include "sjis.h"

INTERNAL int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */

/*
 * JISX0201.1976-0 (libiconv-1.16/lib/jisx0201.h)
 */

static int jisx0201_wctomb(unsigned int* r, unsigned int wc) {
    if (wc < 0x0080 && !(wc == 0x005c || wc == 0x007e)) {
        *r = wc;
        return 1;
    }
    if (wc == 0x00a5) {
        *r = 0x5c;
        return 1;
    }
    if (wc == 0x203e) {
        *r = 0x7e;
        return 1;
    }
    if (wc >= 0xff61 && wc < 0xffa0) {
        *r = wc - 0xfec0;
        return 1;
    }
    return 0;
}

/*
 * JISX0208.1990-0 (libiconv-1.16/lib/jisx0208.h)
 */

/* ZINT: Table converted from JIS X 0208 to Shift JIS values using tools/cnv_sjis.php:
 * 
while ($line = fgets(STDIN)) {
    echo preg_replace_callback('/0x([0-9a-f]{4})/', function ($matches) {
        $dec = hexdec($matches[1]);
        $c1 = $dec >> 8;
        $c2 = ($dec & 0xFF);
        $t1 = ($c1 - 0x21) >> 1;
        $t2 = ((($c1 - 0x21) & 1) ? 0x5e : 0) + ($c2 - 0x21);
        $r = (($t1 < 0x1f ? ($t1 + 0x81) : ($t1 + 0xc1)) << 8) | ($t2 < 0x3f ? ($t2 + 0x40) : ($t2 + 0x41));
        return '0x' . dechex($r);
    }, $line);
}
 */
static const unsigned short jisx0208_2charset[6879] = {
  0x8191, 0x8192, 0x8198, 0x814e, 0x81ca, 0x818b, 0x817d, 0x814c,
  0x81f7, 0x817e, 0x8180, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3,
  0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab,
  0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b0, 0x83b1, 0x83b2, 0x83b3,
  0x83b4, 0x83b5, 0x83b6, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3,
  0x83c4, 0x83c5, 0x83c6, 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb,
  0x83cc, 0x83cd, 0x83ce, 0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3,
  0x83d4, 0x83d5, 0x83d6, 0x8446, 0x8440, 0x8441, 0x8442, 0x8443,
  0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0x844a, 0x844b, 0x844c,
  0x844d, 0x844e, 0x844f, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454,
  0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845a, 0x845b, 0x845c,
  0x845d, 0x845e, 0x845f, 0x8460, 0x8470, 0x8471, 0x8472, 0x8473,
  0x8474, 0x8475, 0x8477, 0x8478, 0x8479, 0x847a, 0x847b, 0x847c,
  0x847d, 0x847e, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484, 0x8485,
  0x8486, 0x8487, 0x8488, 0x8489, 0x848a, 0x848b, 0x848c, 0x848d,
  0x848e, 0x848f, 0x8490, 0x8491, 0x8476, 0x815d, 0x815c, 0x8161,
  0x8165, 0x8166, 0x8167, 0x8168, 0x81f5, 0x81f6, 0x8164, 0x8163,
  0x81f1, 0x818c, 0x818d, 0x81a6, 0x818e, 0x81f0, 0x81a9, 0x81aa,
  0x81a8, 0x81ab, 0x81cb, 0x81cc, 0x81cd, 0x81dd, 0x81ce, 0x81de,
  0x81b8, 0x81b9, 0x817c, 0x81e3, 0x81e5, 0x8187, 0x81da, 0x81c8,
  0x81c9, 0x81bf, 0x81be, 0x81e7, 0x81e8, 0x8188, 0x81e6, 0x81e4,
  0x81e0, 0x8182, 0x81df, 0x8185, 0x8186, 0x81e1, 0x81e2, 0x81bc,
  0x81bd, 0x81ba, 0x81bb, 0x81db, 0x81dc, 0x849f, 0x84aa, 0x84a0,
  0x84ab, 0x84a1, 0x84ac, 0x84a2, 0x84ad, 0x84a4, 0x84af, 0x84a3,
  0x84ae, 0x84a5, 0x84ba, 0x84b5, 0x84b0, 0x84a7, 0x84bc, 0x84b7,
  0x84b2, 0x84a6, 0x84b6, 0x84bb, 0x84b1, 0x84a8, 0x84b8, 0x84bd,
  0x84b3, 0x84a9, 0x84b9, 0x84be, 0x84b4, 0x81a1, 0x81a0, 0x81a3,
  0x81a2, 0x81a5, 0x81a4, 0x819f, 0x819e, 0x819b, 0x819d, 0x819c,
  0x81fc, 0x819a, 0x8199, 0x818a, 0x8189, 0x81f4, 0x81f3, 0x81f2,
  0x8140, 0x8141, 0x8142, 0x8156, 0x8158, 0x8159, 0x815a, 0x8171,
  0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, 0x8179,
  0x817a, 0x81a7, 0x81ac, 0x816b, 0x816c, 0x8160, 0x829f, 0x82a0,
  0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5, 0x82a6, 0x82a7, 0x82a8,
  0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0x82ae, 0x82af, 0x82b0,
  0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0x82b7, 0x82b8,
  0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, 0x82c0,
  0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c7, 0x82c8,
  0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd, 0x82ce, 0x82cf, 0x82d0,
  0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5, 0x82d6, 0x82d7, 0x82d8,
  0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, 0x82e0,
  0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, 0x82e8,
  0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed, 0x82ee, 0x82ef, 0x82f0,
  0x82f1, 0x814a, 0x814b, 0x8154, 0x8155, 0x8340, 0x8341, 0x8342,
  0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834a,
  0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351, 0x8352,
  0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835a,
  0x835b, 0x835c, 0x835d, 0x835e, 0x835f, 0x8360, 0x8361, 0x8362,
  0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836a,
  0x836b, 0x836c, 0x836d, 0x836e, 0x836f, 0x8370, 0x8371, 0x8372,
  0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837a,
  0x837b, 0x837c, 0x837d, 0x837e, 0x8380, 0x8381, 0x8382, 0x8383,
  0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x8389, 0x838a, 0x838b,
  0x838c, 0x838d, 0x838e, 0x838f, 0x8390, 0x8391, 0x8392, 0x8393,
  0x8394, 0x8395, 0x8396, 0x8145, 0x815b, 0x8152, 0x8153, 0x88ea,
  0x929a, 0x8eb5, 0x969c, 0x8fe4, 0x8e4f, 0x8fe3, 0x89ba, 0x9573,
  0x975e, 0x98a0, 0x894e, 0x8a8e, 0x98a1, 0x90a2, 0x99c0, 0x8b75,
  0x95b8, 0x8fe5, 0x97bc, 0x95c0, 0x98a2, 0x9286, 0x98a3, 0x8bf8,
  0x98a4, 0x8adb, 0x924f, 0x8ee5, 0x98a5, 0x98a6, 0x98a7, 0x9454,
  0x8b76, 0x9456, 0x93e1, 0x8cc1, 0x9652, 0xe568, 0x98a8, 0x8fe6,
  0x98a9, 0x89b3, 0x8be3, 0x8cee, 0x96e7, 0x9ba4, 0x9790, 0x93fb,
  0x8aa3, 0x8b54, 0x98aa, 0x98ab, 0x97b9, 0x975c, 0x9188, 0x98ad,
  0x8e96, 0x93f1, 0x98b0, 0x895d, 0x8cdd, 0x8cdc, 0x88e4, 0x986a,
  0x9869, 0x8db1, 0x889f, 0x98b1, 0x98b2, 0x98b3, 0x9653, 0x98b4,
  0x8cf0, 0x88e5, 0x9692, 0x8b9c, 0x8b9d, 0x8b9e, 0x92e0, 0x97ba,
  0x98b5, 0x98b6, 0x98b7, 0x906c, 0x8f59, 0x906d, 0x98bc, 0x98ba,
  0x98bb, 0x8b77, 0x8da1, 0x89ee, 0x98b9, 0x98b8, 0x95a7, 0x8e65,
  0x8e64, 0x91bc, 0x98bd, 0x9574, 0x90e5, 0x8157, 0x98be, 0x98c0,
  0x91e3, 0x97df, 0x88c8, 0x98bf, 0x89bc, 0x8bc2, 0x9287, 0x8c8f,
  0x98c1, 0x9443, 0x8ae9, 0x98c2, 0x88c9, 0x8cde, 0x8aea, 0x959a,
  0x94b0, 0x8b78, 0x89ef, 0x98e5, 0x9360, 0x948c, 0x98c4, 0x94ba,
  0x97e0, 0x904c, 0x8e66, 0x8e97, 0x89be, 0x92cf, 0x9241, 0x98c8,
  0x88ca, 0x92e1, 0x8f5a, 0x8db2, 0x9743, 0x91cc, 0x89bd, 0x98c7,
  0x975d, 0x98c3, 0x98c5, 0x8dec, 0x98c6, 0x9b43, 0x98ce, 0x98d1,
  0x98cf, 0x89c0, 0x95b9, 0x98c9, 0x98cd, 0x8cf1, 0x8e67, 0x8aa4,
  0x98d2, 0x98ca, 0x97e1, 0x8e98, 0x98cb, 0x98d0, 0x98d3, 0x98cc,
  0x8b9f, 0x88cb, 0x8ba0, 0x89bf, 0x9b44, 0x9699, 0x958e, 0x8cf2,
  0x904e, 0x97b5, 0x95d6, 0x8c57, 0x91a3, 0x89e2, 0x8f72, 0x98d7,
  0x98dc, 0x98da, 0x98d5, 0x91ad, 0x98d8, 0x98db, 0x98d9, 0x95db,
  0x98d6, 0x904d, 0x9693, 0x98dd, 0x98de, 0x8f43, 0x98eb, 0x946f,
  0x9555, 0x98e6, 0x95ee, 0x89b4, 0x98ea, 0x98e4, 0x98ed, 0x9171,
  0x8cc2, 0x947b, 0xe0c5, 0x98ec, 0x937c, 0x98e1, 0x8cf4, 0x8cf3,
  0x98df, 0x8ed8, 0x98e7, 0x95ed, 0x926c, 0x98e3, 0x8c91, 0x98e0,
  0x98e8, 0x98e2, 0x97cf, 0x98e9, 0x9860, 0x8be4, 0x8c90, 0x98ee,
  0x98ef, 0x98f3, 0x88cc, 0x95ce, 0x98f2, 0x98f1, 0x98f5, 0x98f4,
  0x92e2, 0x8c92, 0x98f6, 0x8ec3, 0x91a4, 0x92e3, 0x8bf4, 0x98f7,
  0x8b55, 0x98f8, 0x98fa, 0x9654, 0x8c86, 0x8e50, 0x94f5, 0x98f9,
  0x8dc3, 0x9762, 0x98fc, 0x9942, 0x98fb, 0x8dc2, 0x8f9d, 0x8c58,
  0x9943, 0x8bcd, 0x9940, 0x9941, 0x93ad, 0x919c, 0x8ba1, 0x966c,
  0x9944, 0x97bb, 0x9945, 0x9948, 0x9946, 0x916d, 0x9947, 0x9949,
  0x994b, 0x994a, 0x95c6, 0x8b56, 0x994d, 0x994e, 0x89ad, 0x994c,
  0x8ef2, 0x9951, 0x9950, 0x994f, 0x98d4, 0x9952, 0x8f9e, 0x9953,
  0x9744, 0x96d7, 0x9955, 0x9954, 0x9957, 0x9956, 0x9958, 0x9959,
  0x88f2, 0x8cb3, 0x8c5a, 0x8f5b, 0x929b, 0x8ba2, 0x90e6, 0x8cf5,
  0x8d8e, 0x995b, 0x96c6, 0x9365, 0x8e99, 0x995a, 0x995c, 0x937d,
  0x8a95, 0x995d, 0x93fc, 0x9153, 0x995f, 0x9960, 0x94aa, 0x8cf6,
  0x985a, 0x9961, 0x8ba4, 0x95ba, 0x91b4, 0x8bef, 0x9354, 0x8c93,
  0x9962, 0x9963, 0x93e0, 0x897e, 0x9966, 0x8dfb, 0x9965, 0x8dc4,
  0x9967, 0xe3ec, 0x9968, 0x9660, 0x9969, 0x996a, 0x996b, 0x8fe7,
  0x8eca, 0x8aa5, 0x996e, 0x996c, 0x96bb, 0x996d, 0x9579, 0x996f,
  0x9970, 0x9971, 0x937e, 0x9975, 0x9973, 0x9974, 0x9972, 0x8de1,
  0x9976, 0x96e8, 0x97e2, 0x9977, 0x90a6, 0x9978, 0x8f79, 0x9979,
  0x929c, 0x97bd, 0x9380, 0x99c3, 0x997a, 0xeaa3, 0x8bc3, 0x997b,
  0x967d, 0x8f88, 0x91fa, 0x997d, 0x93e2, 0x997e, 0x9980, 0x8a4d,
  0x9981, 0x8ba5, 0x93ca, 0x899a, 0x8f6f, 0x949f, 0x9982, 0x9381,
  0x906e, 0x9983, 0x95aa, 0x90d8, 0x8aa0, 0x8aa7, 0x9984, 0x9986,
  0x8c59, 0x9985, 0x97f1, 0x8f89, 0x94bb, 0x95ca, 0x9987, 0x9798,
  0x9988, 0x9989, 0x939e, 0x998a, 0x90a7, 0x8dfc, 0x8c94, 0x998b,
  0x8e68, 0x8d8f, 0x92e4, 0x998d, 0x91a5, 0x8ded, 0x998e, 0x998f,
  0x914f, 0x998c, 0x9991, 0x9655, 0x8d84, 0x9990, 0x8c95, 0x8ddc,
  0x948d, 0x9994, 0x9992, 0x959b, 0x8fe8, 0x999b, 0x8a84, 0x9995,
  0x9993, 0x916e, 0x9997, 0x9996, 0x8a63, 0x8c80, 0x999c, 0x97ab,
  0x9998, 0x999d, 0x999a, 0x9999, 0x97cd, 0x8cf7, 0x89c1, 0x97f2,
  0x8f95, 0x9377, 0x8d85, 0x99a0, 0x99a1, 0x97e3, 0x984a, 0x99a3,
  0x8cf8, 0x99a2, 0x8a4e, 0x99a4, 0x9675, 0x92ba, 0x9745, 0x95d7,
  0x99a5, 0xe8d3, 0x93ae, 0x99a6, 0x8aa8, 0x96b1, 0x8f9f, 0x99a7,
  0x95e5, 0x99ab, 0x90a8, 0x99a8, 0x8bce, 0x99a9, 0x8aa9, 0x8c4d,
  0x99ac, 0x99ad, 0x99ae, 0x99af, 0x8ed9, 0x8cf9, 0x96dc, 0x96e6,
  0x93f5, 0x95ef, 0x99b0, 0x99b1, 0x99b3, 0x99b5, 0x99b4, 0x99b6,
  0x89bb, 0x966b, 0x8dfa, 0x99b7, 0x9178, 0x8fa0, 0x8ba7, 0x99b8,
  0x94d9, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x9543, 0x8be6, 0x88e3,
  0x93bd, 0x99bd, 0x8f5c, 0x90e7, 0x99bf, 0x99be, 0x8fa1, 0x8cdf,
  0x99c1, 0x94bc, 0x99c2, 0x94da, 0x91b2, 0x91ec, 0x8ba6, 0x93ec,
  0x9250, 0x948e, 0x966d, 0x99c4, 0x90e8, 0x8c54, 0x99c5, 0x99c6,
  0x894b, 0x88f3, 0x8aeb, 0x91a6, 0x8b70, 0x9791, 0x99c9, 0x89b5,
  0x99c8, 0x8ba8, 0x99ca, 0x96ef, 0x99cb, 0x97d0, 0x8cfa, 0x8cb4,
  0x99cc, 0x99ce, 0x99cd, 0x907e, 0x8958, 0x897d, 0x99cf, 0x99d0,
  0x8cb5, 0x99d1, 0x8b8e, 0x8e51, 0x99d2, 0x9694, 0x8db3, 0x8b79,
  0x9746, 0x916f, 0x94bd, 0x8efb, 0x8f66, 0x8ee6, 0x8ef3, 0x8f96,
  0x94be, 0x99d5, 0x8962, 0x9170, 0x8cfb, 0x8cc3, 0x8be5, 0x99d9,
  0x9240, 0x91fc, 0x8ba9, 0x8fa2, 0x99da, 0x99d8, 0x89c2, 0x91e4,
  0x8eb6, 0x8e6a, 0x8945, 0x8a90, 0x8d86, 0x8e69, 0x99db, 0x99dc,
  0x8b68, 0x8a65, 0x8d87, 0x8b67, 0x92dd, 0x8944, 0x93af, 0x96bc,
  0x8d40, 0x9799, 0x9366, 0x8cfc, 0x8c4e, 0x99e5, 0x8be1, 0x9669,
  0x94db, 0x99e4, 0x8adc, 0x99df, 0x99e0, 0x99e2, 0x99e3, 0x8b7a,
  0x9081, 0x95ab, 0x99e1, 0x99dd, 0x8ce1, 0x99de, 0x9843, 0x95f0,
  0x92e6, 0x8ce0, 0x8d90, 0x99e6, 0x93db, 0x99ea, 0x8efc, 0x8ef4,
  0x99ed, 0x99eb, 0x96a1, 0x99e8, 0x99f1, 0x99ec, 0x99ef, 0x8cc4,
  0x96bd, 0x99f0, 0x99f2, 0x99f4, 0x8dee, 0x9861, 0x99e9, 0x99e7,
  0x99f3, 0x99ee, 0x99f6, 0x9a42, 0x99f8, 0x99fc, 0x9a40, 0x99f9,
  0x9a5d, 0x8de7, 0x8a50, 0x99f7, 0x9a44, 0x88f4, 0x9a43, 0x88a3,
  0x9569, 0x9a41, 0x99fa, 0x99f5, 0x99fb, 0x8dc6, 0x9a45, 0x88f5,
  0x9a4e, 0x9a46, 0x9a47, 0x8fa3, 0x9689, 0x9a4c, 0x9a4b, 0x934e,
  0x9a4d, 0x9a4a, 0x8953, 0x8db4, 0x904f, 0x9a48, 0x9382, 0x9a49,
  0x88a0, 0x9a53, 0x9742, 0x8fa5, 0x9a59, 0x9a58, 0x9a4f, 0x91c1,
  0x9a50, 0x91ed, 0x9a55, 0x8fa4, 0x9a52, 0x96e2, 0x8c5b, 0x9a56,
  0x9a57, 0x9a54, 0x9a5a, 0x9a51, 0x9a60, 0x9a65, 0x9a61, 0x9a5c,
  0x9a66, 0x9150, 0x9a68, 0x8d41, 0x9a5e, 0x929d, 0x9a62, 0x9a5b,
  0x8aab, 0x8aec, 0x8a85, 0x9a63, 0x9a5f, 0x8c96, 0x9a69, 0x9a67,
  0x9172, 0x8b69, 0x8baa, 0x9a64, 0x8bf2, 0x8963, 0x9a6d, 0x9a6b,
  0x9aa5, 0x9a70, 0x9a6a, 0x9a6e, 0x9a6c, 0x8e6b, 0x9a6f, 0x9a72,
  0x9a77, 0x9a75, 0x9a74, 0x9251, 0x89c3, 0x9a71, 0x9a73, 0x8fa6,
  0x8952, 0x9a76, 0x89dc, 0x9a82, 0x8ffa, 0x9a7d, 0x9a7b, 0x9a7c,
  0x9a7e, 0x895c, 0x9158, 0x9a78, 0x9a79, 0x8a9a, 0x9a81, 0x8aed,
  0x9a84, 0x9a80, 0x9a83, 0x95ac, 0x93d3, 0x94b6, 0x9a86, 0x9a85,
  0x8a64, 0x9a87, 0x9a8a, 0x9a89, 0x9a88, 0x9458, 0x9a8b, 0x9a8c,
  0x9a8e, 0x9a8d, 0x9a90, 0x9a93, 0x9a91, 0x9a8f, 0x9a92, 0x9a94,
  0x9a95, 0x9a96, 0x9a97, 0x9a98, 0x9964, 0x8efa, 0x8e6c, 0x89f1,
  0x88f6, 0x9263, 0x9a99, 0x8da2, 0x88cd, 0x907d, 0x9a9a, 0x8cc5,
  0x8d91, 0x9a9c, 0x9a9b, 0x95de, 0x9a9d, 0x9a9f, 0x9a9e, 0x9aa0,
  0x9aa1, 0x8c97, 0x8980, 0x9aa2, 0x9aa4, 0x9aa3, 0x9aa6, 0x9379,
  0x9aa7, 0x88b3, 0x8ddd, 0x8c5c, 0x926e, 0x9aa8, 0x9aa9, 0x9aab,
  0x9aac, 0x8de2, 0x8bcf, 0x9656, 0x9aaa, 0x9aad, 0x8dbf, 0x8d42,
  0x9ab1, 0x8da3, 0x9252, 0x9aae, 0x92d8, 0x9ab2, 0x9082, 0x9ab0,
  0x9ab3, 0x8c5e, 0x9ab4, 0x9ab5, 0x8d43, 0x8a5f, 0x9ab7, 0x9ab8,
  0x9ab9, 0x9ab6, 0x9aaf, 0x9aba, 0x9abb, 0x9684, 0x8fe9, 0x9abd,
  0x9abe, 0x9abc, 0x9ac0, 0x9457, 0x88e6, 0x9575, 0x9ac1, 0x8ffb,
  0x8eb7, 0x947c, 0x8aee, 0x8de9, 0x9678, 0x93b0, 0x8c98, 0x91cd,
  0x9abf, 0x9ac2, 0x91c2, 0x9ac3, 0x9ac4, 0x9ac6, 0x92e7, 0x8aac,
  0xea9f, 0x8981, 0x95f1, 0x8fea, 0x9367, 0x8de4, 0x9acc, 0x95bb,
  0x97db, 0x89f2, 0x9ac8, 0x9159, 0x9acb, 0x9383, 0x9368, 0x9384,
  0x94b7, 0x92cb, 0x8dc7, 0x9ac7, 0x8996, 0x9355, 0x9ac9, 0x9ac5,
  0x906f, 0x9acd, 0x8f6d, 0x8bab, 0x9ace, 0x95e6, 0x919d, 0x92c4,
  0x9ad0, 0x966e, 0x9ad1, 0x9ad6, 0x95ad, 0x9ad5, 0x9acf, 0x9ad2,
  0x9ad4, 0x8da4, 0x95c7, 0x9ad7, 0x9264, 0x89f3, 0x8feb, 0x9ad9,
  0x9ad8, 0x8d88, 0x9ada, 0x9adc, 0x9adb, 0x9ade, 0x9ad3, 0x9ae0,
  0x9adf, 0x9add, 0x8e6d, 0x9070, 0x9173, 0x9ae1, 0x90ba, 0x88eb,
  0x9484, 0x92d9, 0x9ae3, 0x9ae2, 0x9ae4, 0x9ae5, 0x9ae6, 0x9ae7,
  0x95cf, 0x9ae8, 0x89c4, 0x9ae9, 0x975b, 0x8a4f, 0x99c7, 0x8f67,
  0x91bd, 0x9aea, 0x96e9, 0x96b2, 0x9aec, 0x91e5, 0x9356, 0x91be,
  0x9576, 0x9aed, 0x9aee, 0x899b, 0x8eb8, 0x9aef, 0x88ce, 0x9af0,
  0x9af1, 0x8982, 0x8aef, 0x93de, 0x95f2, 0x9af5, 0x9174, 0x9af4,
  0x8c5f, 0x967a, 0x9af3, 0x9385, 0x9af7, 0x9af6, 0x9af9, 0x9af8,
  0x899c, 0x9afa, 0x8fa7, 0x9afc, 0x9244, 0x9afb, 0x95b1, 0x8f97,
  0x937a, 0x9b40, 0x8d44, 0x9b41, 0x9440, 0x94dc, 0x96cf, 0x9444,
  0x9b4a, 0x8b57, 0x9764, 0x96ad, 0x9baa, 0x9b42, 0x9b45, 0x91c3,
  0x9657, 0x9369, 0x9b46, 0x9685, 0x8dc8, 0x8fa8, 0x9b47, 0x8e6f,
  0x8e6e, 0x88b7, 0x8cc6, 0x90a9, 0x88cf, 0x9b4b, 0x9b4c, 0x9b49,
  0x8957, 0x8aad, 0x9b48, 0x96c3, 0x9550, 0x88a6, 0x88f7, 0x8e70,
  0x88d0, 0x88a1, 0x9b51, 0x9b4f, 0x96ba, 0x9b52, 0x9b50, 0x9b4e,
  0x9050, 0x9b4d, 0x95d8, 0x8ce2, 0x9b56, 0x9b57, 0x8fa9, 0x9b53,
  0x984b, 0x946b, 0x9b55, 0x8da5, 0x9b58, 0x9577, 0x9b59, 0x9b54,
  0x96b9, 0x947d, 0x9b5a, 0x9551, 0x9b5b, 0x9b5f, 0x9b5c, 0x89c5,
  0x9b5e, 0x8eb9, 0x9b5d, 0x8c99, 0x9b6b, 0x9b64, 0x9b61, 0x9284,
  0x9b60, 0x9b62, 0x9b63, 0x9b65, 0x9b66, 0x8af0, 0x9b68, 0x9b67,
  0x9b69, 0x8fec, 0x9b6c, 0x92da, 0x8964, 0x9b6a, 0x9b6d, 0x9b6e,
  0x9b71, 0x9b6f, 0x9b70, 0x8e71, 0x9b72, 0x8d45, 0x9b73, 0x8e9a,
  0x91b6, 0x9b74, 0x9b75, 0x8e79, 0x8d46, 0x96d0, 0x8b47, 0x8cc7,
  0x9b76, 0x8a77, 0x9b77, 0x91b7, 0x9b78, 0x9ba1, 0x9b79, 0x9b7a,
  0x9b7b, 0x9b7d, 0x9b7e, 0x9b80, 0x91ee, 0x8946, 0x8ee7, 0x88c0,
  0x9176, 0x8aae, 0x8eb3, 0x8d47, 0x9386, 0x8f40, 0x8aaf, 0x9288,
  0x92e8, 0x88b6, 0x8b58, 0x95f3, 0x8ec0, 0x8b71, 0x90e9, 0x8eba,
  0x9747, 0x9b81, 0x8b7b, 0x8dc9, 0x8a51, 0x8983, 0x8faa, 0x89c6,
  0x9b82, 0x9765, 0x8f68, 0x8ee2, 0x9b83, 0x8af1, 0x93d0, 0x96a7,
  0x9b84, 0x9b85, 0x9578, 0x9b87, 0x8aa6, 0x8bf5, 0x9b86, 0x8ab0,
  0x9051, 0x9b8b, 0x8e40, 0x89c7, 0x9b8a, 0x9b88, 0x9b8c, 0x9b89,
  0x944a, 0x9ecb, 0x9052, 0x9b8d, 0x97be, 0x9b8e, 0x9b90, 0x929e,
  0x9b8f, 0x90a1, 0x8e9b, 0x91ce, 0x8ef5, 0x9595, 0x90ea, 0x8ecb,
  0x9b91, 0x8fab, 0x9b92, 0x9b93, 0x88d1, 0x91b8, 0x9071, 0x9b94,
  0x93b1, 0x8fac, 0x8fad, 0x9b95, 0x90eb, 0x8fae, 0x9b96, 0x9b97,
  0x96de, 0x9b98, 0x8bc4, 0x8f41, 0x9b99, 0x9b9a, 0x8eda, 0x904b,
  0x93f2, 0x9073, 0x94f6, 0x9441, 0x8bc7, 0x9b9b, 0x8b8f, 0x9b9c,
  0x8bfc, 0x93cd, 0x89ae, 0x8e72, 0x9b9d, 0x9ba0, 0x9b9f, 0x8bfb,
  0x9b9e, 0x9357, 0x91ae, 0x936a, 0x8ec6, 0x9177, 0x979a, 0x9ba2,
  0x9ba3, 0x93d4, 0x8e52, 0x9ba5, 0x9ba6, 0x9ba7, 0x8af2, 0x9ba8,
  0x9ba9, 0x89aa, 0x915a, 0x8ae2, 0x9bab, 0x96a6, 0x91d0, 0x8a78,
  0x9bad, 0x9baf, 0x8add, 0x9bac, 0x9bae, 0x9bb1, 0x9bb0, 0x9bb2,
  0x9bb3, 0x93bb, 0x8bac, 0x89e3, 0x9bb4, 0x9bb9, 0x9bb7, 0x95f5,
  0x95f4, 0x9387, 0x9bb6, 0x8f73, 0x9bb5, 0x9092, 0x9bba, 0x8de8,
  0x9bc0, 0x9bc1, 0x9bbb, 0x8a52, 0x9bbc, 0x9bc5, 0x9bc4, 0x9bc3,
  0x9bbf, 0x9bbe, 0x9bc2, 0x95f6, 0x9bc9, 0x9bc6, 0x9bc8, 0x9792,
  0x9bc7, 0x9bbd, 0x9093, 0x9bca, 0x8db5, 0x9bcb, 0x9bcc, 0x9bcf,
  0x9bce, 0x9bcd, 0x9388, 0x9bb8, 0x9bd5, 0x9bd1, 0x9bd0, 0x9bd2,
  0x9bd3, 0x9bd6, 0x97e4, 0x9bd7, 0x9bd4, 0x9bd8, 0x8ade, 0x9bd9,
  0x9bdb, 0x9bda, 0x9bdc, 0x9bdd, 0x90ec, 0x8f42, 0x8f84, 0x9183,
  0x8d48, 0x8db6, 0x8d49, 0x8b90, 0x9bde, 0x8db7, 0x8cc8, 0x9bdf,
  0x96a4, 0x9462, 0x9be0, 0x8d4a, 0x8aaa, 0x9246, 0x8bd0, 0x8e73,
  0x957a, 0x94bf, 0x9be1, 0x8af3, 0x9be4, 0x929f, 0x9be3, 0x9be2,
  0x9be5, 0x92e9, 0x9083, 0x8e74, 0x90c8, 0x91d1, 0x8b41, 0x92a0,
  0x9be6, 0x9be7, 0x8fed, 0x9658, 0x9bea, 0x9be9, 0x9be8, 0x959d,
  0x9bf1, 0x9679, 0x9beb, 0x9bed, 0x968b, 0x9bec, 0x9bee, 0x94a6,
  0x9bef, 0x95bc, 0x9bf0, 0x8ab1, 0x95bd, 0x944e, 0x9bf2, 0x9bf3,
  0x8d4b, 0x8ab2, 0x9bf4, 0x8cb6, 0x9763, 0x9748, 0x8af4, 0x9bf6,
  0x92a1, 0x8d4c, 0x8faf, 0x94dd, 0x8fb0, 0x8f98, 0x92ea, 0x95f7,
  0x9358, 0x8d4d, 0x957b, 0x9bf7, 0x9378, 0x8dc0, 0x8cc9, 0x92eb,
  0x88c1, 0x8f8e, 0x8d4e, 0x9766, 0x9bf8, 0x9bf9, 0x9470, 0x9bfa,
  0x97f5, 0x984c, 0x9bfc, 0x9bfb, 0x8a66, 0x9c40, 0x9c43, 0x9c44,
  0x9c42, 0x955f, 0x8fb1, 0x9c46, 0x9c45, 0x9c41, 0x9c47, 0x9c48,
  0x9c49, 0x9c4c, 0x9c4a, 0x9c4b, 0x9c4d, 0x8984, 0x92ec, 0x9c4e,
  0x8c9a, 0x89f4, 0x9455, 0x9c4f, 0x93f9, 0x95d9, 0x9c50, 0x984d,
  0x9c51, 0x95be, 0x9c54, 0x989f, 0x98af, 0x8eae, 0x93f3, 0x9c55,
  0x8b7c, 0x92a2, 0x88f8, 0x9c56, 0x95a4, 0x8d4f, 0x926f, 0x92ed,
  0x96ed, 0x8cb7, 0x8cca, 0x9c57, 0x9c58, 0x9c5e, 0x8ee3, 0x92a3,
  0x8bad, 0x9c59, 0x954a, 0x9265, 0x9c5a, 0x9c5b, 0x8bae, 0x9c5c,
  0x9c5d, 0x9c5f, 0x9396, 0x9c60, 0x9c61, 0x9c62, 0x9c53, 0x9c52,
  0x9c63, 0x8c60, 0x9546, 0x8dca, 0x9556, 0x92a4, 0x956a, 0x9c64,
  0x8fb2, 0x8965, 0x9c65, 0x9c66, 0x96f0, 0x94de, 0x9c69, 0x899d,
  0x90aa, 0x9c68, 0x9c67, 0x8c61, 0x91d2, 0x9c6d, 0x9c6b, 0x9c6a,
  0x97a5, 0x8ce3, 0x8f99, 0x9c6c, 0x936b, 0x8f5d, 0x93be, 0x9c70,
  0x9c6f, 0x9c6e, 0x9c71, 0x8ce4, 0x9c72, 0x959c, 0x8f7a, 0x9c73,
  0x94f7, 0x93bf, 0x92a5, 0x934f, 0x9c74, 0x8b4a, 0x9053, 0x954b,
  0x8af5, 0x9445, 0x9c75, 0x8e75, 0x9659, 0x965a, 0x899e, 0x9c7a,
  0x9289, 0x9c77, 0x89f5, 0x9cab, 0x9c79, 0x944f, 0x9c78, 0x9c76,
  0x8d9a, 0x9c7c, 0x9c83, 0x9c89, 0x9c81, 0x937b, 0x9c86, 0x957c,
  0x9c80, 0x9c85, 0x97e5, 0x8e76, 0x91d3, 0x9c7d, 0x8b7d, 0x9c88,
  0x90ab, 0x8985, 0x9c82, 0x89f6, 0x9c87, 0x8baf, 0x9c84, 0x9c8a,
  0x9c8c, 0x9c96, 0x9c94, 0x9c91, 0x9c90, 0x97f6, 0x9c92, 0x8bb0,
  0x8d50, 0x8f9a, 0x9c99, 0x9c8b, 0x9c8f, 0x9c7e, 0x89f8, 0x9c93,
  0x9c95, 0x9270, 0x8da6, 0x89b6, 0x9c8d, 0x9c98, 0x9c97, 0x8bb1,
  0x91a7, 0x8a86, 0x8c62, 0x9c8e, 0x9c9a, 0x9c9d, 0x9c9f, 0x8ebb,
  0x9ca5, 0x92ee, 0x9c9b, 0x9ca3, 0x89f7, 0x9ca1, 0x9ca2, 0x9c9e,
  0x9ca0, 0x8ce5, 0x9749, 0x8ab3, 0x8978, 0x9ca4, 0x9459, 0x88ab,
  0x94df, 0x9c7b, 0x9caa, 0x9cae, 0x96e3, 0x9ca7, 0x9389, 0x9cac,
  0x8fee, 0x9cad, 0x93d5, 0x9866, 0x9ca9, 0x9caf, 0x8d9b, 0x90c9,
  0x88d2, 0x9ca8, 0x9ca6, 0x9179, 0x9c9c, 0x8e53, 0x91c4, 0x9cbb,
  0x917a, 0x9cb6, 0x9cb3, 0x9cb4, 0x8ee4, 0x9cb7, 0x9cba, 0x9cb5,
  0x8f44, 0x9cb8, 0x9cb2, 0x96fa, 0x96f9, 0x9cbc, 0x9cbd, 0x88d3,
  0x9cb1, 0x8bf0, 0x88a4, 0x8ab4, 0x9cb9, 0x9cc1, 0x9cc0, 0x9cc5,
  0x9cc6, 0x9cc4, 0x9cc7, 0x9cbf, 0x9cc3, 0x9cc8, 0x9cc9, 0x9cbe,
  0x8e9c, 0x9cc2, 0x91d4, 0x8d51, 0x9cb0, 0x9054, 0x9cd6, 0x95e7,
  0x9ccc, 0x9ccd, 0x9cce, 0x9cd5, 0x9cd4, 0x969d, 0x8ab5, 0x9cd2,
  0x8c64, 0x8a53, 0x9ccf, 0x97b6, 0x9cd1, 0x88d4, 0x9cd3, 0x9cca,
  0x9cd0, 0x9cd7, 0x8c63, 0x9ccb, 0x977c, 0x974a, 0x9cda, 0x9cde,
  0x919e, 0x97f7, 0x9cdf, 0x9cdc, 0x9cd9, 0x9cd8, 0x9cdd, 0x95ae,
  0x93b2, 0x8c65, 0x9ce0, 0x9cdb, 0x9ce1, 0x8c9b, 0x89af, 0x9ce9,
  0x8ab6, 0x9ce7, 0x9ce8, 0x8da7, 0x9ce6, 0x9ce4, 0x9ce3, 0x9cea,
  0x9ce2, 0x9cec, 0x89f9, 0x9cee, 0x9ced, 0x92a6, 0x9cf1, 0x9cef,
  0x9ce5, 0x8c9c, 0x9cf0, 0x9cf4, 0x9cf3, 0x9cf5, 0x9cf2, 0x9cf6,
  0x9cf7, 0x9cf8, 0x95e8, 0x9cfa, 0x9cf9, 0x8f5e, 0x90ac, 0x89e4,
  0x89fa, 0x9cfb, 0x88bd, 0x90ca, 0x9cfc, 0xe6c1, 0x9d40, 0x8c81,
  0x9d41, 0x90ed, 0x9d42, 0x9d43, 0x8b59, 0x9d44, 0x9d45, 0x9d46,
  0x91d5, 0x8ccb, 0x96df, 0x965b, 0x8f8a, 0x9d47, 0x90ee, 0xe7bb,
  0x94e0, 0x8ee8, 0x8dcb, 0x9d48, 0x91c5, 0x95a5, 0x91ef, 0x9d4b,
  0x9d49, 0x9d4c, 0x9d4a, 0x9d4d, 0x95af, 0x88b5, 0x957d, 0x94e1,
  0x9d4e, 0x9d51, 0x8fb3, 0x8b5a, 0x9d4f, 0x9d56, 0x8fb4, 0x9d50,
  0x9463, 0x977d, 0x9d52, 0x9d53, 0x9d57, 0x938a, 0x9d54, 0x8d52,
  0x90dc, 0x9d65, 0x94b2, 0x91f0, 0x94e2, 0x9dab, 0x95f8, 0x92ef,
  0x9695, 0x9d5a, 0x899f, 0x928a, 0x9d63, 0x9253, 0x9d5d, 0x9d64,
  0x9d5f, 0x9d66, 0x9d62, 0x9d61, 0x948f, 0x9d5b, 0x89fb, 0x9d59,
  0x8b91, 0x91f1, 0x9d55, 0x9d58, 0x8d53, 0x90d9, 0x8fb5, 0x9d60,
  0x9471, 0x8b92, 0x8a67, 0x8a87, 0x9040, 0x9d68, 0x9d6d, 0x9d69,
  0x8c9d, 0x9d6e, 0x8e41, 0x8d89, 0x8f45, 0x9d5c, 0x8e9d, 0x9d6b,
  0x8e77, 0x9d6c, 0x88c2, 0x9d67, 0x92a7, 0x8b93, 0x8bb2, 0x9d6a,
  0x88a5, 0x8dc1, 0x9055, 0x92f0, 0x94d2, 0x9d70, 0x917d, 0x91a8,
  0x8e4a, 0x9d71, 0x9d73, 0x9d6f, 0x95df, 0x92bb, 0x917b, 0x95f9,
  0x8ecc, 0x9d80, 0x9d7e, 0x9098, 0x8c9e, 0x9d78, 0x8fb7, 0x93e6,
  0x9450, 0x9d76, 0x917c, 0x8ef6, 0x9d7b, 0x8fb6, 0x9d75, 0x9d7a,
  0x9472, 0x9d74, 0x8c40, 0x8a7c, 0x9d7c, 0x97a9, 0x8dcc, 0x9254,
  0x9d79, 0x90da, 0x8d54, 0x9084, 0x8986, 0x915b, 0x9d77, 0x8b64,
  0x8c66, 0x92cd, 0x9d7d, 0x917e, 0x9d81, 0x9d83, 0x91b5, 0x9d89,
  0x9d84, 0x9d86, 0x9560, 0x92f1, 0x9d87, 0x974b, 0x9767, 0x8ab7,
  0x88ac, 0x9d85, 0x9d82, 0x8af6, 0x8987, 0x9d88, 0x9768, 0x9d8c,
  0x91b9, 0x9d93, 0x9d8d, 0x9d8a, 0x9d91, 0x9d72, 0x9d8e, 0x9d92,
  0x94c0, 0x938b, 0x9d8b, 0x9d8f, 0x8c67, 0x8def, 0x90db, 0x9d97,
  0x9345, 0x9d94, 0x9680, 0x9d95, 0x9d96, 0x96cc, 0x90a0, 0x8c82,
  0x9d9d, 0x8e54, 0x9d9a, 0x9d99, 0x9451, 0x93b3, 0x9350, 0x9d9b,
  0x9d9c, 0x958f, 0x9464, 0x8e42, 0x90ef, 0x966f, 0x8a68, 0x9da3,
  0x9d9e, 0x9769, 0x9da5, 0x9da1, 0x9da2, 0x9180, 0x9da0, 0x9d5e,
  0x9da4, 0x9d9f, 0x9da9, 0x9daa, 0x9346, 0x9dac, 0x8e43, 0x9da7,
  0x8b5b, 0x9dad, 0x9da6, 0x9db1, 0x9db0, 0x9daf, 0x9db2, 0x9db4,
  0x8fef, 0x9db3, 0x9db7, 0x9db5, 0x9db6, 0x9d90, 0x9db9, 0x9db8,
  0x9d98, 0x9dba, 0x9dae, 0x8e78, 0x9dbb, 0x9dbc, 0x9dbe, 0x9dbd,
  0x9dbf, 0x89fc, 0x8d55, 0x95fa, 0x90ad, 0x8ccc, 0x9dc1, 0x9dc4,
  0x9571, 0x8b7e, 0x9dc3, 0x9dc2, 0x9473, 0x9dc5, 0x8bb3, 0x9dc7,
  0x9dc6, 0x8ab8, 0x8e55, 0x93d6, 0x8c68, 0x9094, 0x9dc8, 0x90ae,
  0x9347, 0x957e, 0x9dc9, 0x9dca, 0x9dcb, 0x95b6, 0x9b7c, 0x90c4,
  0x956b, 0x8dd6, 0x94e3, 0x94c1, 0x936c, 0x97bf, 0x9dcd, 0x8ece,
  0x9dce, 0x88b4, 0x8bd2, 0x90cb, 0x9580, 0x9dcf, 0x8e61, 0x9266,
  0x8e7a, 0x9056, 0x9dd0, 0x95fb, 0x8997, 0x8e7b, 0x9dd3, 0x9dd1,
  0x9dd4, 0x97b7, 0x9dd2, 0x90f9, 0x9dd5, 0x91b0, 0x9dd6, 0x8af8,
  0x9dd8, 0x9dd7, 0x9dd9, 0x9dda, 0x8af9, 0x93fa, 0x9255, 0x8b8c,
  0x8e7c, 0x9181, 0x8f7b, 0x88ae, 0x9ddb, 0x89a0, 0x9ddf, 0x8d56,
  0x9dde, 0x8da9, 0x8fb8, 0x9ddd, 0x8fb9, 0x96be, 0x8da8, 0x88d5,
  0x90cc, 0x9de4, 0x90af, 0x8966, 0x8f74, 0x9686, 0x8df0, 0x8fba,
  0x90a5, 0x9de3, 0x9de1, 0x9de2, 0x928b, 0x9e45, 0x9de8, 0x8e9e,
  0x8d57, 0x9de6, 0x9de7, 0x9057, 0x9de5, 0x8e4e, 0x9dea, 0x9de9,
  0x9dee, 0x9def, 0x9deb, 0x8a41, 0x9dec, 0x9ded, 0x94d3, 0x9581,
  0x8c69, 0x9df0, 0x90b0, 0x8fbb, 0x9271, 0x8bc5, 0x9df1, 0x9df5,
  0x89c9, 0x9df2, 0x9df4, 0x9df3, 0x8f8b, 0x9267, 0x88c3, 0x9df6,
  0x9df7, 0x92a8, 0x97ef, 0x8e62, 0x95e9, 0x965c, 0x9e41, 0x9df9,
  0x9dfc, 0x9dfb, 0x9df8, 0x9e40, 0x93dc, 0x9dfa, 0x9e42, 0x8f8c,
  0x9e43, 0x976a, 0x9498, 0x9e44, 0x9e46, 0x9e47, 0x9e48, 0x8bc8,
  0x8967, 0x8d58, 0x9e49, 0x9e4a, 0x8f91, 0x9182, 0x99d6, 0x915d,
  0x915c, 0x91d6, 0x8dc5, 0x98f0, 0x8c8e, 0x974c, 0x95fc, 0x959e,
  0x9e4b, 0x8df1, 0x92bd, 0x9e4c, 0x984e, 0x965d, 0x92a9, 0x9e4d,
  0x8afa, 0x9e4e, 0x9e4f, 0x96d8, 0x96a2, 0x9696, 0x967b, 0x8e44,
  0x9e51, 0x8ee9, 0x9670, 0x9e53, 0x9e56, 0x9e55, 0x8af7, 0x8b80,
  0x9e52, 0x9e54, 0x9e57, 0x9099, 0x979b, 0x88c7, 0x8dde, 0x91ba,
  0x8edb, 0x8ff1, 0x9e5a, 0x936d, 0x9e58, 0x91a9, 0x9e59, 0x8ff0,
  0x96db, 0x9e5b, 0x9e5c, 0x9788, 0x9e61, 0x8d59, 0x9474, 0x9e5e,
  0x938c, 0x9ddc, 0x9de0, 0x8b6e, 0x9466, 0x9e60, 0x8fbc, 0x94c2,
  0x9e66, 0x94f8, 0x9e5d, 0x9e63, 0x9e62, 0x90cd, 0x968d, 0x97d1,
  0x9687, 0x89ca, 0x8e7d, 0x9867, 0x9e65, 0x9095, 0x9e64, 0x9e5f,
  0x8ccd, 0x9e6b, 0x9e69, 0x89cb, 0x9e67, 0x9e6d, 0x9e73, 0x91c6,
  0x95bf, 0x9e75, 0x9541, 0x9e74, 0x9490, 0x965e, 0x8ab9, 0x90f5,
  0x8f5f, 0x92d1, 0x974d, 0x9e70, 0x9e6f, 0x9e71, 0x9e6e, 0x9e76,
  0x9e6c, 0x9e6a, 0x9e72, 0x9e68, 0x928c, 0x96f6, 0x8ec4, 0x8df2,
  0x8db8, 0x968f, 0x8a60, 0x92cc, 0x93c8, 0x8968, 0x90f0, 0x90b2,
  0x8c49, 0x9e78, 0x8d5a, 0x8a9c, 0x9e7a, 0x8a94, 0x9e81, 0x9e7d,
  0x90f1, 0x8a6a, 0x8daa, 0x8a69, 0x8dcd, 0x9e7b, 0x8c85, 0x8c6a,
  0x938d, 0x9e79, 0x88c4, 0x9e7c, 0x9e7e, 0x8bcb, 0x8c4b, 0x8aba,
  0x8b6a, 0x9e82, 0x8df7, 0x9691, 0x8e56, 0x9e83, 0x954f, 0x9e8f,
  0x89b1, 0x9e84, 0x9e95, 0x9e85, 0x97c0, 0x9e8c, 0x947e, 0x9e94,
  0x9e87, 0x88b2, 0x9e89, 0x8d5b, 0x9e8b, 0x9e8a, 0x9e86, 0x9e91,
  0x8fbd, 0x9aeb, 0x8ce6, 0x979c, 0x9e88, 0x92f2, 0x8a42, 0x8dab,
  0x9e80, 0x9e90, 0x8a81, 0x9e8e, 0x9e92, 0x938e, 0x8afc, 0x9eb0,
  0x96c7, 0x9e97, 0x8afb, 0x9e9e, 0x965f, 0x9e9f, 0x9ea1, 0x9ea5,
  0x9e99, 0x9249, 0x938f, 0x9ea9, 0x9e9c, 0x9ea6, 0x9ea0, 0x9058,
  0x9eaa, 0x90b1, 0x9ea8, 0x8abb, 0x986f, 0x9e96, 0x9ea4, 0x88d6,
  0x9e98, 0x96b8, 0x9e9d, 0x9041, 0x92c5, 0x9e93, 0x9ea3, 0x909a,
  0x9ead, 0x8a91, 0x8c9f, 0x9eaf, 0x9e9a, 0x9eae, 0x9ea7, 0x9e9b,
  0x9eab, 0x9eac, 0x9ebd, 0x93cc, 0x9ea2, 0x9eb9, 0x9ebb, 0x92d6,
  0x976b, 0x9596, 0x9eb6, 0x91c8, 0x9ebc, 0x915e, 0x9eb3, 0x9ec0,
  0x9ebf, 0x93ed, 0x9ebe, 0x93e8, 0x9ec2, 0x9eb5, 0x8bc6, 0x9eb8,
  0x8f7c, 0x9480, 0x9eba, 0x8bc9, 0x9eb2, 0x9eb4, 0x9eb1, 0x984f,
  0x8a79, 0x9eb7, 0x9ec1, 0x8a54, 0x8de5, 0x897c, 0x9ed2, 0x9850,
  0x9ed5, 0x9059, 0x9ed4, 0x9ed3, 0x9ed0, 0x9ec4, 0x9ee1, 0x9ec3,
  0x9ed6, 0x9ece, 0x9ec9, 0x9ec6, 0x9ec7, 0x9ecf, 0xeaa0, 0x9ecc,
  0x8d5c, 0x92c6, 0x9184, 0x9eca, 0x9ec5, 0x9ec8, 0x976c, 0x968a,
  0x9ecd, 0x9ed7, 0x9edf, 0x9ed8, 0x9ee5, 0x9ee3, 0x9ede, 0x9edd,
  0x92ce, 0x9185, 0x9edb, 0x9ed9, 0x9ee0, 0x9ee6, 0x94f3, 0x9eec,
  0x9ee7, 0x9eea, 0x9ee4, 0x9294, 0x9557, 0x9eda, 0x9ee2, 0x8fbe,
  0x96cd, 0x9ef6, 0x9ee9, 0x8ca0, 0x89a1, 0x8a7e, 0x9ed1, 0x8fbf,
  0x9eee, 0x9ef5, 0x8ef7, 0x8a92, 0x924d, 0x9eeb, 0x9ef0, 0x9ef4,
  0x8bb4, 0x8b6b, 0x9ef2, 0x8b40, 0x93c9, 0x9ef1, 0x9ef3, 0x9eed,
  0x9eef, 0x8a80, 0x9268, 0x9efa, 0x9ef8, 0x8ce7, 0x9ef7, 0x9f40,
  0x9e77, 0x9ef9, 0x9efb, 0x9efc, 0x9f4b, 0x9f47, 0x9e8d, 0x9f46,
  0x9f45, 0x9f42, 0x9ee8, 0x9f44, 0x9f43, 0x9f49, 0x9845, 0x9f4c,
  0x8bf9, 0x9f48, 0x9f4a, 0x94a5, 0x9f4d, 0x9f51, 0x9f4e, 0x9793,
  0x9f4f, 0x9edc, 0x9f52, 0x9f53, 0x8954, 0x9f55, 0x8c87, 0x8e9f,
  0x8bd3, 0x89a2, 0x977e, 0x9f57, 0x9f56, 0x9f59, 0x8b5c, 0x8bd4,
  0x8abc, 0x9f5c, 0x9f5b, 0x9f5d, 0x89cc, 0x9256, 0x9f5e, 0x8abd,
  0x9f60, 0x9f5f, 0x9f61, 0x9f62, 0x9f63, 0x8e7e, 0x90b3, 0x8d9f,
  0x9590, 0x95e0, 0x9863, 0x8e95, 0x8dce, 0x97f0, 0x9f64, 0x9f65,
  0x8e80, 0x9f66, 0x9f67, 0x9f69, 0x9f68, 0x9677, 0x8f7d, 0x8eea,
  0x8e63, 0x9f6a, 0x9f6c, 0x9042, 0x9f6b, 0x9f6d, 0x9f6e, 0x9f6f,
  0x9f70, 0x9f71, 0x9f73, 0x9f72, 0x9f74, 0x89a3, 0x9269, 0x9f75,
  0x8e45, 0x8a6b, 0x9f76, 0x9361, 0x9aca, 0x8b42, 0x9f77, 0x9f78,
  0x95ea, 0x9688, 0x93c5, 0x9f79, 0x94e4, 0x94f9, 0x96d1, 0x9f7a,
  0x9f7c, 0x9f7b, 0x9f7e, 0x9f7d, 0x9f81, 0x8e81, 0x96af, 0x9f82,
  0x9f83, 0x8b43, 0x9f84, 0x9f86, 0x9f85, 0x9085, 0x9558, 0x8969,
  0x94c3, 0x92f3, 0x8f60, 0x8b81, 0x94c4, 0x8eac, 0x9f88, 0x8abe,
  0x8998, 0x93f0, 0x9f87, 0x8d5d, 0x9272, 0x9f89, 0x9f91, 0x9f8a,
  0x91bf, 0x8b82, 0x9f92, 0x8c88, 0x8b44, 0x9f90, 0x9f8e, 0x9f8b,
  0x9780, 0x92be, 0x93d7, 0x9f8c, 0x9f94, 0x9f93, 0x8c42, 0x89ab,
  0x8db9, 0x9f8d, 0x9f8f, 0x9676, 0x91f2, 0x9697, 0x9f9c, 0x9f9d,
  0x89cd, 0x95a6, 0x96fb, 0x9f9f, 0x8ea1, 0x8fc0, 0x9f98, 0x9f9e,
  0x8988, 0x8bb5, 0x9f95, 0x9f9a, 0x90f2, 0x9491, 0x94e5, 0x9f97,
  0x9640, 0x9f99, 0x9fa2, 0x9fa0, 0x9f9b, 0x9641, 0x9467, 0x8b83,
  0x9344, 0x928d, 0x9fa3, 0x9fa1, 0x91d7, 0x9f96, 0x896a, 0x976d,
  0x9fae, 0x9fad, 0x90f4, 0x9faa, 0x978c, 0x93b4, 0x9fa4, 0x92c3,
  0x896b, 0x8d5e, 0x9fa7, 0x8f46, 0x9fac, 0x9fab, 0x9fa6, 0x9fa9,
  0x8a88, 0x9fa8, 0x9468, 0x97ac, 0x8ff2, 0x90f3, 0x9fb4, 0x9fb2,
  0x956c, 0x9faf, 0x9fb1, 0x8959, 0x8d5f, 0x9851, 0x8a5c, 0x9582,
  0x9781, 0x8a43, 0x905a, 0x9fb3, 0x9fb8, 0x8fc1, 0x974f, 0x9fb5,
  0x9fb0, 0x9fb6, 0x97dc, 0x9393, 0x93c0, 0x8a55, 0x8974, 0x9fbc,
  0x9fbf, 0x97c1, 0x9784, 0x9fc6, 0x9fc0, 0x9fbd, 0x97d2, 0x9fc3,
  0x8f69, 0x9fc5, 0x9fca, 0x9391, 0x9fc8, 0x9fc2, 0x9257, 0x9fc9,
  0x9fbe, 0x9fc4, 0x9fcb, 0x88fa, 0x9fc1, 0x9fcc, 0x905b, 0x8f7e,
  0x95a3, 0x8dac, 0x9fb9, 0x9fc7, 0x9359, 0x90b4, 0x8a89, 0x8dcf,
  0x8fc2, 0x9fbb, 0x8f61, 0x8c6b, 0x9fba, 0x9fd0, 0x8f8d, 0x8cb8,
  0x9fdf, 0x9fd9, 0x8b94, 0x936e, 0x9fd4, 0x9fdd, 0x88ad, 0x8951,
  0x89b7, 0x9fd6, 0x91aa, 0x9fcd, 0x9fcf, 0x8d60, 0x9fe0, 0x9fdb,
  0x9fd3, 0x9fda, 0x96a9, 0x9fd8, 0x9fdc, 0x8cce, 0x8fc3, 0x9258,
  0x9fd2, 0x974e, 0x9fd5, 0x9fce, 0x9392, 0x9fd1, 0x9fd7, 0x9870,
  0x8ebc, 0x969e, 0x9fe1, 0x94ac, 0x9fed, 0x8cb9, 0x8f80, 0x9fe3,
  0x97ad, 0x8d61, 0x9ff0, 0x88ec, 0x9fee, 0x9fe2, 0x9fe8, 0x9fea,
  0x976e, 0x9fe5, 0x934d, 0x9fe7, 0x9fef, 0x9fe9, 0x96c5, 0x9fe4,
  0x8ea0, 0x9ffc, 0x8a8a, 0x9fe6, 0x9feb, 0x9fec, 0x91ea, 0x91d8,
  0x9ff4, 0x9ffa, 0x9ff8, 0x9348, 0xe042, 0x9ff5, 0x9ff6, 0x9fde,
  0x8b99, 0x9559, 0x8ebd, 0x8d97, 0x9852, 0x9ff2, 0xe041, 0x8989,
  0x9186, 0x9499, 0x8abf, 0x97f8, 0x969f, 0x92d0, 0x9ff9, 0x9ffb,
  0x9151, 0xe040, 0x9ff7, 0x9ff1, 0x8ac1, 0x8c89, 0xe04e, 0xe049,
  0x90f6, 0x8a83, 0x8f81, 0xe052, 0xe04b, 0x92aa, 0xe048, 0x92d7,
  0xe06b, 0xe045, 0xe044, 0xe04d, 0xe047, 0xe046, 0xe04c, 0x909f,
  0xe043, 0xe04f, 0xe050, 0x8ac0, 0xe055, 0xe054, 0xe056, 0xe059,
  0x9362, 0xe053, 0xe057, 0x8c83, 0x91f7, 0xe051, 0x945a, 0xe058,
  0xe05d, 0xe05b, 0xe05e, 0xe061, 0xe05a, 0x8d8a, 0x9447, 0x9fb7,
  0x9794, 0xe05c, 0xe060, 0x91f3, 0xe05f, 0xe04a, 0xe889, 0xe064,
  0xe068, 0xe066, 0xe062, 0xe063, 0xe067, 0xe065, 0x956d, 0xe06d,
  0xe06a, 0xe069, 0xe06c, 0x93d2, 0xe06e, 0x9295, 0x91eb, 0x90a3,
  0xe06f, 0xe071, 0xe070, 0x9ff3, 0xe072, 0x93e5, 0xe073, 0x89ce,
  0x9394, 0x8a44, 0x8b84, 0x8edc, 0x8dd0, 0x9846, 0x9086, 0x898a,
  0xe075, 0xe074, 0xe078, 0x9259, 0xe07b, 0xe076, 0xe07a, 0xe079,
  0x935f, 0x88d7, 0x97f3, 0xe07d, 0x8947, 0xe080, 0xe07e, 0xe07c,
  0xe077, 0x9642, 0xe082, 0xe081, 0x898b, 0xe084, 0x95b0, 0xe083,
  0x96b3, 0x8fc5, 0x9152, 0x8fc4, 0x97f9, 0xe08a, 0x90f7, 0xe086,
  0xe08b, 0x898c, 0xe089, 0x9481, 0xe085, 0xe088, 0x8fc6, 0x94cf,
  0xe08c, 0x8ecf, 0x90f8, 0xe08f, 0xe087, 0x8c46, 0xe08d, 0x976f,
  0xe090, 0xeaa4, 0x8f6e, 0xe091, 0xe092, 0x944d, 0xe094, 0xe095,
  0x9452, 0x9395, 0xe097, 0xe099, 0x97d3, 0xe096, 0xe098, 0x898d,
  0xe093, 0x9a7a, 0xe09a, 0x9187, 0x8e57, 0xe09c, 0xe09b, 0x9043,
  0x99d7, 0xe09d, 0xe09f, 0xe08e, 0xe09e, 0xe0a0, 0x949a, 0xe0a1,
  0xe0a2, 0xe0a3, 0xe0a4, 0x92dc, 0xe0a6, 0xe0a5, 0xe0a7, 0xe0a8,
  0x8edd, 0x9583, 0x96ea, 0xe0a9, 0xe0aa, 0x9175, 0x8ea2, 0xe0ab,
  0xe0ac, 0xe0ad, 0x95d0, 0x94c5, 0xe0ae, 0x9476, 0x92ab, 0xe0af,
  0x89e5, 0x8b8d, 0x96c4, 0x96b4, 0x89b2, 0x9853, 0x9671, 0x95a8,
  0x90b5, 0xe0b0, 0x93c1, 0x8ca1, 0xe0b1, 0x8dd2, 0xe0b3, 0xe0b2,
  0xe0b4, 0xe0b5, 0xe0b6, 0x8b5d, 0xe0b7, 0xe0b8, 0x8ca2, 0x94c6,
  0xe0ba, 0x8ff3, 0xe0b9, 0x8bb6, 0xe0bb, 0xe0bd, 0xe0bc, 0xe0be,
  0x8ccf, 0xe0bf, 0x8be7, 0x915f, 0x8d9d, 0xe0c1, 0xe0c2, 0xe0c0,
  0x8eeb, 0x93c6, 0x8bb7, 0xe0c4, 0x924b, 0xe0c3, 0x9854, 0x9482,
  0xe0c7, 0xe0c9, 0xe0c6, 0x96d2, 0xe0c8, 0xe0ca, 0x97c2, 0xe0ce,
  0xe0cd, 0x9296, 0x944c, 0x8ca3, 0xe0cc, 0xe0cb, 0x9750, 0x9751,
  0xe0cf, 0x898e, 0x8d96, 0x8e82, 0xe0d0, 0xe0d1, 0xe0d3, 0x8f62,
  0xe0d5, 0xe0d4, 0xe0d6, 0x8a6c, 0xe0d8, 0xe0d7, 0xe0da, 0xe0d9,
  0x8cba, 0x97a6, 0x8bca, 0x89a4, 0x8be8, 0x8adf, 0x97e6, 0xe0dc,
  0xe0de, 0xe0df, 0x89cf, 0xe0db, 0x8e58, 0x92bf, 0xe0dd, 0xe0e2,
  0x8eec, 0xe0e0, 0x8c5d, 0x94c7, 0xe0e1, 0xe0fc, 0xe0e7, 0x8cbb,
  0x8b85, 0xe0e4, 0x979d, 0x97ae, 0x91f4, 0xe0e6, 0xe0e8, 0x97d4,
  0x8bd5, 0x94fa, 0x9469, 0xe0e9, 0xe0eb, 0xe0ee, 0xe0ea, 0xe0ed,
  0x8ce8, 0x896c, 0xe0ef, 0x9090, 0xe0ec, 0x97da, 0xe0f2, 0xeaa2,
  0xe0f0, 0xe0f3, 0xe0e5, 0xe0f1, 0x8dba, 0xe0f4, 0xe0f5, 0x979e,
  0xe0f6, 0xe0f7, 0xe0e3, 0xe0f8, 0x8ac2, 0x8ea3, 0xe0f9, 0xe0fa,
  0xe0fb, 0x895a, 0xe140, 0x955a, 0xe141, 0x8aa2, 0xe142, 0xe143,
  0xe144, 0xe146, 0xe147, 0xe145, 0x9572, 0xe149, 0xe148, 0xe14b,
  0xe14a, 0xe14c, 0xe14d, 0xe14f, 0xe14e, 0x8d99, 0xe151, 0xe150,
  0x8ac3, 0x9072, 0x935b, 0xe152, 0x90b6, 0x8e59, 0x8999, 0xe153,
  0x9770, 0x95e1, 0xe154, 0x9363, 0x9752, 0x8d62, 0x905c, 0x926a,
  0x99b2, 0x92ac, 0x89e6, 0xe155, 0xe156, 0xe15b, 0xe159, 0xe158,
  0x9dc0, 0x8a45, 0xe157, 0x88d8, 0x94a8, 0x94c8, 0x97af, 0xe15c,
  0xe15a, 0x927b, 0x90a4, 0x94a9, 0x954c, 0xe15e, 0x97aa, 0x8c6c,
  0xe15f, 0xe15d, 0x94d4, 0xe160, 0xe161, 0x88d9, 0x8ff4, 0xe166,
  0xe163, 0x93eb, 0xe162, 0x8b45, 0xe169, 0xe164, 0xe165, 0xe168,
  0xe167, 0x9544, 0x9161, 0x9160, 0x8b5e, 0xe16a, 0xe16b, 0xe16c,
  0xe16e, 0xe16d, 0x8975, 0xe176, 0x94e6, 0xe170, 0xe172, 0xe174,
  0x905d, 0xe175, 0xe173, 0x8ebe, 0xe16f, 0xe171, 0x9561, 0x8fc7,
  0xe178, 0xe177, 0xe179, 0x8ea4, 0x8dad, 0x9397, 0xe17a, 0x92c9,
  0xe17c, 0x979f, 0xe17b, 0x9189, 0xe182, 0xe184, 0xe185, 0x9273,
  0xe183, 0xe180, 0xe17d, 0xe17e, 0xe181, 0xe188, 0xe186, 0xe187,
  0xe189, 0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18a, 0xe190, 0xe18f,
  0xe191, 0x97c3, 0xe194, 0xe192, 0xe193, 0x8ae0, 0x96fc, 0x95c8,
  0xe196, 0xe195, 0xe197, 0xe198, 0xe19c, 0xe199, 0xe19a, 0xe19b,
  0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe1a1, 0x94ad, 0x936f, 0xe1a2,
  0x9492, 0x9553, 0xe1a3, 0xe1a4, 0x9349, 0x8a46, 0x8d63, 0xe1a5,
  0xe1a6, 0xe1a7, 0x8e48, 0xe1a9, 0xe1a8, 0xe1aa, 0xe1ab, 0x94e7,
  0xe1ac, 0xe1ad, 0xea89, 0xe1ae, 0xe1af, 0xe1b0, 0x8e4d, 0xe1b1,
  0x9475, 0x967e, 0x896d, 0x8976, 0xe1b2, 0xe1b4, 0xe1b3, 0x9390,
  0x90b7, 0x9f58, 0xe1b5, 0x96bf, 0xe1b6, 0x8ac4, 0x94d5, 0xe1b7,
  0xe1b8, 0xe1b9, 0x96da, 0x96d3, 0x92bc, 0x918a, 0xe1bb, 0x8f82,
  0x8fc8, 0xe1be, 0xe1bd, 0xe1bc, 0x94fb, 0x8ac5, 0x8ca7, 0xe1c4,
  0xe1c1, 0x905e, 0x96b0, 0xe1c0, 0xe1c2, 0xe1c3, 0xe1bf, 0xe1c5,
  0xe1c6, 0x92ad, 0x8ae1, 0x9285, 0xe1c7, 0xe1c8, 0xe1cb, 0x9087,
  0x93c2, 0xe1cc, 0x9672, 0xe1c9, 0xe1ca, 0xe1cf, 0xe1ce, 0xe1cd,
  0xe1d1, 0xe1d0, 0xe1d2, 0xe1d4, 0xe1d3, 0x95cb, 0x8f75, 0x97c4,
  0xe1d5, 0x93b5, 0xe1d6, 0xe1d7, 0xe1db, 0xe1d9, 0xe1da, 0xe1d8,
  0xe1dc, 0xe1dd, 0xe1de, 0xe1df, 0x96b5, 0xe1e0, 0x96ee, 0xe1e1,
  0x926d, 0x948a, 0x8be9, 0x925a, 0xe1e2, 0x8bb8, 0x90ce, 0xe1e3,
  0x8dbb, 0xe1e4, 0xe1e5, 0x8ca4, 0x8dd3, 0xe1e7, 0x9375, 0x8dd4,
  0x8b6d, 0x9643, 0x946a, 0x9376, 0x8d7b, 0xe1e9, 0x8fc9, 0x97b0,
  0x8d64, 0x8ca5, 0x94a1, 0xe1eb, 0xe1ed, 0x8ce9, 0xe1ec, 0x92f4,
  0xe1ef, 0x8a56, 0xe1ea, 0x94e8, 0x894f, 0x8dea, 0x9871, 0xe1ee,
  0xe1f0, 0x95c9, 0x90d7, 0xe1f2, 0xe1f3, 0xe1f1, 0x8a6d, 0xe1f9,
  0xe1f8, 0x8ea5, 0xe1fa, 0xe1f5, 0xe1fb, 0xe1f6, 0x94d6, 0xe1f4,
  0xe1f7, 0xe241, 0xe240, 0x9681, 0xe1fc, 0x88e9, 0xe243, 0xe242,
  0x8fca, 0xe244, 0x9162, 0xe246, 0xe245, 0xe247, 0xe1e6, 0xe1e8,
  0xe249, 0xe248, 0x8ea6, 0x97e7, 0x8ed0, 0xe24a, 0x8c56, 0x8b5f,
  0x8b46, 0x8e83, 0x9753, 0xe250, 0xe24f, 0x9163, 0xe24c, 0xe24e,
  0x8f6a, 0x905f, 0xe24d, 0xe24b, 0x9449, 0x8fcb, 0x955b, 0x8dd5,
  0x9398, 0xe251, 0xe252, 0xe268, 0x8bd6, 0x985c, 0x9154, 0xe253,
  0x89d0, 0x92f5, 0x959f, 0xe254, 0x8b9a, 0xe255, 0xe257, 0xe258,
  0x9448, 0xe259, 0xe25a, 0xe25b, 0x8bd7, 0x89d1, 0x93c3, 0x8f47,
  0x8e84, 0xe25c, 0x8f48, 0x89c8, 0x9562, 0xe25d, 0x94e9, 0x9164,
  0xe260, 0xe261, 0x9489, 0x9060, 0xe25e, 0x9281, 0xe25f, 0x8fcc,
  0x88da, 0x8b48, 0xe262, 0x92f6, 0xe263, 0x90c5, 0x96ab, 0x9542,
  0xe264, 0xe265, 0x9274, 0x97c5, 0xe267, 0xe266, 0x8eed, 0xe269,
  0x88ee, 0xe26c, 0xe26a, 0x89d2, 0x8c6d, 0xe26b, 0x8d65, 0x8d92,
  0x95e4, 0xe26d, 0x9673, 0xe26f, 0x90cf, 0x896e, 0x89b8, 0x88aa,
  0xe26e, 0xe270, 0xe271, 0x8ff5, 0xe272, 0x8a6e, 0xe274, 0x8c8a,
  0x8b86, 0xe275, 0x8bf3, 0xe276, 0x90fa, 0x93cb, 0x90de, 0x8df3,
  0xe277, 0x9282, 0x918b, 0xe279, 0xe27b, 0xe278, 0xe27a, 0x8c41,
  0xe27c, 0x8c45, 0x8b87, 0x9771, 0xe27e, 0xe280, 0x894d, 0xe283,
  0x8a96, 0xe282, 0xe281, 0xe285, 0xe27d, 0xe286, 0x97a7, 0xe287,
  0xe288, 0x9af2, 0xe28a, 0xe289, 0xe28b, 0xe28c, 0x97b3, 0xe28d,
  0xe8ed, 0x8fcd, 0xe28e, 0xe28f, 0x8f76, 0x93b6, 0xe290, 0x9247,
  0xe291, 0x925b, 0xe292, 0x8ba3, 0x995e, 0x927c, 0x8eb1, 0x8ac6,
  0xe293, 0xe2a0, 0xe296, 0x8b88, 0xe295, 0xe2a2, 0xe294, 0x8fce,
  0xe298, 0xe299, 0x934a, 0xe29a, 0x8a7d, 0x9079, 0x9584, 0xe29c,
  0x91e6, 0xe297, 0xe29b, 0xe29d, 0x8df9, 0xe2a4, 0x954d, 0x94a4,
  0x9399, 0x8bd8, 0xe2a3, 0xe2a1, 0x94b3, 0xe29e, 0x927d, 0x939b,
  0x939a, 0x8df4, 0xe2b6, 0xe2a6, 0xe2a8, 0xe2ab, 0xe2ac, 0xe2a9,
  0xe2aa, 0xe2a7, 0xe2a5, 0xe29f, 0x95cd, 0x89d3, 0xe2b3, 0xe2b0,
  0xe2b5, 0xe2b4, 0x9493, 0x96a5, 0x8e5a, 0xe2ae, 0xe2b7, 0xe2b2,
  0xe2b1, 0xe2ad, 0xe2af, 0x8ac7, 0x925c, 0x90fb, 0x94a0, 0xe2bc,
  0x94a2, 0x90df, 0xe2b9, 0x94cd, 0xe2bd, 0x95d1, 0x927a, 0xe2b8,
  0xe2ba, 0xe2bb, 0xe2be, 0x8ec2, 0x93c4, 0xe2c3, 0xe2c2, 0xe2bf,
  0x9855, 0xe2c8, 0xe2cc, 0xe2c9, 0xe2c5, 0xe2c6, 0xe2cb, 0xe2c0,
  0x99d3, 0xe2c7, 0xe2c1, 0xe2ca, 0xe2d0, 0x8ac8, 0xe2cd, 0xe2ce,
  0xe2cf, 0xe2d2, 0xe2d1, 0x94f4, 0xe2d3, 0x97fa, 0x95eb, 0xe2d8,
  0xe2d5, 0xe2d4, 0x90d0, 0xe2d7, 0xe2d9, 0xe2d6, 0xe2dd, 0xe2da,
  0xe2db, 0xe2c4, 0xe2dc, 0xe2de, 0xe2df, 0x95c4, 0xe2e0, 0x96e0,
  0x8bcc, 0x8c48, 0xe2e1, 0x95b2, 0x9088, 0x96ae, 0xe2e2, 0x97b1,
  0x9494, 0x9165, 0x9453, 0x8f6c, 0x88be, 0xe2e7, 0xe2e5, 0xe2e3,
  0x8a9f, 0x8fcf, 0xe2e8, 0xe2e6, 0xe2e4, 0xe2ec, 0xe2eb, 0xe2ea,
  0xe2e9, 0xe2ed, 0xe2ee, 0x90b8, 0xe2ef, 0xe2f1, 0xe2f0, 0x8cd0,
  0x9157, 0xe2f3, 0x939c, 0xe2f2, 0xe2f4, 0x95b3, 0x918c, 0x8d66,
  0xe2f5, 0x97c6, 0xe2f7, 0xe2f8, 0xe2f9, 0xe2fa, 0x8e85, 0xe2fb,
  0x8c6e, 0x8b8a, 0x8b49, 0xe340, 0x96f1, 0x8d67, 0xe2fc, 0xe343,
  0x96e4, 0x945b, 0x9552, 0x8f83, 0xe342, 0x8ed1, 0x8d68, 0x8e86,
  0x8b89, 0x95b4, 0xe341, 0x9166, 0x9661, 0x8df5, 0x8e87, 0x92db,
  0xe346, 0x97dd, 0x8dd7, 0xe347, 0x9061, 0xe349, 0x8fd0, 0x8dae,
  0xe348, 0x8f49, 0x8cbc, 0x9167, 0xe344, 0xe34a, 0xe345, 0x8c6f,
  0xe34d, 0xe351, 0x8c8b, 0xe34c, 0xe355, 0x8d69, 0x978d, 0x88ba,
  0xe352, 0x8b8b, 0xe34f, 0xe350, 0x939d, 0xe34e, 0xe34b, 0x8a47,
  0x90e2, 0x8ca6, 0xe357, 0xe354, 0xe356, 0xe353, 0x8c70, 0x91b1,
  0xe358, 0x918e, 0xe365, 0xe361, 0xe35b, 0xe35f, 0x8ef8, 0x88db,
  0xe35a, 0xe362, 0xe366, 0x8d6a, 0x96d4, 0x92d4, 0xe35c, 0xe364,
  0xe359, 0x925d, 0xe35e, 0x88bb, 0x96c8, 0xe35d, 0x8bd9, 0x94ea,
  0x918d, 0x97ce, 0x8f8f, 0xe38e, 0xe367, 0x90fc, 0xe363, 0xe368,
  0xe36a, 0x92f7, 0xe36d, 0xe369, 0x95d2, 0x8ac9, 0x96c9, 0x88dc,
  0xe36c, 0x97fb, 0xe36b, 0x898f, 0x93ea, 0xe36e, 0xe375, 0xe36f,
  0xe376, 0xe372, 0x949b, 0x8ec8, 0xe374, 0xe371, 0xe377, 0xe370,
  0x8f63, 0x9644, 0x8f6b, 0xe373, 0xe380, 0xe37b, 0xe37e, 0xe37c,
  0xe381, 0xe37a, 0xe360, 0x90d1, 0x94c9, 0xe37d, 0xe378, 0x9140,
  0x8c71, 0x8f4a, 0x9044, 0x9155, 0xe384, 0xe386, 0xe387, 0xe383,
  0xe385, 0xe379, 0xe382, 0xe38a, 0xe389, 0x969a, 0x8c4a, 0xe388,
  0xe38c, 0xe38b, 0xe38f, 0xe391, 0x8e5b, 0xe38d, 0xe392, 0xe393,
  0xe394, 0xe39a, 0x935a, 0xe396, 0xe395, 0xe397, 0xe398, 0xe399,
  0xe39b, 0xe39c, 0x8aca, 0xe39d, 0xe39e, 0xe39f, 0xe3a0, 0xe3a1,
  0xe3a2, 0xe3a3, 0xe3a4, 0xe3a6, 0xe3a5, 0xe3a7, 0xe3a8, 0xe3a9,
  0xe3ac, 0xe3aa, 0xe3ab, 0x8ddf, 0x8c72, 0x9275, 0x94b1, 0x8f90,
  0x946c, 0x94eb, 0xe3ad, 0x9ceb, 0xe3ae, 0xe3b0, 0x9785, 0xe3af,
  0xe3b2, 0xe3b1, 0x9772, 0xe3b3, 0x94fc, 0xe3b4, 0xe3b7, 0xe3b6,
  0xe3b5, 0xe3b8, 0x8c51, 0x9141, 0x8b60, 0xe3bc, 0xe3b9, 0xe3ba,
  0xe3bd, 0xe3be, 0xe3bb, 0x8948, 0x89a5, 0xe3c0, 0xe3c1, 0xe3c2,
  0x9782, 0x8f4b, 0xe3c4, 0xe3c3, 0x9089, 0xe3c5, 0xe3c6, 0xe3c7,
  0x8ae3, 0x8acb, 0xe3c8, 0xe3c9, 0x967c, 0x9783, 0x9773, 0x9856,
  0x8d6c, 0xe3cc, 0x8ed2, 0xe3cb, 0xe3cd, 0x8ea7, 0x91cf, 0xe3ce,
  0x8d6b, 0x96d5, 0xe3cf, 0xe3d0, 0xe3d1, 0xe3d2, 0xe3d3, 0x8ea8,
  0x96eb, 0xe3d5, 0x925e, 0xe3d4, 0xe3d7, 0xe3d6, 0xe3d8, 0x90b9,
  0xe3d9, 0xe3da, 0x95b7, 0xe3db, 0x918f, 0xe3dc, 0xe3dd, 0x97fc,
  0xe3e0, 0xe3df, 0xe3de, 0x92ae, 0xe3e1, 0x9045, 0xe3e2, 0xe3e3,
  0x9857, 0xe3e4, 0xe3e5, 0xe3e7, 0xe3e6, 0x94a3, 0x93f7, 0x985d,
  0x94a7, 0xe3e9, 0x8fd1, 0x9549, 0xe3ea, 0xe3e8, 0x8acc, 0x8cd2,
  0x8e88, 0x94ec, 0x8ca8, 0x9662, 0xe3ed, 0xe3eb, 0x8d6d, 0x8d6e,
  0x88e7, 0x8de6, 0x9478, 0x88dd, 0xe3f2, 0x925f, 0x9477, 0x91d9,
  0xe3f4, 0xe3f0, 0xe3f3, 0xe3ee, 0xe3f1, 0x9645, 0x8cd3, 0x88fb,
  0xe3ef, 0xe3f6, 0xe3f7, 0x93b7, 0x8bb9, 0xe445, 0x945c, 0x8e89,
  0x8bba, 0x90c6, 0x9865, 0x96ac, 0xe3f5, 0x90d2, 0x8b72, 0xe3f8,
  0xe3fa, 0xe3f9, 0xe3fb, 0x9245, 0x945d, 0x92af, 0xe442, 0xe441,
  0xe3fc, 0x9074, 0x9585, 0xe444, 0xe443, 0x8d6f, 0x9872, 0xe454,
  0xe448, 0xe449, 0x8eee, 0xe447, 0x8d98, 0xe446, 0xe44a, 0x92b0,
  0x95a0, 0x9142, 0x91da, 0xe44e, 0xe44f, 0xe44b, 0xe44c, 0xe44d,
  0x8d70, 0xe455, 0xe451, 0x9586, 0x968c, 0x9547, 0xe450, 0xe453,
  0xe452, 0x9663, 0xe456, 0xe457, 0x9156, 0xe458, 0xe45a, 0xe45e,
  0xe45b, 0xe459, 0x945e, 0xe45c, 0xe45d, 0x89b0, 0xe464, 0xe45f,
  0xe460, 0xe461, 0x919f, 0xe463, 0xe462, 0xe465, 0xe466, 0xe467,
  0x9062, 0x89e7, 0xe468, 0x97d5, 0x8ea9, 0x8f4c, 0x8e8a, 0x9276,
  0xe469, 0xe46a, 0x8950, 0xe46b, 0xe46c, 0xe46d, 0xe46e, 0xe46f,
  0x8bbb, 0x9da8, 0xe470, 0x90e3, 0xe471, 0x8ec9, 0xe472, 0x98ae,
  0xe473, 0x95dc, 0x8ada, 0x9143, 0x8f77, 0x9591, 0x8f4d, 0xe474,
  0x8d71, 0xe475, 0x94ca, 0xe484, 0xe477, 0x91c7, 0x9495, 0x8cbd,
  0xe476, 0x9144, 0xe478, 0x92f8, 0xe47a, 0xe479, 0xe47c, 0xe47b,
  0xe47d, 0xe480, 0xe47e, 0x8acd, 0xe481, 0xe482, 0xe483, 0x8daf,
  0x97c7, 0xe485, 0x9046, 0x8990, 0xe486, 0xe487, 0xe488, 0x88f0,
  0xe489, 0xe48a, 0x9587, 0x8ec5, 0xe48c, 0x8a48, 0x88b0, 0xe48b,
  0xe48e, 0x946d, 0x9063, 0x89d4, 0x9646, 0x8c7c, 0x8bda, 0xe48d,
  0x89e8, 0x8aa1, 0x8991, 0xe492, 0x97e8, 0x91db, 0x9563, 0xe49e,
  0x89d5, 0xe49c, 0xe49a, 0xe491, 0xe48f, 0xe490, 0x8ee1, 0x8bea,
  0x9297, 0x93cf, 0x8970, 0xe494, 0xe493, 0xe499, 0xe495, 0xe498,
  0x96ce, 0xe497, 0x89d6, 0x8a9d, 0xe49b, 0xe49d, 0x8c73, 0xe4a1,
  0xe4aa, 0xe4ab, 0x88a9, 0xe4b2, 0x88ef, 0xe4a9, 0xe4a8, 0xe4a3,
  0xe4a2, 0xe4a0, 0xe49f, 0x9283, 0x91f9, 0xe4a5, 0xe4a4, 0xe4a7,
  0x9190, 0x8c74, 0x8960, 0xe4a6, 0x8d72, 0x9191, 0xe4b8, 0xe4b9,
  0x89d7, 0x89ac, 0xe4b6, 0xe4ac, 0xe4b4, 0xe4bb, 0xe4b5, 0xe4b3,
  0xe496, 0xe4b1, 0xe4ad, 0x8ace, 0xe4af, 0xe4ba, 0xe4b0, 0xe4bc,
  0xe4ae, 0x949c, 0x9789, 0xe4b7, 0xe4cd, 0xe4c5, 0x909b, 0x8b65,
  0x8bdb, 0xe4c0, 0x89d9, 0x8fd2, 0xe4c3, 0x8dd8, 0x9370, 0xe4c8,
  0x95ec, 0xe4bf, 0x89d8, 0x8cd4, 0x9548, 0xe4c9, 0xe4bd, 0xe4c6,
  0xe4d0, 0xe4c1, 0xe4c2, 0x93b8, 0xe4c7, 0xe4c4, 0x9647, 0xe4ca,
  0x88de, 0xe4be, 0xe4cc, 0xe4cb, 0x948b, 0xe4d2, 0xe4dd, 0x8a9e,
  0xe4e0, 0xe4ce, 0xe4d3, 0x978e, 0xe4dc, 0x9774, 0x97a8, 0x9298,
  0x8a8b, 0x9592, 0xe4e2, 0x939f, 0x88af, 0xe4db, 0xe4d7, 0x9192,
  0xe4d1, 0xe4d9, 0xe4de, 0x944b, 0x88a8, 0xe4d6, 0xe4df, 0x9598,
  0xe4da, 0xe4d5, 0x8fd3, 0x8f4e, 0x8eaa, 0x96d6, 0x9566, 0xe4e5,
  0xe4ee, 0xe4d8, 0x8a97, 0x8ff6, 0xe4e3, 0xe4e8, 0x9193, 0xe4e4,
  0xe4eb, 0x927e, 0xe4ec, 0x9775, 0xe4e1, 0x8a57, 0xe4e7, 0xe4ea,
  0x96aa, 0xe4ed, 0xe4e6, 0xe4e9, 0x9648, 0x9840, 0xe4f1, 0xe4f8,
  0xe4f0, 0x8ec1, 0xe4cf, 0x95cc, 0x96a0, 0xe4f7, 0xe4f6, 0xe4f2,
  0xe4f3, 0x8955, 0xe4f5, 0xe4ef, 0x92d3, 0xe4f4, 0x88fc, 0x91a0,
  0x95c1, 0xe4f9, 0xe540, 0x94d7, 0xe4fc, 0x8fd4, 0x8ec7, 0xe542,
  0x8bbc, 0xe543, 0x9599, 0xe4fb, 0xe4d4, 0xe4fa, 0x986e, 0x93a0,
  0x9593, 0xe54a, 0xe550, 0xe551, 0xe544, 0x9496, 0xe54e, 0xe546,
  0xe548, 0xe552, 0xe547, 0xe54b, 0x8992, 0x93e3, 0xe54c, 0xe54f,
  0xe545, 0x9145, 0xe549, 0x8e46, 0x9064, 0x8c4f, 0x96f2, 0x96f7,
  0x8f92, 0xe556, 0xe554, 0x986d, 0xe553, 0x9795, 0xe555, 0xe557,
  0xe558, 0xe55b, 0xe559, 0x93a1, 0xe55a, 0x94cb, 0xe54d, 0x8f93,
  0xe55c, 0xe561, 0x9194, 0xe560, 0xe541, 0xe562, 0x9168, 0xe55d,
  0xe55f, 0xe55e, 0x9f50, 0x9f41, 0xe564, 0xe563, 0x9796, 0xe1ba,
  0xe565, 0xe566, 0xe567, 0x8cd5, 0x8b73, 0xe569, 0x997c, 0x8b95,
  0x97b8, 0x8bf1, 0xe56a, 0xe56b, 0x928e, 0xe56c, 0x93f8, 0x88b8,
  0x89e1, 0xe571, 0xe572, 0xe56d, 0x8e5c, 0xe56e, 0x9461, 0xe56f,
  0xe570, 0xe57a, 0xe574, 0xe577, 0xe573, 0xe575, 0xe576, 0x8ed6,
  0xe578, 0x9260, 0x8c75, 0x8a61, 0xe57b, 0x8a5e, 0xe581, 0xe57c,
  0xe580, 0x94b8, 0xe57d, 0xe57e, 0x9567, 0x94d8, 0xe582, 0x91fb,
  0xe58c, 0xe588, 0x89e9, 0xe586, 0x9649, 0xe587, 0xe584, 0xe585,
  0xe58a, 0xe58d, 0xe58b, 0xe589, 0xe583, 0x9277, 0xe594, 0x96a8,
  0xe592, 0xe593, 0xe58e, 0xe590, 0xe591, 0xe58f, 0x90e4, 0x9858,
  0xe598, 0xe599, 0xe59f, 0x9049, 0xe59b, 0xe59e, 0xe596, 0xe595,
  0xe5a0, 0x89da, 0xe59c, 0xe5a1, 0xe59d, 0xe59a, 0x92b1, 0xe597,
  0x9488, 0xe5a5, 0x975a, 0xe5a4, 0xe5a3, 0xe5ac, 0xe5a6, 0xe5ae,
  0x9786, 0xe5b1, 0xe5a8, 0xe5a9, 0xe5ad, 0xe5b0, 0xe5af, 0xe5a7,
  0xe5aa, 0xe5bb, 0xe5b4, 0xe5b2, 0xe5b3, 0xe5b8, 0xe5b9, 0x8a49,
  0x8b61, 0xe5b7, 0xe5a2, 0xe5b6, 0xe5ba, 0xe5b5, 0xe5bc, 0xe5be,
  0xe5bd, 0xe5c0, 0xe5bf, 0xe579, 0xe5c4, 0xe5c1, 0xe5c2, 0xe5c3,
  0xe5c5, 0x8c8c, 0xe5c7, 0xe5c6, 0x8f4f, 0x8d73, 0x9fa5, 0xe5c8,
  0x8f70, 0x8a58, 0xe5c9, 0x8971, 0x8fd5, 0xe5ca, 0x8d74, 0xe5cb,
  0x88df, 0x955c, 0xe5cc, 0x908a, 0xe5d3, 0xe5d0, 0x928f, 0xe5d1,
  0xe5ce, 0x8bdc, 0xe5cd, 0xe5d4, 0x8c55, 0x91dc, 0xe5da, 0xe5d6,
  0x91b3, 0xe5d5, 0xe5d8, 0xe5cf, 0xe5d9, 0xe5db, 0x94ed, 0xe5d7,
  0xe5dc, 0xe5de, 0x8cd1, 0xe5d2, 0x88bf, 0xe5dd, 0x8dd9, 0x97f4,
  0xe5df, 0xe5e0, 0x9195, 0x97a0, 0xe5e1, 0x9754, 0xe5e2, 0xe5e3,
  0x95e2, 0xe5e4, 0x8dbe, 0x97a1, 0xe5e9, 0xe5ea, 0x8fd6, 0xe5e8,
  0x9787, 0xe5e5, 0xe5e7, 0x90bb, 0x909e, 0xe5e6, 0xe5eb, 0x95a1,
  0xe5ed, 0xe5ec, 0x8a8c, 0x964a, 0xe5ee, 0xe5fa, 0xe5f0, 0xe5f1,
  0xe5f2, 0xe5f3, 0xe5f7, 0xe5f8, 0xe5f6, 0xe5f4, 0xe5ef, 0xe5f5,
  0xe5f9, 0xe8b5, 0x89a6, 0xe5fc, 0x8bdd, 0xe5fb, 0xe641, 0xe640,
  0xe643, 0xe642, 0xe644, 0x8f50, 0xe645, 0xe646, 0xe647, 0x90bc,
  0x9776, 0xe648, 0x95a2, 0x9465, 0xe649, 0xe64a, 0x8ca9, 0x8b4b,
  0xe64b, 0x8e8b, 0x9460, 0xe64c, 0x8a6f, 0xe64d, 0xe64f, 0x9797,
  0xe64e, 0x9065, 0xe650, 0xe651, 0xe652, 0x8acf, 0xe653, 0xe654,
  0xe655, 0xe656, 0x8a70, 0xe657, 0xe658, 0xe659, 0x89f0, 0x9047,
  0xe65a, 0xe65b, 0xe65c, 0x8cbe, 0x92f9, 0xe65d, 0x8c76, 0x9075,
  0xe660, 0x93a2, 0xe65f, 0x8c50, 0xe65e, 0x91f5, 0x8b4c, 0xe661,
  0xe662, 0x8fd7, 0x8c8d, 0xe663, 0x964b, 0x90dd, 0x8b96, 0x96f3,
  0x9169, 0xe664, 0x9066, 0x9290, 0x8fd8, 0xe665, 0xe668, 0xe669,
  0x8dbc, 0x91c0, 0xe667, 0x8fd9, 0x955d, 0xe666, 0x8e8c, 0x8972,
  0xe66d, 0x8c77, 0x8e8e, 0x8e8d, 0x986c, 0xe66c, 0xe66b, 0x9146,
  0x8b6c, 0x9862, 0x8a59, 0x8fda, 0xe66a, 0xe66f, 0xe670, 0xe66e,
  0x8cd6, 0x975f, 0x8e8f, 0x9446, 0xe673, 0x90be, 0x9261, 0x9755,
  0xe676, 0x8cea, 0x90bd, 0xe672, 0xe677, 0x8ceb, 0xe674, 0xe675,
  0xe671, 0x90e0, 0x93c7, 0x924e, 0x89db, 0x94ee, 0x8b62, 0x92b2,
  0xe67a, 0xe678, 0x926b, 0x90bf, 0x8ad0, 0xe679, 0x907a, 0x97c8,
  0x985f, 0xe67b, 0xe687, 0x92b3, 0xe686, 0xe683, 0xe68b, 0xe684,
  0xe680, 0x92fa, 0xe67e, 0xe67c, 0x9740, 0x8e90, 0xe681, 0xe67d,
  0xe685, 0x8f94, 0x8cbf, 0x91f8, 0x9664, 0x8979, 0x88e0, 0x93a3,
  0xe689, 0xe688, 0x93e4, 0xe68d, 0xe682, 0xe68c, 0xe68e, 0x8caa,
  0xe68a, 0x8d75, 0x8ed3, 0xe68f, 0x9777, 0xe692, 0xe695, 0xe693,
  0x9554, 0xe690, 0x8bde, 0xe694, 0xe696, 0xe69a, 0xe697, 0xe699,
  0xe698, 0xe69b, 0x8eaf, 0xe69d, 0xe69c, 0x9588, 0xe69f, 0x8c78,
  0xe69e, 0xe6a0, 0xe6a1, 0x8b63, 0xe3bf, 0x8ff7, 0xe6a2, 0x8cec,
  0xe6a3, 0xe6a4, 0x8e5d, 0x9dcc, 0xe6a5, 0xe6a6, 0x8f51, 0xe6a7,
  0xe6a8, 0xe6a9, 0xe6aa, 0xe6ab, 0x924a, 0xe6ac, 0xe6ae, 0xe6ad,
  0x93a4, 0xe6af, 0x964c, 0xe6b0, 0xe6b1, 0xe6b2, 0xe6b3, 0x93d8,
  0x8fdb, 0xe6b4, 0x8d8b, 0x98ac, 0xe6b5, 0xe6b6, 0x955e, 0xe6b7,
  0xe6bf, 0xe6b8, 0xe6ba, 0xe6b9, 0xe6bb, 0x9665, 0xe6bc, 0xe6bd,
  0xe6be, 0xe6c0, 0x8a4c, 0x92e5, 0x9589, 0x8de0, 0x8d76, 0x956e,
  0x89dd, 0x94cc, 0xe6c3, 0x8ad1, 0x90d3, 0xe6c2, 0xe6c7, 0x9299,
  0x96e1, 0xe6c5, 0xe6c6, 0x8b4d, 0xe6c8, 0x9483, 0x91dd, 0x94ef,
  0x935c, 0xe6c4, 0x9666, 0x89ea, 0xe6ca, 0x9847, 0x92c0, 0x9864,
  0x8e91, 0xe6c9, 0x91af, 0xe6da, 0x9147, 0x93f6, 0x956f, 0xe6cd,
  0x8e5e, 0x8e92, 0x8fdc, 0x9485, 0x8cab, 0xe6cc, 0xe6cb, 0x958a,
  0x8ebf, 0x9371, 0xe6cf, 0xe6d0, 0x8d77, 0xe6ce, 0xe6d1, 0xe6d2,
  0xe6d4, 0x91a1, 0xe6d3, 0x8ae4, 0xe6d6, 0xe6d5, 0xe6d7, 0xe6d9,
  0xe6db, 0xe6dc, 0x90d4, 0x8ecd, 0xe6dd, 0x8a71, 0xe6de, 0x9196,
  0xe6df, 0xe6e0, 0x958b, 0x8b4e, 0xe6e1, 0x92b4, 0x897a, 0xe6e2,
  0x8eef, 0x9096, 0x91ab, 0xe6e5, 0xe6e4, 0xe6e3, 0xe6eb, 0xe6e9,
  0xe6e6, 0xe6e8, 0xe6e7, 0xe6ea, 0x8b97, 0xe6ee, 0x90d5, 0xe6ef,
  0x8cd7, 0xe6ec, 0xe6ed, 0x9848, 0x92b5, 0x9148, 0xe6f0, 0xe6f3,
  0xe6f1, 0xe6f2, 0x9778, 0x93a5, 0xe6f6, 0xe6f4, 0xe6f5, 0xe6f7,
  0xe748, 0xe6fa, 0xe6fb, 0xe6f9, 0xe6f8, 0x92fb, 0xe740, 0xe744,
  0xe741, 0xe6fc, 0xe742, 0xe743, 0xe74a, 0xe745, 0x90d6, 0xe747,
  0xe749, 0xe746, 0xe74c, 0x8f52, 0xe74b, 0xe74d, 0xe74e, 0xe751,
  0xe750, 0xe74f, 0xe753, 0xe752, 0x96f4, 0xe755, 0xe754, 0xe756,
  0xe757, 0xe759, 0xe758, 0x9067, 0xe75a, 0x8beb, 0xe75b, 0xe75d,
  0xe75e, 0xe75f, 0xe75c, 0xe760, 0x8ed4, 0xe761, 0x8b4f, 0x8c52,
  0x8cac, 0xe762, 0x93ee, 0x935d, 0xe763, 0xe766, 0x8eb2, 0xe765,
  0xe764, 0x8c79, 0xe767, 0x8a72, 0xe769, 0x8dda, 0xe768, 0xe771,
  0xe76b, 0xe76d, 0x95e3, 0xe76a, 0xe76c, 0xe770, 0xe76e, 0x8b50,
  0xe76f, 0xe772, 0x9479, 0x97d6, 0x8f53, 0xe773, 0x9741, 0xe775,
  0xe774, 0xe778, 0x9760, 0xe777, 0x8a8d, 0xe776, 0xe77b, 0xe77a,
  0xe779, 0x9351, 0xe77c, 0xe77d, 0xe77e, 0x8d8c, 0x8c44, 0xe780,
  0xe781, 0xe782, 0x9068, 0xe783, 0x8eab, 0xe784, 0xe785, 0x999f,
  0x999e, 0xe786, 0xe390, 0xe787, 0x9243, 0x904a, 0x945f, 0xe788,
  0x95d3, 0x92d2, 0x8d9e, 0x9248, 0x8949, 0x9698, 0x9076, 0x8c7d,
  0x8bdf, 0x95d4, 0xe789, 0xe78b, 0xe78a, 0x89de, 0x93f4, 0xe78c,
  0x9497, 0x9352, 0xe78d, 0x8f71, 0xe78f, 0x96c0, 0xe79e, 0xe791,
  0xe792, 0x92c7, 0x91de, 0x9197, 0x93a6, 0xe790, 0x8b74, 0xe799,
  0xe796, 0xe7a3, 0x93a7, 0x9280, 0xe793, 0x92fc, 0x9372, 0xe794,
  0xe798, 0x9080, 0x9487, 0x92ca, 0x90c0, 0xe797, 0x91ac, 0x91a2,
  0xe795, 0x88a7, 0x9841, 0xe79a, 0x91df, 0x8f54, 0x9069, 0xe79c,
  0xe79b, 0x88ed, 0xe79d, 0x954e, 0xe7a5, 0x93d9, 0x908b, 0x9278,
  0x8bf6, 0xe7a4, 0x9756, 0x895e, 0x95d5, 0x89df, 0xe79f, 0xe7a0,
  0xe7a1, 0xe7a2, 0x93b9, 0x9242, 0x88e1, 0xe7a6, 0xe7a7, 0xeaa1,
  0x91bb, 0xe7a8, 0x8993, 0x916b, 0x8cad, 0x9779, 0xe7a9, 0x934b,
  0x9198, 0x8ed5, 0xe7aa, 0xe7ad, 0x8f85, 0xe7ab, 0x914a, 0x9149,
  0x88e2, 0x97c9, 0xe7af, 0x94f0, 0xe7b1, 0xe7b0, 0xe7ae, 0xe284,
  0x8ad2, 0xe78e, 0xe7b3, 0xe7b2, 0xe7b4, 0x9757, 0x93df, 0x964d,
  0xe7b5, 0x8ed7, 0xe7b6, 0xe7b7, 0xe7b8, 0x9340, 0x88e8, 0x8d78,
  0x9859, 0xe7bc, 0x8c53, 0xe7b9, 0xe7ba, 0x9594, 0x8a73, 0x9758,
  0x8bbd, 0x9373, 0xe7bd, 0xe7be, 0xe7bf, 0x9341, 0xe7c1, 0xe7c0,
  0x93d1, 0xe7c2, 0x8f55, 0x8ede, 0x947a, 0x9291, 0x8ef0, 0x908c,
  0xe7c3, 0xe7c4, 0x907c, 0xe7c5, 0xe7c6, 0xe7c7, 0x978f, 0x8f56,
  0xe7c9, 0xe7c8, 0x8d79, 0x8d93, 0x8e5f, 0xe7cc, 0x8f86, 0xe7cb,
  0xe7ca, 0x91e7, 0x8ced, 0x90c1, 0x94ae, 0x8f58, 0xe7cd, 0x8fdd,
  0xe7d0, 0xe7ce, 0xe7cf, 0xe7d2, 0xe7d1, 0x8ff8, 0xe7d3, 0xe7d4,
  0xe7d5, 0x94ce, 0x8dd1, 0x8edf, 0xe7d6, 0xe7d7, 0x97a2, 0x8f64,
  0x96ec, 0x97ca, 0xe7d8, 0x8be0, 0xe7d9, 0x9342, 0xe7dc, 0x8a98,
  0x906a, 0xe7da, 0xe7db, 0x92de, 0x9674, 0x8bfa, 0xe7de, 0xe7df,
  0xe7dd, 0xe7e1, 0x93dd, 0x8a62, 0xe7e5, 0xe7e2, 0xe7e4, 0xe7e0,
  0xe86e, 0xe7e3, 0x97e9, 0x8cd8, 0xe7ed, 0x9353, 0xe7e8, 0xe7eb,
  0xe7e9, 0xe7ee, 0xe7ef, 0xe7e7, 0xe7f4, 0x8994, 0xe7e6, 0x94ab,
  0xe7ea, 0x8fde, 0x8d7a, 0x9667, 0x8be2, 0x8f65, 0x93ba, 0x914c,
  0xe7f2, 0xe7ec, 0xe7f1, 0x96c1, 0x92b6, 0xe7f3, 0xe7f0, 0x914b,
  0xe7f7, 0xe7f6, 0xe7f5, 0x964e, 0x8f9b, 0xe7f8, 0x95dd, 0x8973,
  0x9565, 0x9292, 0x8b98, 0xe7fa, 0x8d7c, 0x8e4b, 0xe7f9, 0x908d,
  0x908e, 0xe840, 0xe842, 0x8ff9, 0xe841, 0xe843, 0x8bd1, 0x9564,
  0x8ee0, 0x9842, 0xe7fc, 0x8df6, 0x985e, 0xe845, 0xe844, 0xe846,
  0xe7fb, 0x93e7, 0x9374, 0x92d5, 0xe84b, 0x9262, 0xe847, 0xe848,
  0x8c4c, 0xe84a, 0x8cae, 0xe849, 0x8fdf, 0x8a99, 0xe84f, 0x8dbd,
  0x9199, 0x92c8, 0x8a5a, 0xe84d, 0xe84e, 0x92c1, 0xe84c, 0xe850,
  0xe856, 0xe859, 0xe858, 0x934c, 0xe851, 0xe852, 0xe855, 0xe857,
  0x8bbe, 0xe85a, 0xe854, 0xe853, 0xe85e, 0xe85f, 0xe860, 0xe85d,
  0xe85c, 0x8fe0, 0x93a8, 0xe85b, 0xe864, 0xe862, 0xe863, 0xe861,
  0x91f6, 0xe865, 0xe866, 0xe868, 0x8ad3, 0xe867, 0x96f8, 0xe873,
  0xe869, 0xe86c, 0xe86a, 0xe86b, 0xe86d, 0xe86f, 0xe870, 0xe871,
  0xe874, 0xe872, 0xe875, 0xe877, 0xe876, 0x92b7, 0x96e5, 0xe878,
  0x914d, 0xe879, 0x95c2, 0xe87a, 0x8a4a, 0x895b, 0x8ad5, 0x8ad4,
  0xe87b, 0xe87c, 0xe87d, 0xe87e, 0xe880, 0x8ad6, 0x8a74, 0x8d7d,
  0x94b4, 0xe882, 0xe881, 0xe883, 0x897b, 0xe886, 0xe885, 0xe884,
  0xe887, 0xe88a, 0x88c5, 0xe888, 0xe88c, 0xe88b, 0xe88e, 0xe88d,
  0xe88f, 0x93ac, 0xe890, 0xe891, 0xe893, 0xe892, 0x958c, 0xe894,
  0xe895, 0x8de3, 0xe896, 0xe897, 0x9668, 0x916a, 0x88a2, 0x91c9,
  0xe898, 0x958d, 0xe89b, 0xe899, 0x8d7e, 0xe89a, 0x8cc0, 0x95c3,
  0xe89d, 0xe89f, 0xe89e, 0xe8a0, 0x8940, 0x9077, 0x8f9c, 0x8ad7,
  0xe8a1, 0x9486, 0xe8a3, 0x8941, 0xe8a2, 0x92c2, 0x97cb, 0x93a9,
  0xe89c, 0x97a4, 0x8caf, 0x977a, 0x8bf7, 0x97b2, 0x8c47, 0x91e0,
  0xe440, 0xe8a4, 0x8a4b, 0x908f, 0x8a75, 0xe8a6, 0xe8a7, 0xe8a5,
  0x8c84, 0x8ddb, 0x8fe1, 0x8942, 0x97d7, 0xe8a9, 0xe7ac, 0xe8a8,
  0xe8ac, 0xe8aa, 0xe8ab, 0xe8ad, 0xe8ae, 0x97ea, 0xe8af, 0xe8b0,
  0x90c7, 0x94b9, 0x909d, 0x8ae5, 0x9759, 0x89eb, 0x8f57, 0x8cd9,
  0xe8b3, 0xe8b2, 0x8e93, 0xe8b4, 0xe8b1, 0x8e47, 0xe8b8, 0xe5ab,
  0x99d4, 0x9097, 0xe8b6, 0x97a3, 0x93ef, 0x894a, 0x90e1, 0x8eb4,
  0x95b5, 0x895f, 0x97eb, 0x978b, 0xe8b9, 0x9364, 0x8ef9, 0xe8ba,
  0xe8bb, 0x906b, 0xe8bc, 0x97ec, 0xe8b7, 0xe8be, 0xe8c0, 0xe8bf,
  0xe8bd, 0xe8c1, 0xe8c2, 0x919a, 0x89e0, 0xe8c3, 0x96b6, 0xe8c4,
  0xe8c5, 0x9849, 0x9e50, 0xe8c6, 0xe8c7, 0xe8c8, 0xe8cc, 0xe8c9,
  0xe8ca, 0xe8cb, 0xe8cd, 0x90c2, 0x96f5, 0x90c3, 0xe8ce, 0x94f1,
  0xe8cf, 0xea72, 0x96ca, 0xe8d0, 0xe8d1, 0xe8d2, 0x8a76, 0xe8d4,
  0x9078, 0xe8d5, 0x8c43, 0xe8d6, 0xe8da, 0xe8d8, 0xe8d9, 0x8a93,
  0xe8d7, 0xe8db, 0xe8dc, 0x88c6, 0xe8dd, 0xe8de, 0x8fe2, 0xe8df,
  0x8b66, 0xe8e2, 0xe8e1, 0xe8e0, 0xe691, 0x95da, 0xe8e3, 0xe8e4,
  0xe8e5, 0xe8e6, 0xe8e7, 0xe8e8, 0x8ad8, 0xe8e9, 0xe8ea, 0x9442,
  0xe8ec, 0x89b9, 0xe8ef, 0xe8ee, 0x8943, 0x8bbf, 0x95c5, 0x92b8,
  0x8da0, 0x8d80, 0x8f87, 0x907b, 0xe8f1, 0xe8f0, 0x9761, 0x8ae6,
  0x94d0, 0x93da, 0x909c, 0x97cc, 0x8c7a, 0xe8f4, 0xe8f3, 0x966a,
  0x93aa, 0x896f, 0xe8f5, 0xe8f2, 0x9570, 0x978a, 0xe8f6, 0xe8f7,
  0xe8f9, 0x91e8, 0x8a7a, 0x8a7b, 0xe8f8, 0x8ae7, 0x8cb0, 0x8ae8,
  0x935e, 0x97de, 0x8cda, 0xe8fa, 0xe8fb, 0xe8fc, 0xe940, 0xe942,
  0xe941, 0x9597, 0xe943, 0xe944, 0xe945, 0xe946, 0xe948, 0xe947,
  0xe949, 0x94f2, 0xe3ca, 0x9048, 0x8b51, 0xe94a, 0xe94b, 0x99aa,
  0x9f5a, 0x94d1, 0x88f9, 0x88b9, 0x8e94, 0x964f, 0x8ffc, 0xe94c,
  0x96dd, 0xe94d, 0x977b, 0x8961, 0x8e60, 0xe94e, 0x89ec, 0xe94f,
  0xe950, 0xe952, 0xe953, 0xe955, 0xe951, 0xe954, 0x8ad9, 0xe956,
  0xe957, 0xe958, 0xe959, 0xe95a, 0xe95c, 0xe95b, 0xe95e, 0xe961,
  0xe95d, 0xe95f, 0xe960, 0xe962, 0x8bc0, 0x8ef1, 0xe963, 0xe964,
  0x8d81, 0xe965, 0x8a5d, 0x946e, 0xe966, 0xe967, 0x9279, 0x93e9,
  0xe968, 0x949d, 0x91ca, 0x8977, 0x8bec, 0x8bed, 0x9293, 0xe96d,
  0x8bee, 0x89ed, 0xe96c, 0xe96a, 0xe96b, 0xe969, 0xe977, 0xe96e,
  0xe96f, 0xe970, 0xe971, 0xe973, 0xe972, 0x8f78, 0xe974, 0xe976,
  0x8b52, 0xe975, 0x919b, 0x8cb1, 0xe978, 0x91cb, 0xe979, 0x93ab,
  0xe97a, 0xe980, 0xe97d, 0xe97c, 0xe97e, 0xe97b, 0xe982, 0xe981,
  0xe984, 0x8bc1, 0xe983, 0xe985, 0xe986, 0xe988, 0xe987, 0xe989,
  0xe98b, 0xe98a, 0x8d9c, 0xe98c, 0xe98d, 0x8a5b, 0xe98e, 0xe98f,
  0x9091, 0xe990, 0xe991, 0xe992, 0xe993, 0x8d82, 0xe994, 0xe995,
  0xe996, 0xe997, 0xe998, 0x94af, 0xe99a, 0x9545, 0xe99b, 0xe999,
  0xe99d, 0xe99c, 0xe99e, 0xe99f, 0xe9a0, 0xe9a1, 0xe9a2, 0xe9a3,
  0xe9a4, 0xe9a5, 0xe9a6, 0xe9a7, 0xe9a8, 0xe9a9, 0xe9aa, 0xe9ab,
  0xe9ac, 0x9f54, 0xe9ad, 0xe2f6, 0x8b53, 0x8a40, 0x8db0, 0xe9af,
  0xe9ae, 0x96a3, 0xe9b1, 0xe9b2, 0xe9b0, 0xe9b3, 0x9682, 0xe9b4,
  0x8b9b, 0x9844, 0xe9b5, 0xe9b7, 0x88bc, 0xe9b8, 0x95a9, 0xe9b6,
  0xe9b9, 0xe9ba, 0xe9bb, 0xe9bc, 0xe9bd, 0x968e, 0x8e4c, 0x8df8,
  0x914e, 0xe9be, 0xe9c1, 0xe9bf, 0xe9c2, 0x8cef, 0xe9c0, 0xe9c3,
  0xe9c4, 0xe9c5, 0xe9c9, 0x8e49, 0x91e2, 0xe9ca, 0xe9c7, 0xe9c6,
  0xe9c8, 0x8c7e, 0xe9ce, 0xe9cd, 0xe9cc, 0x88b1, 0xe9d8, 0xe9d4,
  0xe9d5, 0xe9d1, 0xe9d7, 0xe9d3, 0x8a82, 0x986b, 0xe9d6, 0xe9d2,
  0xe9d0, 0xe9cf, 0xe9da, 0xe9dd, 0xe9dc, 0xe9db, 0x9568, 0xe9d9,
  0x88f1, 0xe9de, 0xe9e0, 0x8a8f, 0xe9cb, 0x8956, 0xe9e2, 0xe9e1,
  0xe9df, 0x924c, 0x9690, 0x97d8, 0xe9e3, 0xe9e4, 0xe9e5, 0xe9e6,
  0xe9e7, 0x92b9, 0xe9e8, 0x94b5, 0xe9ed, 0xe9e9, 0xe9ea, 0x9650,
  0x96c2, 0x93ce, 0xe9ee, 0xe9ef, 0x93bc, 0xe9ec, 0xe9eb, 0x89a8,
  0xe9f7, 0xe9f6, 0x8995, 0xe9f4, 0xe9f3, 0xe9f1, 0x8a9b, 0xe9f0,
  0x8eb0, 0x89a7, 0x8d83, 0xe9fa, 0xe9f9, 0xe9f8, 0xe9f5, 0xe9fb,
  0xe9fc, 0xea44, 0xea43, 0xea45, 0x894c, 0xea40, 0xea41, 0x8d94,
  0x96b7, 0xea42, 0x9651, 0xea4a, 0xea46, 0xea4b, 0xea48, 0xea47,
  0x8c7b, 0xea4c, 0xea4d, 0xea4e, 0xea49, 0xe9f2, 0xea4f, 0x92df,
  0xea53, 0xea54, 0xea52, 0xea51, 0xea57, 0xea50, 0xea55, 0xea56,
  0xea59, 0xea58, 0xea5b, 0xea5c, 0xea5d, 0x9868, 0xea5a, 0x91e9,
  0x8deb, 0xea5e, 0xea5f, 0xea60, 0xea61, 0xea62, 0x8cb2, 0xea63,
  0xea64, 0x8ead, 0xea65, 0xea66, 0xea67, 0xea68, 0xea6b, 0xea69,
  0x985b, 0xea6a, 0x97ed, 0xea6c, 0x97d9, 0xea6d, 0x949e, 0xea6e,
  0xea70, 0xea71, 0xea6f, 0x8d8d, 0x96cb, 0x9683, 0x9bf5, 0x9f80,
  0x969b, 0x89a9, 0xea73, 0x8b6f, 0xea74, 0xea75, 0xea76, 0x8d95,
  0xea77, 0xe0d2, 0x96d9, 0x91e1, 0xea78, 0xea7a, 0xea79, 0xea7b,
  0xea7c, 0xea7d, 0xea7e, 0xea80, 0xea81, 0xea82, 0xea83, 0xea84,
  0xea85, 0xea86, 0xea87, 0xea88, 0x9343, 0x8cdb, 0xea8a, 0x916c,
  0xea8b, 0xea8c, 0x9540, 0xea8d, 0xea8e, 0xe256, 0xe6d8, 0xe8eb,
  0xea8f, 0xea90, 0xea92, 0xea93, 0xea94, 0x97ee, 0xea91, 0xea95,
  0xea96, 0xea98, 0xea97, 0xea9a, 0xea9b, 0xea99, 0x97b4, 0xea9c,
  0xea9d, 0xe273, 0xea9e, 0x8149, 0x8194, 0x8190, 0x8193, 0x8195,
  0x8169, 0x816a, 0x8196, 0x817b, 0x8143, 0x8144, 0x815e, 0x824f,
  0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257,
  0x8258, 0x8146, 0x8147, 0x8183, 0x8181, 0x8184, 0x8148, 0x8197,
  0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267,
  0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e, 0x826f,
  0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276, 0x8277,
  0x8278, 0x8279, 0x816d, 0x815f, 0x816e, 0x814f, 0x8151, 0x814d,
  0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, 0x8288,
  0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f, 0x8290,
  0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298,
  0x8299, 0x829a, 0x816f, 0x8162, 0x8170, 0x8150, 0x818f,
};

typedef struct {
  unsigned short indx; /* index into big table */
  unsigned short used; /* bitmask of used entries */
} Summary16;

static const Summary16 jisx0208_uni2indx_page00[16] = {
  /* 0x0000 */
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
  {    0, 0x0000 }, { 6843, 0x1000 }, {    0, 0x0000 }, {    0, 0x0000 }, /* ZINT: Patched reverse solidus (backslash) mapping U+005C to 0x815F */
  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x118c }, {    5, 0x0053 },
  {    9, 0x0000 }, {    9, 0x0080 }, {   10, 0x0000 }, {   10, 0x0080 },
};
static const Summary16 jisx0208_uni2indx_page03[22] = {
  /* 0x0300 */
  {   11, 0x0000 }, {   11, 0x0000 }, {   11, 0x0000 }, {   11, 0x0000 },
  {   11, 0x0000 }, {   11, 0x0000 }, {   11, 0x0000 }, {   11, 0x0000 },
  {   11, 0x0000 }, {   11, 0xfffe }, {   26, 0x03fb }, {   35, 0xfffe },
  {   50, 0x03fb }, {   59, 0x0000 }, {   59, 0x0000 }, {   59, 0x0000 },
  /* 0x0400 */
  {   59, 0x0002 }, {   60, 0xffff }, {   76, 0xffff }, {   92, 0xffff },
  {  108, 0xffff }, {  124, 0x0002 },
};
static const Summary16 jisx0208_uni2indx_page20[50] = {
  /* 0x2000 */
  {  125, 0x0000 }, {  125, 0x3361 }, {  132, 0x0063 }, {  136, 0x080d },
  {  140, 0x0000 }, {  140, 0x0000 }, {  140, 0x0000 }, {  140, 0x0000 },
  {  140, 0x0000 }, {  140, 0x0000 }, {  140, 0x0000 }, {  140, 0x0000 },
  {  140, 0x0000 }, {  140, 0x0000 }, {  140, 0x0000 }, {  140, 0x0000 },
  /* 0x2100 */
  {  140, 0x0008 }, {  141, 0x0000 }, {  141, 0x0800 }, {  142, 0x0000 },
  {  142, 0x0000 }, {  142, 0x0000 }, {  142, 0x0000 }, {  142, 0x0000 },
  {  142, 0x0000 }, {  142, 0x000f }, {  146, 0x0000 }, {  146, 0x0000 },
  {  146, 0x0000 }, {  146, 0x0014 }, {  148, 0x0000 }, {  148, 0x0000 },
  /* 0x2200 */
  {  148, 0x098d }, {  154, 0x6404 }, {  158, 0x1f81 }, {  165, 0x2030 },
  {  168, 0x0000 }, {  168, 0x0004 }, {  169, 0x0cc3 }, {  175, 0x0000 },
  {  175, 0x00cc }, {  179, 0x0000 }, {  179, 0x0020 }, {  180, 0x0000 },
  {  180, 0x0000 }, {  180, 0x0000 }, {  180, 0x0000 }, {  180, 0x0000 },
  /* 0x2300 */
  {  180, 0x0000 }, {  180, 0x0004 },
};
static const Summary16 jisx0208_uni2indx_page25[23] = {
  /* 0x2500 */
  {  181, 0x900f }, {  187, 0x3999 }, {  195, 0x9939 }, {  203, 0x9999 },
  {  211, 0x0804 }, {  213, 0x0000 }, {  213, 0x0000 }, {  213, 0x0000 },
  {  213, 0x0000 }, {  213, 0x0000 }, {  213, 0x0003 }, {  215, 0x300c },
  {  219, 0xc8c0 }, {  224, 0x0000 }, {  224, 0x8000 }, {  225, 0x0000 },
  /* 0x2600 */
  {  225, 0x0060 }, {  227, 0x0000 }, {  227, 0x0000 }, {  227, 0x0000 },
  {  227, 0x0005 }, {  229, 0x0000 }, {  229, 0xa400 },
};
static const Summary16 jisx0208_uni2indx_page30[16] = {
  /* 0x3000 */
  {  232, 0xffef }, {  247, 0x103f }, {  254, 0x0000 }, {  254, 0x0000 },
  {  254, 0xfffe }, {  269, 0xffff }, {  285, 0xffff }, {  301, 0xffff },
  {  317, 0xffff }, {  333, 0x780f }, {  341, 0xfffe }, {  356, 0xffff },
  {  372, 0xffff }, {  388, 0xffff }, {  404, 0xffff }, {  420, 0x787f },
};
static const Summary16 jisx0208_uni2indx_page4e[1307] = {
  /* 0x4e00 */
  {  431, 0x6f8b }, {  441, 0x43f3 }, {  450, 0x2442 }, {  454, 0x9b46 },
  {  462, 0xe82c }, {  469, 0xe3e0 }, {  477, 0x0004 }, {  478, 0x400a },
  {  481, 0x5f65 }, {  491, 0xdb36 }, {  501, 0x7977 }, {  512, 0x0449 },
  {  516, 0xecd7 }, {  527, 0xe3f0 }, {  536, 0x6038 }, {  541, 0x08c5 },
  /* 0x4f00 */
  {  546, 0xe602 }, {  552, 0x3403 }, {  557, 0x8000 }, {  558, 0x3551 },
  {  565, 0xe0c8 }, {  571, 0x7eab }, {  582, 0x8200 }, {  584, 0x9869 },
  {  591, 0xa948 }, {  597, 0x2942 }, {  602, 0xe803 }, {  608, 0x8060 },
  {  611, 0x441c }, {  616, 0xad93 }, {  625, 0xc03a }, {  631, 0x4568 },
  /* 0x5000 */
  {  637, 0xaa60 }, {  643, 0x8656 }, {  650, 0x3f7a }, {  661, 0x0240 },
  {  663, 0x8388 }, {  668, 0x1461 }, {  673, 0x1020 }, {  675, 0x2174 },
  {  681, 0x2021 }, {  684, 0x0702 }, {  688, 0x3000 }, {  690, 0x40bc },
  {  696, 0xa624 }, {  702, 0x4462 }, {  707, 0x60a8 }, {  712, 0x0a20 },
  /* 0x5100 */
  {  715, 0x0217 }, {  720, 0x8574 }, {  727, 0x0402 }, {  729, 0x9c84 },
  {  735, 0x7bfb }, {  748, 0x1415 }, {  753, 0x7f24 }, {  762, 0x11e2 },
  {  768, 0xb665 }, {  777, 0x02ef }, {  785, 0x1f75 }, {  795, 0x20ff },
  {  804, 0x3a70 }, {  811, 0x3840 }, {  815, 0x26c3 }, {  822, 0x6763 },
  /* 0x5200 */
  {  831, 0x4dd9 }, {  840, 0x2092 }, {  844, 0x46b0 }, {  850, 0x0fc9 },
  {  858, 0xbc98 }, {  866, 0x4850 }, {  870, 0x8638 }, {  876, 0xa03f },
  {  884, 0x2388 }, {  889, 0x8816 }, {  894, 0x3e09 }, {  901, 0x5232 },
  {  907, 0x22aa }, {  913, 0xe3a4 }, {  921, 0x00dd }, {  927, 0xc72c },
  /* 0x5300 */
  {  935, 0xa166 }, {  942, 0x26e1 }, {  949, 0x840b }, {  954, 0x8f0a },
  {  961, 0x27eb }, {  971, 0x559e }, {  980, 0xc241 }, {  985, 0x89bb },
  {  994, 0x0014 }, {  996, 0x8540 }, { 1000, 0x6361 }, { 1007, 0x0849 },
  { 1011, 0x7f0c }, { 1020, 0x8ad0 }, { 1026, 0xff3e }, { 1039, 0x05cf },
  /* 0x5400 */
  { 1047, 0xff1a }, { 1058, 0xa803 }, { 1063, 0x7a41 }, { 1070, 0x7b40 },
  { 1077, 0x4745 }, { 1084, 0x8002 }, { 1086, 0x0500 }, { 1088, 0x38eb },
  { 1097, 0xd851 }, { 1104, 0x0005 }, { 1106, 0x9934 }, { 1113, 0x710c },
  { 1119, 0x0397 }, { 1126, 0x0100 }, { 1127, 0x6366 }, { 1135, 0x2404 },
  /* 0x5500 */
  { 1138, 0x80d0 }, { 1142, 0x0051 }, { 1145, 0xc000 }, { 1147, 0x430a },
  { 1152, 0x9071 }, { 1158, 0x30c8 }, { 1163, 0x0008 }, { 1164, 0x5800 },
  { 1167, 0x0e99 }, { 1174, 0xf700 }, { 1181, 0x5f80 }, { 1188, 0x0041 },
  { 1190, 0x00b0 }, { 1193, 0x9410 }, { 1197, 0x0018 }, { 1199, 0x6280 },
  /* 0x5600 */
  { 1203, 0x0240 }, { 1205, 0x09d0 }, { 1210, 0x8200 }, { 1212, 0x0156 },
  { 1217, 0x5004 }, { 1220, 0x0801 }, { 1222, 0x1d10 }, { 1227, 0x0510 },
  { 1230, 0x84c1 }, { 1235, 0x0010 }, { 1236, 0x4025 }, { 1240, 0x1050 },
  { 1243, 0x410f }, { 1249, 0x4d8a }, { 1256, 0x4009 }, { 1259, 0xa60d },
  /* 0x5700 */
  { 1266, 0xab19 }, { 1274, 0x914c }, { 1280, 0x21c0 }, { 1284, 0x0981 },
  { 1288, 0xc485 }, { 1294, 0x0003 }, { 1296, 0x0652 }, { 1301, 0x8000 },
  { 1302, 0x0b04 }, { 1306, 0x0008 }, { 1307, 0x041d }, { 1312, 0x0009 },
  { 1314, 0x4849 }, { 1319, 0x905c }, { 1325, 0x0009 }, { 1327, 0x1690 },
  /* 0x5800 */
  { 1332, 0x0c65 }, { 1338, 0x2220 }, { 1341, 0x8412 }, { 1345, 0x2433 },
  { 1351, 0x0c03 }, { 1355, 0x4796 }, { 1363, 0x0a04 }, { 1366, 0x4225 },
  { 1371, 0x0028 }, { 1373, 0x9088 }, { 1377, 0x4900 }, { 1380, 0x4f08 },
  { 1386, 0x14a2 }, { 1391, 0xd3aa }, { 1400, 0xd830 }, { 1406, 0x3e87 },
  /* 0x5900 */
  { 1415, 0x8604 }, { 1419, 0x1f61 }, { 1427, 0x7ea4 }, { 1436, 0x4186 },
  { 1441, 0xc390 }, { 1447, 0x05b3 }, { 1454, 0x57a5 }, { 1463, 0x2118 },
  { 1467, 0x241e }, { 1473, 0x2a48 }, { 1478, 0x1128 }, { 1482, 0x4a04 },
  { 1486, 0x0a40 }, { 1489, 0x161b }, { 1496, 0x0d60 }, { 1501, 0x8840 },
  /* 0x5a00 */
  { 1504, 0x020a }, { 1507, 0x9502 }, { 1512, 0x8221 }, { 1516, 0x1060 },
  { 1519, 0x0243 }, { 1523, 0x0400 }, { 1524, 0x1444 }, { 1528, 0x8000 },
  { 1529, 0x0000 }, { 1529, 0x0c04 }, { 1532, 0x0000 }, { 1532, 0x7000 },
  { 1535, 0x1a06 }, { 1540, 0x00c1 }, { 1543, 0x024a }, { 1547, 0x0c00 },
  /* 0x5b00 */
  { 1549, 0x1a00 }, { 1552, 0x0040 }, { 1553, 0x1404 }, { 1556, 0x4045 },
  { 1560, 0x0029 }, { 1563, 0xbdb3 }, { 1574, 0x0a78 }, { 1580, 0x052b },
  { 1586, 0xbba9 }, { 1596, 0xbfa0 }, { 1605, 0x407c }, { 1611, 0x8379 },
  { 1619, 0x12fc }, { 1627, 0xe81d }, { 1635, 0x4bf6 }, { 1645, 0xc569 },
  /* 0x5c00 */
  { 1653, 0xeff6 }, { 1666, 0x044a }, { 1670, 0x2115 }, { 1675, 0xff02 },
  { 1684, 0xed63 }, { 1694, 0x402b }, { 1699, 0xd033 }, { 1706, 0x0242 },
  { 1709, 0x1000 }, { 1710, 0x0013 }, { 1713, 0x1b02 }, { 1718, 0x59ca },
  { 1726, 0x00a0 }, { 1728, 0x0200 }, { 1729, 0xa703 }, { 1736, 0x2c41 },
  /* 0x5d00 */
  { 1741, 0x4880 }, { 1744, 0x8ff2 }, { 1754, 0x0204 }, { 1756, 0x0000 },
  { 1756, 0x5800 }, { 1759, 0x1005 }, { 1762, 0x9200 }, { 1765, 0x0048 },
  { 1767, 0x1894 }, { 1772, 0x2001 }, { 1774, 0x5004 }, { 1777, 0x3480 },
  { 1781, 0x3200 }, { 1784, 0x684c }, { 1790, 0x49ea }, { 1798, 0x68be },
  /* 0x5e00 */
  { 1807, 0x184c }, { 1812, 0x2e42 }, { 1818, 0xa820 }, { 1822, 0x21c9 },
  { 1828, 0x50b9 }, { 1835, 0x80b0 }, { 1839, 0x001e }, { 1843, 0xff7c },
  { 1856, 0x849a }, { 1862, 0x14e0 }, { 1867, 0x28c1 }, { 1872, 0x01e0 },
  { 1876, 0x870e }, { 1883, 0xac49 }, { 1890, 0x130f }, { 1897, 0xdddb },
  /* 0x5f00 */
  { 1909, 0xbe1a }, { 1918, 0x89fb }, { 1928, 0xa2e0 }, { 1934, 0x51a2 },
  { 1940, 0x5502 }, { 1945, 0x32ca }, { 1952, 0x3e46 }, { 1960, 0x928b },
  { 1967, 0x1dbf }, { 1978, 0x438f }, { 1986, 0x6703 }, { 1993, 0x3218 },
  { 1998, 0x3028 }, { 2002, 0x33c0 }, { 2008, 0x0811 }, { 2011, 0xa923 },
  /* 0x6000 */
  { 2018, 0xc000 }, { 2020, 0x3a65 }, { 2028, 0x8fe3 }, { 2038, 0x0402 },
  { 2040, 0x2c4e }, { 2047, 0x8625 }, { 2053, 0xbf3d }, { 2065, 0x00a1 },
  { 2068, 0x3a1a }, { 2075, 0x8cd4 }, { 2082, 0x06c9 }, { 2088, 0x317c },
  { 2096, 0x00e0 }, { 2099, 0x950a }, { 2105, 0x018b }, { 2110, 0x0edb },
  /* 0x6100 */
  { 2119, 0xe34b }, { 2128, 0x8c20 }, { 2132, 0x1182 }, { 2136, 0xf010 },
  { 2141, 0x7d94 }, { 2150, 0xa728 }, { 2157, 0xc9ac }, { 2165, 0x40fb },
  { 2173, 0x4484 }, { 2177, 0x0653 }, { 2183, 0x5a90 }, { 2189, 0x4444 },
  { 2193, 0x3fc8 }, { 2202, 0x0001 }, { 2203, 0x0048 }, { 2205, 0xf5d4 },
  /* 0x6200 */
  { 2215, 0x7701 }, { 2222, 0xec57 }, { 2232, 0xc442 }, { 2237, 0x891d },
  { 2244, 0x6b83 }, { 2252, 0x4928 }, { 2257, 0x4109 }, { 2261, 0xd242 },
  { 2267, 0x061d }, { 2273, 0x59fe }, { 2284, 0x1800 }, { 2286, 0x3a22 },
  { 2292, 0xb7e4 }, { 2302, 0x3b9f }, { 2313, 0xf003 }, { 2319, 0xc0ea },
  /* 0x6300 */
  { 2326, 0x1386 }, { 2332, 0x8202 }, { 2335, 0x8980 }, { 2339, 0xe400 },
  { 2343, 0xb200 }, { 2347, 0x10a1 }, { 2351, 0x4b80 }, { 2356, 0x0cc4 },
  { 2361, 0xd309 }, { 2368, 0x8944 }, { 2373, 0x1faf }, { 2384, 0x4834 },
  { 2389, 0x8259 }, { 2395, 0x0c45 }, { 2400, 0x420a }, { 2404, 0x0450 },
  /* 0x6400 */
  { 2407, 0xa040 }, { 2410, 0x10c8 }, { 2414, 0x3140 }, { 2418, 0x4450 },
  { 2422, 0x4004 }, { 2424, 0x0100 }, { 2425, 0x8280 }, { 2428, 0x0540 },
  { 2431, 0x0108 }, { 2433, 0x442c }, { 2438, 0x6a30 }, { 2444, 0x1a05 },
  { 2449, 0x20a6 }, { 2454, 0x0514 }, { 2458, 0x90cf }, { 2466, 0x6456 },
  /* 0x6500 */
  { 2473, 0x0021 }, { 2475, 0x3100 }, { 2478, 0x9c18 }, { 2484, 0xcbf0 },
  { 2493, 0xa120 }, { 2497, 0x63e2 }, { 2505, 0x104c }, { 2509, 0x01b5 },
  { 2515, 0x538c }, { 2522, 0x9a83 }, { 2529, 0xb8b2 }, { 2537, 0x3281 },
  { 2542, 0x987a }, { 2550, 0x0a84 }, { 2554, 0x33e7 }, { 2564, 0x0c02 },
  /* 0x6600 */
  { 2567, 0xd4cc }, { 2575, 0x9018 }, { 2579, 0xa1a1 }, { 2585, 0x9070 },
  { 2590, 0x8a1e }, { 2597, 0xe004 }, { 2601, 0xc3d4 }, { 2609, 0x0451 },
  { 2613, 0x439a }, { 2620, 0x21c2 }, { 2625, 0x4844 }, { 2629, 0x5310 },
  { 2634, 0x0292 }, { 2638, 0x3640 }, { 2643, 0x0241 }, { 2646, 0xf3bd },
  /* 0x6700 */
  { 2658, 0xab09 }, { 2665, 0xe8f0 }, { 2673, 0x7dc0 }, { 2681, 0xa5d2 },
  { 2689, 0xc242 }, { 2694, 0xd24b }, { 2702, 0xa43f }, { 2711, 0xd0af },
  { 2720, 0x1aa0 }, { 2725, 0x34a1 }, { 2731, 0x8247 }, { 2737, 0x03d8 },
  { 2743, 0xc452 }, { 2749, 0x651b }, { 2757, 0xd294 }, { 2764, 0xc83a },
  /* 0x6800 */
  { 2771, 0x001c }, { 2774, 0x40c8 }, { 2778, 0x0e06 }, { 2783, 0x3314 },
  { 2789, 0x614f }, { 2797, 0xb21b }, { 2805, 0x0088 }, { 2807, 0xc0d0 },
  { 2812, 0xa02a }, { 2817, 0xa898 }, { 2823, 0xa1c5 }, { 2830, 0x166b },
  { 2838, 0x2e50 }, { 2844, 0x85b4 }, { 2851, 0xc08b }, { 2857, 0x0604 },
  /* 0x6900 */
  { 2860, 0xf933 }, { 2870, 0x1e04 }, { 2875, 0x056e }, { 2882, 0xa251 },
  { 2888, 0x0400 }, { 2889, 0x7638 }, { 2897, 0xec07 }, { 2905, 0x73b8 },
  { 2914, 0x4406 }, { 2918, 0x1832 }, { 2923, 0x4081 }, { 2926, 0xc816 },
  { 2932, 0x7c8a }, { 2940, 0x6309 }, { 2946, 0x2980 }, { 2950, 0xaa04 },
  /* 0x6a00 */
  { 2955, 0x1c24 }, { 2960, 0xca9c }, { 2968, 0x4e0e }, { 2975, 0x2760 },
  { 2981, 0x0990 }, { 2985, 0x8300 }, { 2988, 0x0046 }, { 2991, 0x8104 },
  { 2994, 0x6011 }, { 2998, 0x1081 }, { 3001, 0x540d }, { 3007, 0x0908 },
  { 3010, 0x000e }, { 3013, 0xcc0a }, { 3019, 0x0500 }, { 3021, 0x0c00 },
  /* 0x6b00 */
  { 3023, 0x0430 }, { 3026, 0xa044 }, { 3030, 0x008b }, { 3034, 0x6784 },
  { 3041, 0x5288 }, { 3046, 0x8a19 }, { 3052, 0x865e }, { 3060, 0x8b18 },
  { 3066, 0x2e59 }, { 3074, 0x4160 }, { 3078, 0x8c10 }, { 3082, 0x9cbe },
  { 3092, 0x6861 }, { 3098, 0x891c }, { 3104, 0x9800 }, { 3107, 0x0008 },
  /* 0x6c00 */
  { 3108, 0x8100 }, { 3110, 0x089a }, { 3115, 0x0018 }, { 3117, 0x4190 },
  { 3121, 0x4007 }, { 3125, 0xe4a1 }, { 3132, 0x0505 }, { 3136, 0x640d },
  { 3142, 0x310e }, { 3148, 0x0e4d }, { 3155, 0x4806 }, { 3159, 0xff0a },
  { 3169, 0x1632 }, { 3175, 0x2aa8 }, { 3181, 0x852e }, { 3188, 0x000b },
  /* 0x6d00 */
  { 3191, 0x1800 }, { 3193, 0xca84 }, { 3199, 0x0e20 }, { 3203, 0x696c },
  { 3211, 0x0032 }, { 3214, 0x1600 }, { 3217, 0x5658 }, { 3224, 0x0390 },
  { 3228, 0x5120 }, { 3232, 0x1a28 }, { 3237, 0x8000 }, { 3238, 0x1124 },
  { 3242, 0x18e1 }, { 3248, 0x4326 }, { 3254, 0x5d52 }, { 3262, 0x0eaa },
  /* 0x6e00 */
  { 3269, 0x0fa0 }, { 3275, 0xae28 }, { 3282, 0xfa7b }, { 3294, 0x4500 },
  { 3297, 0x6408 }, { 3301, 0x8940 }, { 3305, 0xc880 }, { 3309, 0xc044 },
  { 3313, 0x9005 }, { 3317, 0xb141 }, { 3323, 0x8424 }, { 3327, 0x24c4 },
  { 3332, 0x1a34 }, { 3338, 0x603a }, { 3344, 0x9000 }, { 3346, 0xc194 },
  /* 0x6f00 */
  { 3352, 0x8246 }, { 3357, 0x003a }, { 3361, 0x180d }, { 3366, 0xc106 },
  { 3371, 0x0022 }, { 3373, 0x9910 }, { 3378, 0xe050 }, { 3383, 0x1511 },
  { 3388, 0x4057 }, { 3394, 0x0082 }, { 3396, 0x041a }, { 3400, 0x020a },
  { 3403, 0x004f }, { 3408, 0x8930 }, { 3413, 0xd813 }, { 3420, 0x444a },
  /* 0x7000 */
  { 3425, 0x8a02 }, { 3429, 0xed22 }, { 3437, 0x10c0 }, { 3440, 0x4005 },
  { 3443, 0x1000 }, { 3444, 0x0102 }, { 3446, 0x8808 }, { 3449, 0x3101 },
  { 3453, 0x4600 }, { 3456, 0x0204 }, { 3458, 0xf000 }, { 3462, 0x0708 },
  { 3466, 0x8900 }, { 3469, 0xa200 }, { 3472, 0x0000 }, { 3472, 0x2202 },
  /* 0x7100 */
  { 3475, 0x0200 }, { 3476, 0x1610 }, { 3480, 0x0042 }, { 3482, 0x1040 },
  { 3484, 0x5200 }, { 3487, 0x0260 }, { 3490, 0x52f4 }, { 3498, 0x2000 },
  { 3499, 0x8510 }, { 3503, 0x8230 }, { 3507, 0x1100 }, { 3509, 0x4202 },
  { 3512, 0x4308 }, { 3516, 0x80b5 }, { 3522, 0x70e1 }, { 3529, 0x9a20 },
  /* 0x7200 */
  { 3534, 0x2040 }, { 3536, 0x0801 }, { 3538, 0x3500 }, { 3542, 0xfc65 },
  { 3552, 0x19c1 }, { 3558, 0xab04 }, { 3564, 0x0286 }, { 3568, 0x6214 },
  { 3573, 0x0087 }, { 3577, 0x0044 }, { 3579, 0x9085 }, { 3584, 0x0244 },
  { 3587, 0x405c }, { 3592, 0x0a85 }, { 3597, 0x3207 }, { 3603, 0x3380 },
  /* 0x7300 */
  { 3608, 0x0400 }, { 3609, 0xb8c0 }, { 3615, 0xce20 }, { 3621, 0xc0d0 },
  { 3626, 0xc030 }, { 3630, 0x0080 }, { 3631, 0x0508 }, { 3634, 0x0d25 },
  { 3640, 0x0a90 }, { 3644, 0x0040 }, { 3645, 0x0200 }, { 3646, 0x080c },
  { 3649, 0x6505 }, { 3655, 0x4000 }, { 3656, 0x6421 }, { 3661, 0x4102 },
  /* 0x7400 */
  { 3664, 0x0268 }, { 3668, 0x0000 }, { 3668, 0x0024 }, { 3670, 0x847c },
  { 3677, 0x0002 }, { 3678, 0xde20 }, { 3685, 0x8619 }, { 3691, 0x4049 },
  { 3695, 0x0808 }, { 3697, 0x4000 }, { 3698, 0x0084 }, { 3700, 0x2001 },
  { 3702, 0x8400 }, { 3704, 0x1010 }, { 3706, 0x42cd }, { 3713, 0x01c7 },
  /* 0x7500 */
  { 3719, 0x7038 }, { 3725, 0xd52a }, { 3733, 0x1968 }, { 3739, 0x1d8f },
  { 3748, 0xbe50 }, { 3756, 0x3e12 }, { 3763, 0x2ef5 }, { 3773, 0x81d9 },
  { 3780, 0xcec4 }, { 3788, 0x2412 }, { 3792, 0x0828 }, { 3795, 0x732e },
  { 3804, 0x24ac }, { 3810, 0x4b34 }, { 3817, 0x020c }, { 3820, 0xd41d },
  /* 0x7600 */
  { 3828, 0x2a02 }, { 3832, 0x8000 }, { 3833, 0x0097 }, { 3838, 0x0811 },
  { 3841, 0x11c4 }, { 3846, 0x1144 }, { 3850, 0x1786 }, { 3857, 0x7d45 },
  { 3866, 0x49d9 }, { 3874, 0x0649 }, { 3879, 0x4000 }, { 3880, 0x8791 },
  { 3887, 0x254c }, { 3893, 0xd8c4 }, { 3900, 0x44ba }, { 3907, 0x4914 },
  /* 0x7700 */
  { 3912, 0x1b92 }, { 3919, 0xc800 }, { 3922, 0x0271 }, { 3927, 0x1580 },
  { 3931, 0x0081 }, { 3933, 0x0c00 }, { 3935, 0x096a }, { 3941, 0xc200 },
  { 3944, 0x4800 }, { 3946, 0x4002 }, { 3948, 0x3021 }, { 3952, 0xba49 },
  { 3960, 0x2080 }, { 3962, 0x1c80 }, { 3966, 0xe2ac }, { 3974, 0x1008 },
  /* 0x7800 */
  { 3976, 0x1004 }, { 3978, 0x0034 }, { 3981, 0x00e1 }, { 3985, 0x8414 },
  { 3989, 0x0020 }, { 3990, 0x2000 }, { 3991, 0x9800 }, { 3994, 0x1014 },
  { 3997, 0x70c2 }, { 4003, 0x04aa }, { 4008, 0x8688 }, { 4013, 0x5420 },
  { 4017, 0x0c62 }, { 4022, 0x0413 }, { 4026, 0x9180 }, { 4030, 0x2010 },
  /* 0x7900 */
  { 4032, 0x4082 }, { 4035, 0x0206 }, { 4038, 0x1c40 }, { 4042, 0x5400 },
  { 4045, 0x0383 }, { 4050, 0xe4e9 }, { 4059, 0x2125 }, { 4064, 0x8480 },
  { 4067, 0xe433 }, { 4075, 0x2000 }, { 4076, 0x44c0 }, { 4080, 0xe609 },
  { 4087, 0x0a03 }, { 4091, 0x8126 }, { 4096, 0x12da }, { 4103, 0x0801 },
  /* 0x7a00 */
  { 4105, 0x6901 }, { 4110, 0x9790 }, { 4117, 0x4001 }, { 4119, 0xf886 },
  { 4127, 0xe24d }, { 4135, 0x0081 }, { 4137, 0x0a0e }, { 4142, 0xa651 },
  { 4149, 0x011a }, { 4153, 0x81ec }, { 4160, 0xc600 }, { 4164, 0x8441 },
  { 4168, 0xadb8 }, { 4177, 0xb62c }, { 4185, 0xa46f }, { 4194, 0x8741 },
  /* 0x7b00 */
  { 4200, 0x8d54 }, { 4207, 0x4b02 }, { 4212, 0x1161 }, { 4217, 0x0268 },
  { 4221, 0xbb60 }, { 4229, 0x2057 }, { 4235, 0x50a0 }, { 4239, 0x0433 },
  { 4244, 0xa8c0 }, { 4249, 0xb7b4 }, { 4259, 0x2402 }, { 4262, 0x0112 },
  { 4265, 0x9ad3 }, { 4274, 0x2000 }, { 4275, 0x2271 }, { 4281, 0x00c8 },
  /* 0x7c00 */
  { 4284, 0x2081 }, { 4287, 0x809e }, { 4293, 0x0c8a }, { 4298, 0xe180 },
  { 4303, 0xb009 }, { 4308, 0x8151 }, { 4313, 0x1031 }, { 4317, 0x4028 },
  { 4320, 0x2a0e }, { 4326, 0x89a5 }, { 4333, 0x69b6 }, { 4342, 0x620e },
  { 4348, 0x4425 }, { 4353, 0xd144 }, { 4359, 0x8085 }, { 4363, 0x4d54 },
  /* 0x7d00 */
  { 4370, 0x2c75 }, { 4378, 0x1fb1 }, { 4387, 0xd807 }, { 4394, 0x862d },
  { 4401, 0xd87c }, { 4410, 0x4841 }, { 4414, 0x414e }, { 4420, 0x226e },
  { 4427, 0x8200 }, { 4429, 0x9e08 }, { 4435, 0xf80c }, { 4442, 0xed37 },
  { 4453, 0x8c80 }, { 4457, 0x7526 }, { 4465, 0x9313 }, { 4472, 0x0814 },
  /* 0x7e00 */
  { 4475, 0x0e32 }, { 4481, 0xc804 }, { 4485, 0x484e }, { 4491, 0x6ea6 },
  { 4500, 0x2c4a }, { 4506, 0x6670 }, { 4513, 0x26c0 }, { 4518, 0xba01 },
  { 4524, 0xd30c }, { 4531, 0x185d }, { 4538, 0x0000 }, { 4538, 0x0000 },
  { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 },
  /* 0x7f00 */
  { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0540 },
  { 4541, 0x7020 }, { 4545, 0x8133 }, { 4551, 0x4f81 }, { 4558, 0x03a5 },
  { 4564, 0x55ec }, { 4573, 0x6410 }, { 4577, 0xc318 }, { 4583, 0x2344 },
  { 4588, 0x1462 }, { 4593, 0x0034 }, { 4596, 0x0a43 }, { 4601, 0x1a09 },
  /* 0x8000 */
  { 4606, 0x187b }, { 4614, 0x13a5 }, { 4621, 0x0102 }, { 4623, 0xa848 },
  { 4628, 0x0440 }, { 4630, 0xc544 }, { 4636, 0x8106 }, { 4640, 0xe2dd },
  { 4650, 0x1af0 }, { 4657, 0x2d48 }, { 4663, 0xb626 }, { 4671, 0x0416 },
  { 4675, 0x5058 }, { 4680, 0x6e40 }, { 4686, 0x8032 }, { 4690, 0x3112 },
  /* 0x8100 */
  { 4695, 0x07e4 }, { 4702, 0x0c00 }, { 4704, 0x8208 }, { 4707, 0x420a },
  { 4711, 0x4840 }, { 4714, 0x803b }, { 4720, 0x4860 }, { 4724, 0x8713 },
  { 4731, 0x850d }, { 4737, 0x3428 }, { 4742, 0x0319 }, { 4747, 0xe529 },
  { 4755, 0x2345 }, { 4761, 0x870a }, { 4767, 0x25a9 }, { 4774, 0x5c18 },
  /* 0x8200 */
  { 4780, 0x77a6 }, { 4790, 0xd9c5 }, { 4799, 0x5e00 }, { 4804, 0x03e8 },
  { 4810, 0x0081 }, { 4812, 0xa700 }, { 4817, 0xcd54 }, { 4825, 0x41c6 },
  { 4831, 0x2800 }, { 4833, 0xa204 }, { 4837, 0xb860 }, { 4843, 0x2b0a },
  { 4849, 0x0020 }, { 4850, 0xda9e }, { 4860, 0x08ea }, { 4866, 0x0e1a },
  /* 0x8300 */
  { 4872, 0x427c }, { 4879, 0x11c0 }, { 4883, 0x8908 }, { 4887, 0x0376 },
  { 4894, 0x8621 }, { 4899, 0x0105 }, { 4902, 0x0000 }, { 4902, 0x18a8 },
  { 4907, 0x46a0 }, { 4912, 0xc448 }, { 4917, 0x0d05 }, { 4922, 0x2022 },
  { 4925, 0x5422 }, { 4930, 0x9148 }, { 4935, 0x8a01 }, { 4939, 0x2897 },
  /* 0x8400 */
  { 4946, 0x7898 }, { 4953, 0x0008 }, { 4954, 0x1605 }, { 4959, 0x3122 },
  { 4964, 0x4240 }, { 4967, 0x0880 }, { 4969, 0xfa4e }, { 4979, 0x06a2 },
  { 4984, 0x0814 }, { 4987, 0x9211 }, { 4992, 0x2002 }, { 4994, 0x9b04 },
  { 5000, 0x2e52 }, { 5007, 0x0643 }, { 5012, 0x5000 }, { 5014, 0x9010 },
  /* 0x8500 */
  { 5017, 0x0041 }, { 5019, 0x85ba }, { 5027, 0x3042 }, { 5031, 0x2020 },
  { 5033, 0x4f0b }, { 5041, 0x05a0 }, { 5045, 0x2708 }, { 5050, 0x4080 },
  { 5052, 0x0591 }, { 5057, 0x1a93 }, { 5064, 0xdf50 }, { 5073, 0x0600 },
  { 5075, 0xa202 }, { 5079, 0x3021 }, { 5083, 0x0630 }, { 5087, 0x4e80 },
  /* 0x8600 */
  { 5092, 0x0cc4 }, { 5097, 0x04c8 }, { 5101, 0xa004 }, { 5104, 0x8001 },
  { 5106, 0x6000 }, { 5108, 0xd431 }, { 5115, 0x0880 }, { 5117, 0x0a02 },
  { 5120, 0x1c00 }, { 5123, 0x0028 }, { 5125, 0x8e18 }, { 5131, 0x0041 },
  { 5133, 0x6ad0 }, { 5140, 0xca10 }, { 5145, 0xf210 }, { 5151, 0x4b00 },
  /* 0x8700 */
  { 5155, 0x274d }, { 5163, 0x1506 }, { 5168, 0x0220 }, { 5170, 0x8890 },
  { 5174, 0x5a00 }, { 5178, 0x82a8 }, { 5183, 0x4549 }, { 5189, 0x8150 },
  { 5193, 0x2004 }, { 5195, 0x8000 }, { 5196, 0x8804 }, { 5199, 0x2c08 },
  { 5203, 0x08d1 }, { 5208, 0x0005 }, { 5210, 0x8001 }, { 5212, 0x4ac4 },
  /* 0x8800 */
  { 5218, 0xe020 }, { 5222, 0x0062 }, { 5225, 0x008e }, { 5229, 0x0a42 },
  { 5233, 0x3055 }, { 5239, 0x6a8c }, { 5246, 0x090e }, { 5251, 0xe0a5 },
  { 5258, 0x2906 }, { 5263, 0x42c4 }, { 5268, 0x4814 }, { 5272, 0x80b3 },
  { 5278, 0x803e }, { 5284, 0xb330 }, { 5291, 0x0102 }, { 5293, 0x731c },
  /* 0x8900 */
  { 5301, 0x1494 }, { 5306, 0x600d }, { 5311, 0x0c20 }, { 5314, 0x0940 },
  { 5317, 0x301a }, { 5322, 0xc040 }, { 5325, 0xa451 }, { 5331, 0xc094 },
  { 5336, 0x8dca }, { 5344, 0x05c8 }, { 5349, 0x96c2 }, { 5356, 0xa40c },
  { 5361, 0x0001 }, { 5362, 0x3404 }, { 5366, 0x00c8 }, { 5369, 0x0110 },
  /* 0x8a00 */
  { 5371, 0x550d }, { 5378, 0xa9c9 }, { 5386, 0x2428 }, { 5390, 0x1c5a },
  { 5397, 0x0142 }, { 5400, 0x4837 }, { 5407, 0x7a4d }, { 5416, 0x100f },
  { 5421, 0x32b4 }, { 5428, 0x452a }, { 5434, 0x317b }, { 5443, 0x9205 },
  { 5448, 0xb894 }, { 5455, 0x5c44 }, { 5461, 0x68d7 }, { 5470, 0x458a },
  /* 0x8b00 */
  { 5476, 0x5097 }, { 5483, 0x2ed1 }, { 5491, 0x1943 }, { 5497, 0x4208 },
  { 5500, 0xd202 }, { 5505, 0x9d40 }, { 5511, 0x9840 }, { 5515, 0x2097 },
  { 5521, 0x5409 }, { 5526, 0x064d }, { 5532, 0x0000 }, { 5532, 0x0000 },
  { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 },
  /* 0x8c00 */
  { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x8480 },
  { 5535, 0x5542 }, { 5541, 0x0421 }, { 5544, 0x1c06 }, { 5549, 0x1700 },
  { 5553, 0x7624 }, { 5560, 0x6110 }, { 5564, 0xff87 }, { 5576, 0xb9dd },
  { 5587, 0x659f }, { 5597, 0x5c0a }, { 5603, 0x245d }, { 5610, 0x3c00 },
  /* 0x8d00 */
  { 5614, 0xadb0 }, { 5622, 0x0059 }, { 5626, 0x0000 }, { 5626, 0x0000 },
  { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x28d0 }, { 5631, 0x009b },
  { 5636, 0x0422 }, { 5639, 0x0200 }, { 5640, 0x0108 }, { 5642, 0x4408 },
  { 5645, 0x9804 }, { 5649, 0xac40 }, { 5654, 0x8d0a }, { 5660, 0x9028 },
  /* 0x8e00 */
  { 5664, 0x8700 }, { 5668, 0xe001 }, { 5672, 0x0400 }, { 5673, 0x0031 },
  { 5676, 0x1794 }, { 5683, 0x8221 }, { 5687, 0x0019 }, { 5690, 0x1054 },
  { 5694, 0x2cb2 }, { 5701, 0x021a }, { 5705, 0x9c02 }, { 5710, 0x4003 },
  { 5713, 0x3d60 }, { 5720, 0x8804 }, { 5723, 0x080c }, { 5726, 0x7900 },
  /* 0x8f00 */
  { 5731, 0x1628 }, { 5736, 0xba3c }, { 5745, 0x8640 }, { 5749, 0xcb08 },
  { 5755, 0x7274 }, { 5763, 0x9080 }, { 5766, 0x001e }, { 5770, 0x0000 },
  { 5770, 0x0000 }, { 5770, 0xd800 }, { 5774, 0xe188 }, { 5780, 0x9c87 },
  { 5788, 0x4034 }, { 5792, 0x0412 }, { 5795, 0xae64 }, { 5803, 0x2791 },
  /* 0x9000 */
  { 5810, 0xe86b }, { 5819, 0xe6fb }, { 5831, 0x408f }, { 5837, 0x5366 },
  { 5845, 0xeea6 }, { 5855, 0x537f }, { 5866, 0xe32b }, { 5875, 0xb5e4 },
  { 5884, 0x869f }, { 5893, 0x0002 }, { 5894, 0x8548 }, { 5899, 0x0122 },
  { 5902, 0x4402 }, { 5905, 0x0800 }, { 5906, 0x2116 }, { 5911, 0x20a0 },
  /* 0x9100 */
  { 5914, 0x0004 }, { 5915, 0x0204 }, { 5917, 0x2000 }, { 5918, 0x0005 },
  { 5920, 0x7e00 }, { 5926, 0x0154 }, { 5930, 0x162c }, { 5936, 0x01ac },
  { 5941, 0x2a84 }, { 5946, 0x1085 }, { 5950, 0x8c14 }, { 5955, 0x0530 },
  { 5959, 0xfbc3 }, { 5970, 0xb943 }, { 5978, 0x00ca }, { 5982, 0x9060 },
  /* 0x9200 */
  { 5986, 0x6000 }, { 5988, 0x4032 }, { 5992, 0x1200 }, { 5994, 0x8090 },
  { 5997, 0x0b30 }, { 6002, 0x4c81 }, { 6007, 0x0054 }, { 6010, 0x4002 },
  { 6012, 0x0029 }, { 6015, 0x1d6a }, { 6023, 0x2000 }, { 6024, 0x0280 },
  { 6026, 0x8000 }, { 6027, 0x0004 }, { 6028, 0x2610 }, { 6032, 0x150c },
  /* 0x9300 */
  { 6037, 0x8040 }, { 6039, 0x0701 }, { 6043, 0xd94d }, { 6052, 0x0c24 },
  { 6056, 0x2810 }, { 6059, 0x1850 }, { 6063, 0x5001 }, { 6066, 0x5020 },
  { 6069, 0x1000 }, { 6070, 0x04d0 }, { 6074, 0x7080 }, { 6078, 0x0201 },
  { 6080, 0x0108 }, { 6082, 0x21c3 }, { 6088, 0x0132 }, { 6092, 0x0000 },
  /* 0x9400 */
  { 6092, 0x0088 }, { 6094, 0x0719 }, { 6100, 0x0802 }, { 6102, 0x0560 },
  { 6106, 0x0012 }, { 6108, 0x4c0e }, { 6114, 0x0405 }, { 6117, 0xf0a1 },
  { 6124, 0x0002 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 },
  { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 },
  /* 0x9500 */
  { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 },
  { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0080 },
  { 6126, 0x8e8d }, { 6134, 0x035a }, { 6140, 0x21bd }, { 6148, 0x5a04 },
  { 6153, 0x3488 }, { 6158, 0x1170 }, { 6163, 0x0026 }, { 6166, 0x0000 },
  /* 0x9600 */
  { 6166, 0x0000 }, { 6166, 0x1000 }, { 6167, 0xc502 }, { 6172, 0x8804 },
  { 6175, 0xb815 }, { 6182, 0xf801 }, { 6188, 0x147c }, { 6195, 0x25ed },
  { 6204, 0xed60 }, { 6212, 0x1bb0 }, { 6219, 0x0589 }, { 6224, 0x1bd7 },
  { 6234, 0x7af3 }, { 6245, 0x1a62 }, { 6251, 0x0d0c }, { 6256, 0x0ac5 },
  /* 0x9700 */
  { 6262, 0xe5d1 }, { 6271, 0x524a }, { 6277, 0x0490 }, { 6280, 0x6305 },
  { 6286, 0x0354 }, { 6291, 0x5244 }, { 6296, 0x2b57 }, { 6305, 0x1612 },
  { 6310, 0xa872 }, { 6317, 0x1101 }, { 6320, 0x2949 }, { 6326, 0x0018 },
  { 6328, 0x0948 }, { 6332, 0x1008 }, { 6334, 0x6000 }, { 6336, 0x886c },
  /* 0x9800 */
  { 6342, 0x916e }, { 6350, 0x058f }, { 6357, 0x3012 }, { 6361, 0x3990 },
  { 6367, 0xf840 }, { 6373, 0x4930 }, { 6378, 0x8880 }, { 6381, 0x001b },
  { 6385, 0x0000 }, { 6385, 0x0000 }, { 6385, 0x8500 }, { 6388, 0x0042 },
  { 6390, 0x0058 }, { 6393, 0x9800 }, { 6396, 0xea04 }, { 6402, 0x7014 },
  /* 0x9900 */
  { 6407, 0x1628 }, { 6412, 0x611d }, { 6419, 0x5113 }, { 6425, 0x6000 },
  { 6427, 0x1a24 }, { 6432, 0x00a7 }, { 6437, 0x0000 }, { 6437, 0x0000 },
  { 6437, 0x0000 }, { 6437, 0x03c0 }, { 6441, 0x7120 }, { 6446, 0x1018 },
  { 6449, 0x0172 }, { 6454, 0xa927 }, { 6462, 0x6004 }, { 6465, 0x8906 },
  /* 0x9a00 */
  { 6470, 0xc022 }, { 6474, 0x020c }, { 6477, 0x0900 }, { 6479, 0x4081 },
  { 6482, 0x202d }, { 6487, 0x8ca0 }, { 6492, 0x0e34 }, { 6498, 0x0000 },
  { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x2100 }, { 6500, 0x1101 },
  { 6503, 0x8011 }, { 6506, 0xc11a }, { 6512, 0xec4c }, { 6520, 0x0892 },
  /* 0x9b00 */
  { 6524, 0x0040 }, { 6525, 0x8500 }, { 6528, 0xc7ac }, { 6537, 0x1806 },
  { 6541, 0xe03e }, { 6549, 0x0512 }, { 6553, 0x8000 }, { 6554, 0x0010 },
  { 6555, 0x4008 }, { 6557, 0x80ce }, { 6563, 0x6d01 }, { 6569, 0x0210 },
  { 6571, 0x8641 }, { 6576, 0x0856 }, { 6581, 0x011e }, { 6586, 0x0027 },
  /* 0x9c00 */
  { 6590, 0x3750 }, { 6597, 0x083d }, { 6603, 0xe032 }, { 6609, 0x4e05 },
  { 6615, 0x01c0 }, { 6618, 0x0484 }, { 6621, 0x0081 }, { 6623, 0x0140 },
  { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 },
  { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x1aa0 }, { 6630, 0x0059 },
  /* 0x9d00 */
  { 6634, 0x43c8 }, { 6640, 0x8824 }, { 6644, 0x1d48 }, { 6650, 0xc800 },
  { 6653, 0x0152 }, { 6657, 0x7203 }, { 6663, 0x9013 }, { 6668, 0x0404 },
  { 6670, 0x8280 }, { 6673, 0x0400 }, { 6674, 0x8a10 }, { 6678, 0x0d14 },
  { 6683, 0x8056 }, { 6688, 0x0208 }, { 6690, 0xa040 }, { 6693, 0x2704 },
  /* 0x9e00 */
  { 6698, 0x0000 }, { 6698, 0x4c00 }, { 6701, 0x0000 }, { 6701, 0x0000 },
  { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0xa320 },
  { 6706, 0x1902 }, { 6710, 0xa0ae }, { 6717, 0x2660 }, { 6722, 0xdf00 },
  { 6729, 0xf010 }, { 6734, 0x7b15 }, { 6743, 0x8121 }, { 6747, 0x3ad0 },
  /* 0x9f00 */
  { 6754, 0x4180 }, { 6757, 0x0028 }, { 6759, 0x1003 }, { 6762, 0x4800 },
  { 6764, 0xcc00 }, { 6768, 0x8014 }, { 6771, 0x14cf }, { 6779, 0x00c4 },
  { 6782, 0x2000 }, { 6783, 0x3020 }, { 6786, 0x0001 },
};

static const Summary16 jisx0208_uni2indx_pageff[15] = {
  /* 0xff00 */
  { 6787, 0xdf7a }, { 6799, 0xffff }, { 6815, 0xffff }, { 6831, 0xffff },
  { 6847, 0xffff }, { 6863, 0x3fff }, { 6877, 0x0000 }, { 6877, 0x0000 },
  { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 },
  { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0028 },
};

static int jisx0208_wctomb(unsigned int* r, unsigned int wc) {
    const Summary16 *summary = NULL;
    if (wc >= 0x0000 && wc < 0x0100) {
        summary = &jisx0208_uni2indx_page00[(wc>>4)];
    } else if (wc >= 0x0300 && wc < 0x0460) {
        summary = &jisx0208_uni2indx_page03[(wc>>4)-0x030];
    } else if (wc >= 0x2000 && wc < 0x2320) {
        summary = &jisx0208_uni2indx_page20[(wc>>4)-0x200];
    } else if (wc >= 0x2500 && wc < 0x2670) {
        summary = &jisx0208_uni2indx_page25[(wc>>4)-0x250];
    } else if (wc >= 0x3000 && wc < 0x3100) {
        summary = &jisx0208_uni2indx_page30[(wc>>4)-0x300];
    } else if (wc >= 0x4e00 && wc < 0x9fb0) {
        summary = &jisx0208_uni2indx_page4e[(wc>>4)-0x4e0];
    } else if (wc >= 0xff00 && wc < 0xfff0) {
        summary = &jisx0208_uni2indx_pageff[(wc>>4)-0xff0];
    }
    if (summary) {
        unsigned short used = summary->used;
        unsigned int i = wc & 0x0f;
        if (used & ((unsigned short) 1 << i)) {
            /* Keep in 'used' only the bits 0..i-1. */
            used &= ((unsigned short) 1 << i) - 1;
            /* Add 'summary->indx' and the number of bits set in 'used'. */
            used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
            used = (used & 0x3333) + ((used & 0xcccc) >> 2);
            used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
            used = (used & 0x00ff) + (used >> 8);
            *r = jisx0208_2charset[summary->indx + used];
            return 2;
        }
    }
    return 0;
}

/*
 * SHIFT_JIS (libiconv-1.16/lib/sjis.h)
 */

/* Returns 1 or 2 on success, 0 if no mapping */
INTERNAL int sjis_wctomb_zint(unsigned int* r, unsigned int wc) {
    int ret;

    /* Try JIS X 0201-1976. */
    ret = jisx0201_wctomb(r, wc);
    if (ret) {
        return ret;
    }

    /* Try JIS X 0208-1990. */
    /* ZINT: Note leaving mapping of full-width reverse solidus U+FF3C to 0x815F (duplicate of patched U+005C) to avoid having to regen tables */
    ret = jisx0208_wctomb(r, wc);
    if (ret) {
        return ret;
    }

    /* User-defined range. See
    * Ken Lunde's "CJKV Information Processing", table 4-66, p. 206. */
    /* ZINT: https://file.allitebooks.com/20160708/CJKV%20Information%20Processing.pdf (table 4-86, p. 286, 2nd ed.) */
    if (wc >= 0xe000 && wc < 0xe758) {
        unsigned char c1, c2;
        c1 = (unsigned int) (wc - 0xe000) / 188;
        c2 = (unsigned int) (wc - 0xe000) % 188;
        *r = ((c1 + 0xf0) << 8) | (c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
        return 2;
    }

    return 0;
}

/* Convert UTF-8 string to Shift JIS and place in array of ints */
INTERNAL int sjis_utf8tomb(struct zint_symbol *symbol, const unsigned char source[], size_t* p_length, unsigned int* jisdata) {
    int i, error_number;
    unsigned int length;
#ifndef _MSC_VER
    unsigned int utfdata[*p_length + 1];
#else
    unsigned int* utfdata = (unsigned int*) _alloca((*p_length + 1) * sizeof(unsigned int));
#endif

    error_number = utf8_to_unicode(symbol, source, utfdata, p_length, 1 /*disallow_4byte*/);
    if (error_number != 0) {
        return error_number;
    }

    for (i = 0, length = *p_length; i < length; i++) {
        if (!sjis_wctomb_zint(jisdata + i, utfdata[i])) {
            strcpy(symbol->errtxt, "800: Invalid character in input data");
            return ZINT_ERROR_INVALID_DATA;
        }
    }

    return 0;
}

/* Convert UTF-8 string to single byte ECI and place in array of ints */
INTERNAL int sjis_utf8tosb(int eci, const unsigned char source[], size_t* p_length, unsigned int* jisdata) {
    int error_number;
#ifndef _MSC_VER
    unsigned char single_byte[*p_length + 1];
#else
    unsigned char* single_byte = (unsigned char*) _alloca(*p_length + 1);
#endif

    error_number = utf_to_eci(eci, source, single_byte, p_length);
    if (error_number != 0) {
        // Note not setting `symbol->errtxt`, up to caller
        return error_number;
    }

    sjis_cpy(single_byte, p_length, jisdata);

    return 0;
}

/* Copy byte input stream to array of ints, putting double-bytes that match QR Kanji mode in single entry */
INTERNAL void sjis_cpy(const unsigned char source[], size_t* p_length, unsigned int* jisdata) {
    int i, j;
    unsigned int jis, length;
    unsigned char c;
    for (i = 0, j = 0, length = *p_length; i < length; i++, j++) {
        c = source[i];
        if (((c >= 0x81 && c <= 0x9F) || (c >= 0xE0 && c <= 0xEB)) && length - i >= 2) {
            jis = (c << 8) | source[i + 1];
            if ((jis >= 0x8140 && jis <= 0x9FFC) || (jis >= 0xE040 && jis <= 0xEBBF)) {
                /* This may or may not be valid Shift JIS, but don't care as long as it can be encoded in QR Kanji mode */
                jisdata[j] = jis;
                i++;
            } else {
                jisdata[j] = c;
            }
        } else {
            jisdata[j] = c;
        }
    }
    *p_length = j;
}
Changes to jni/zint/backend/sjis.h.
1
2
3
4
5
6
7
8
/*  sjis.h - Unicode to Shift JIS lookup table

    libzint - the open source barcode library
    Copyright (C) 2009-2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
|







1
2
3
4
5
6
7
8
/*  sjis.h - Unicode to Shift JIS

    libzint - the open source barcode library
    Copyright (C) 2009-2017 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817

5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

/* Derived from :
## Shift_JIS (JIS X 0208:1997 Appendix 1) vs Unicode mapping table
##
## Date: 06 Mar 2002 06:01:22 GMT
## License:
## 	Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
## 	Copyright (C) 2001 I'O, All Rights Reserved.
## 	You can use, modify, distribute this table freely.
 */

static const unsigned short int sjis_lookup[] = {
    0x005C, 0x815F, // REVERSE SOLIDUS
    0x00A2, 0x8191, // CENT SIGN
    0x00A3, 0x8192, // POUND SIGN
    0x00A7, 0x8198, // SECTION SIGN
    0x00A8, 0x814E, // DIAERESIS
    0x00AC, 0x81CA, // NOT SIGN
    0x00B0, 0x818B, // DEGREE SIGN
    0x00B1, 0x817D, // PLUS-MINUS SIGN
    0x00B4, 0x814C, // ACUTE ACCENT
    0x00B6, 0x81F7, // PILCROW SIGN
    0x00D7, 0x817E, // MULTIPLICATION SIGN
    0x00F7, 0x8180, // DIVISION SIGN
    0x0391, 0x839F, // GREEK CAPITAL LETTER ALPHA
    0x0392, 0x83A0, // GREEK CAPITAL LETTER BETA
    0x0393, 0x83A1, // GREEK CAPITAL LETTER GAMMA
    0x0394, 0x83A2, // GREEK CAPITAL LETTER DELTA
    0x0395, 0x83A3, // GREEK CAPITAL LETTER EPSILON
    0x0396, 0x83A4, // GREEK CAPITAL LETTER ZETA
    0x0397, 0x83A5, // GREEK CAPITAL LETTER ETA
    0x0398, 0x83A6, // GREEK CAPITAL LETTER THETA
    0x0399, 0x83A7, // GREEK CAPITAL LETTER IOTA
    0x039A, 0x83A8, // GREEK CAPITAL LETTER KAPPA
    0x039B, 0x83A9, // GREEK CAPITAL LETTER LAMDA
    0x039C, 0x83AA, // GREEK CAPITAL LETTER MU
    0x039D, 0x83AB, // GREEK CAPITAL LETTER NU
    0x039E, 0x83AC, // GREEK CAPITAL LETTER XI
    0x039F, 0x83AD, // GREEK CAPITAL LETTER OMICRON
    0x03A0, 0x83AE, // GREEK CAPITAL LETTER PI
    0x03A1, 0x83AF, // GREEK CAPITAL LETTER RHO
    0x03A3, 0x83B0, // GREEK CAPITAL LETTER SIGMA
    0x03A4, 0x83B1, // GREEK CAPITAL LETTER TAU
    0x03A5, 0x83B2, // GREEK CAPITAL LETTER UPSILON
    0x03A6, 0x83B3, // GREEK CAPITAL LETTER PHI
    0x03A7, 0x83B4, // GREEK CAPITAL LETTER CHI
    0x03A8, 0x83B5, // GREEK CAPITAL LETTER PSI
    0x03A9, 0x83B6, // GREEK CAPITAL LETTER OMEGA
    0x03B1, 0x83BF, // GREEK SMALL LETTER ALPHA
    0x03B2, 0x83C0, // GREEK SMALL LETTER BETA
    0x03B3, 0x83C1, // GREEK SMALL LETTER GAMMA
    0x03B4, 0x83C2, // GREEK SMALL LETTER DELTA
    0x03B5, 0x83C3, // GREEK SMALL LETTER EPSILON
    0x03B6, 0x83C4, // GREEK SMALL LETTER ZETA
    0x03B7, 0x83C5, // GREEK SMALL LETTER ETA
    0x03B8, 0x83C6, // GREEK SMALL LETTER THETA
    0x03B9, 0x83C7, // GREEK SMALL LETTER IOTA
    0x03BA, 0x83C8, // GREEK SMALL LETTER KAPPA
    0x03BB, 0x83C9, // GREEK SMALL LETTER LAMDA
    0x03BC, 0x83CA, // GREEK SMALL LETTER MU
    0x03BD, 0x83CB, // GREEK SMALL LETTER NU
    0x03BE, 0x83CC, // GREEK SMALL LETTER XI
    0x03BF, 0x83CD, // GREEK SMALL LETTER OMICRON
    0x03C0, 0x83CE, // GREEK SMALL LETTER PI
    0x03C1, 0x83CF, // GREEK SMALL LETTER RHO
    0x03C3, 0x83D0, // GREEK SMALL LETTER SIGMA
    0x03C4, 0x83D1, // GREEK SMALL LETTER TAU
    0x03C5, 0x83D2, // GREEK SMALL LETTER UPSILON
    0x03C6, 0x83D3, // GREEK SMALL LETTER PHI
    0x03C7, 0x83D4, // GREEK SMALL LETTER CHI
    0x03C8, 0x83D5, // GREEK SMALL LETTER PSI
    0x03C9, 0x83D6, // GREEK SMALL LETTER OMEGA
    0x0401, 0x8446, // CYRILLIC CAPITAL LETTER IO
    0x0410, 0x8440, // CYRILLIC CAPITAL LETTER A
    0x0411, 0x8441, // CYRILLIC CAPITAL LETTER BE
    0x0412, 0x8442, // CYRILLIC CAPITAL LETTER VE
    0x0413, 0x8443, // CYRILLIC CAPITAL LETTER GHE
    0x0414, 0x8444, // CYRILLIC CAPITAL LETTER DE
    0x0415, 0x8445, // CYRILLIC CAPITAL LETTER IE
    0x0416, 0x8447, // CYRILLIC CAPITAL LETTER ZHE
    0x0417, 0x8448, // CYRILLIC CAPITAL LETTER ZE
    0x0418, 0x8449, // CYRILLIC CAPITAL LETTER I
    0x0419, 0x844A, // CYRILLIC CAPITAL LETTER SHORT I
    0x041A, 0x844B, // CYRILLIC CAPITAL LETTER KA
    0x041B, 0x844C, // CYRILLIC CAPITAL LETTER EL
    0x041C, 0x844D, // CYRILLIC CAPITAL LETTER EM
    0x041D, 0x844E, // CYRILLIC CAPITAL LETTER EN
    0x041E, 0x844F, // CYRILLIC CAPITAL LETTER O
    0x041F, 0x8450, // CYRILLIC CAPITAL LETTER PE
    0x0420, 0x8451, // CYRILLIC CAPITAL LETTER ER
    0x0421, 0x8452, // CYRILLIC CAPITAL LETTER ES
    0x0422, 0x8453, // CYRILLIC CAPITAL LETTER TE
    0x0423, 0x8454, // CYRILLIC CAPITAL LETTER U
    0x0424, 0x8455, // CYRILLIC CAPITAL LETTER EF
    0x0425, 0x8456, // CYRILLIC CAPITAL LETTER HA
    0x0426, 0x8457, // CYRILLIC CAPITAL LETTER TSE
    0x0427, 0x8458, // CYRILLIC CAPITAL LETTER CHE
    0x0428, 0x8459, // CYRILLIC CAPITAL LETTER SHA
    0x0429, 0x845A, // CYRILLIC CAPITAL LETTER SHCHA
    0x042B, 0x845C, // CYRILLIC CAPITAL LETTER YERU
    0x042C, 0x845D, // CYRILLIC CAPITAL LETTER SOFT SIGN
    0x042D, 0x845E, // CYRILLIC CAPITAL LETTER E
    0x042E, 0x845F, // CYRILLIC CAPITAL LETTER YU
    0x042F, 0x8460, // CYRILLIC CAPITAL LETTER YA
    0x0430, 0x8470, // CYRILLIC SMALL LETTER A
    0x0431, 0x8471, // CYRILLIC SMALL LETTER BE
    0x0432, 0x8472, // CYRILLIC SMALL LETTER VE
    0x0433, 0x8473, // CYRILLIC SMALL LETTER GHE
    0x0434, 0x8474, // CYRILLIC SMALL LETTER DE
    0x0435, 0x8475, // CYRILLIC SMALL LETTER IE
    0x0436, 0x8477, // CYRILLIC SMALL LETTER ZHE
    0x0437, 0x8478, // CYRILLIC SMALL LETTER ZE
    0x0438, 0x8479, // CYRILLIC SMALL LETTER I
    0x0439, 0x847A, // CYRILLIC SMALL LETTER SHORT I
    0x043A, 0x847B, // CYRILLIC SMALL LETTER KA
    0x043B, 0x847C, // CYRILLIC SMALL LETTER EL
    0x043C, 0x847D, // CYRILLIC SMALL LETTER EM
    0x043D, 0x847E, // CYRILLIC SMALL LETTER EN
    0x043E, 0x8480, // CYRILLIC SMALL LETTER O
    0x043F, 0x8481, // CYRILLIC SMALL LETTER PE
    0x0440, 0x8482, // CYRILLIC SMALL LETTER ER
    0x0441, 0x8483, // CYRILLIC SMALL LETTER ES
    0x0442, 0x8484, // CYRILLIC SMALL LETTER TE
    0x0443, 0x8485, // CYRILLIC SMALL LETTER U
    0x0444, 0x8486, // CYRILLIC SMALL LETTER EF
    0x0445, 0x8487, // CYRILLIC SMALL LETTER HA
    0x0446, 0x8488, // CYRILLIC SMALL LETTER TSE
    0x0447, 0x8489, // CYRILLIC SMALL LETTER CHE
    0x0448, 0x848A, // CYRILLIC SMALL LETTER SHA
    0x0449, 0x848B, // CYRILLIC SMALL LETTER SHCHA
    0x044A, 0x848C, // CYRILLIC SMALL LETTER HARD SIGN
    0x044B, 0x848D, // CYRILLIC SMALL LETTER YERU
    0x044C, 0x848E, // CYRILLIC SMALL LETTER SOFT SIGN
    0x044D, 0x848F, // CYRILLIC SMALL LETTER E
    0x044E, 0x8490, // CYRILLIC SMALL LETTER YU
    0x044F, 0x8491, // CYRILLIC SMALL LETTER YA
    0x0451, 0x8476, // CYRILLIC SMALL LETTER IO
    0x2010, 0x815D, // HYPHEN
    0x2014, 0x815C, // EM DASH
    0x2016, 0x8161, // DOUBLE VERTICAL LINE
    0x2018, 0x8165, // LEFT SINGLE QUOTATION MARK
    0x2019, 0x8166, // RIGHT SINGLE QUOTATION MARK
    0x201C, 0x8167, // LEFT DOUBLE QUOTATION MARK
    0x201D, 0x8168, // RIGHT DOUBLE QUOTATION MARK
    0x2020, 0x81F5, // DAGGER
    0x2021, 0x81F6, // DOUBLE DAGGER
    0x2025, 0x8164, // TWO DOT LEADER
    0x2026, 0x8163, // HORIZONTAL ELLIPSIS
    0x2030, 0x81F1, // PER MILLE SIGN
    0x2032, 0x818C, // PRIME
    0x2033, 0x818D, // DOUBLE PRIME
    0x203B, 0x81A6, // REFERENCE MARK
    0x2103, 0x818E, // DEGREE CELSIUS
    0x212B, 0x81F0, // ANGSTROM SIGN
    0x2190, 0x81A9, // LEFTWARDS ARROW
    0x2191, 0x81AA, // UPWARDS ARROW
    0x2192, 0x81A8, // RIGHTWARDS ARROW
    0x2193, 0x81AB, // DOWNWARDS ARROW
    0x21D2, 0x81CB, // RIGHTWARDS DOUBLE ARROW
    0x21D4, 0x81CC, // LEFT RIGHT DOUBLE ARROW
    0x2200, 0x81CD, // FOR ALL
    0x2202, 0x81DD, // PARTIAL DIFFERENTIAL
    0x2203, 0x81CE, // THERE EXISTS
    0x2207, 0x81DE, // NABLA
    0x2208, 0x81B8, // ELEMENT OF
    0x220B, 0x81B9, // CONTAINS AS MEMBER
    0x2212, 0x817C, // MINUS SIGN
    0x221A, 0x81E3, // SQUARE ROOT
    0x221D, 0x81E5, // PROPORTIONAL TO
    0x221E, 0x8187, // INFINITY
    0x2220, 0x81DA, // ANGLE
    0x2227, 0x81C8, // LOGICAL AND
    0x2228, 0x81C9, // LOGICAL OR
    0x2229, 0x81BF, // INTERSECTION
    0x222A, 0x81BE, // UNION
    0x222B, 0x81E7, // INTEGRAL
    0x222C, 0x81E8, // DOUBLE INTEGRAL
    0x2234, 0x8188, // THEREFORE
    0x2235, 0x81E6, // BECAUSE
    0x223D, 0x81E4, // REVERSED TILDE
    0x2252, 0x81E0, // APPROXIMATELY EQUAL TO OR THE IMAGE OF
    0x2260, 0x8182, // NOT EQUAL TO
    0x2261, 0x81DF, // IDENTICAL TO
    0x2266, 0x8185, // LESS-THAN OVER EQUAL TO
    0x2267, 0x8186, // GREATER-THAN OVER EQUAL TO
    0x226A, 0x81E1, // MUCH LESS-THAN
    0x226B, 0x81E2, // MUCH GREATER-THAN
    0x2282, 0x81BC, // SUBSET OF
    0x2283, 0x81BD, // SUPERSET OF
    0x2286, 0x81BA, // SUBSET OF OR EQUAL TO
    0x2287, 0x81BB, // SUPERSET OF OR EQUAL TO
    0x22A5, 0x81DB, // UP TACK
    0x2312, 0x81DC, // ARC
    0x2500, 0x849F, // BOX DRAWINGS LIGHT HORIZONTAL
    0x2501, 0x84AA, // BOX DRAWINGS HEAVY HORIZONTAL
    0x2502, 0x84A0, // BOX DRAWINGS LIGHT VERTICAL
    0x2503, 0x84AB, // BOX DRAWINGS HEAVY VERTICAL
    0x250C, 0x84A1, // BOX DRAWINGS LIGHT DOWN AND RIGHT
    0x250F, 0x84AC, // BOX DRAWINGS HEAVY DOWN AND RIGHT
    0x2510, 0x84A2, // BOX DRAWINGS LIGHT DOWN AND LEFT
    0x2513, 0x84AD, // BOX DRAWINGS HEAVY DOWN AND LEFT
    0x2514, 0x84A4, // BOX DRAWINGS LIGHT UP AND RIGHT
    0x2517, 0x84AF, // BOX DRAWINGS HEAVY UP AND RIGHT
    0x2518, 0x84A3, // BOX DRAWINGS LIGHT UP AND LEFT
    0x251B, 0x84AE, // BOX DRAWINGS HEAVY UP AND LEFT
    0x251C, 0x84A5, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
    0x251D, 0x84BA, // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
    0x2520, 0x84B5, // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
    0x2523, 0x84B0, // BOX DRAWINGS HEAVY VERTICAL AND RIGHT
    0x2524, 0x84A7, // BOX DRAWINGS LIGHT VERTICAL AND LEFT
    0x2525, 0x84BC, // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
    0x2528, 0x84B7, // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
    0x252B, 0x84B2, // BOX DRAWINGS HEAVY VERTICAL AND LEFT
    0x252C, 0x84A6, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
    0x252F, 0x84B6, // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
    0x2530, 0x84BB, // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
    0x2533, 0x84B1, // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
    0x2534, 0x84A8, // BOX DRAWINGS LIGHT UP AND HORIZONTAL
    0x2537, 0x84B8, // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
    0x2538, 0x84BD, // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
    0x253B, 0x84B3, // BOX DRAWINGS HEAVY UP AND HORIZONTAL
    0x253C, 0x84A9, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
    0x253F, 0x84B9, // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
    0x2542, 0x84BE, // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
    0x254B, 0x84B4, // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
    0x25A0, 0x81A1, // BLACK SQUARE
    0x25A1, 0x81A0, // WHITE SQUARE
    0x25B2, 0x81A3, // BLACK UP-POINTING TRIANGLE
    0x25B3, 0x81A2, // WHITE UP-POINTING TRIANGLE
    0x25BC, 0x81A5, // BLACK DOWN-POINTING TRIANGLE
    0x25BD, 0x81A4, // WHITE DOWN-POINTING TRIANGLE
    0x25C6, 0x819F, // BLACK DIAMOND
    0x25C7, 0x819E, // WHITE DIAMOND
    0x25CB, 0x819B, // WHITE CIRCLE
    0x25CE, 0x819D, // BULLSEYE
    0x25CF, 0x819C, // BLACK CIRCLE
    0x25EF, 0x81FC, // LARGE CIRCLE
    0x2605, 0x819A, // BLACK STAR
    0x2606, 0x8199, // WHITE STAR
    0x2640, 0x818A, // FEMALE SIGN
    0x2642, 0x8189, // MALE SIGN
    0x266A, 0x81F4, // EIGHTH NOTE
    0x266D, 0x81F3, // MUSIC FLAT SIGN
    0x266F, 0x81F2, // MUSIC SHARP SIGN
    0x3000, 0x8140, // IDEOGRAPHIC SPACE
    0x3001, 0x8141, // IDEOGRAPHIC COMMA
    0x3002, 0x8142, // IDEOGRAPHIC FULL STOP
    0x3003, 0x8156, // DITTO MARK
    0x3005, 0x8158, // IDEOGRAPHIC ITERATION MARK
    0x3006, 0x8159, // IDEOGRAPHIC CLOSING MARK
    0x3007, 0x815A, // IDEOGRAPHIC NUMBER ZERO
    0x3008, 0x8171, // LEFT ANGLE BRACKET
    0x3009, 0x8172, // RIGHT ANGLE BRACKET
    0x300A, 0x8173, // LEFT DOUBLE ANGLE BRACKET
    0x300B, 0x8174, // RIGHT DOUBLE ANGLE BRACKET
    0x300C, 0x8175, // LEFT CORNER BRACKET
    0x300D, 0x8176, // RIGHT CORNER BRACKET
    0x300E, 0x8177, // LEFT WHITE CORNER BRACKET
    0x300F, 0x8178, // RIGHT WHITE CORNER BRACKET
    0x3010, 0x8179, // LEFT BLACK LENTICULAR BRACKET
    0x3011, 0x817A, // RIGHT BLACK LENTICULAR BRACKET
    0x3012, 0x81A7, // POSTAL MARK
    0x3013, 0x81AC, // GETA MARK
    0x3014, 0x816B, // LEFT TORTOISE SHELL BRACKET
    0x3015, 0x816C, // RIGHT TORTOISE SHELL BRACKET
    0x301C, 0x8160, // WAVE DASH
    0x3041, 0x829F, // HIRAGANA LETTER SMALL A
    0x3042, 0x82A0, // HIRAGANA LETTER A
    0x3043, 0x82A1, // HIRAGANA LETTER SMALL I
    0x3044, 0x82A2, // HIRAGANA LETTER I
    0x3045, 0x82A3, // HIRAGANA LETTER SMALL U
    0x3046, 0x82A4, // HIRAGANA LETTER U
    0x3047, 0x82A5, // HIRAGANA LETTER SMALL E
    0x3048, 0x82A6, // HIRAGANA LETTER E
    0x3049, 0x82A7, // HIRAGANA LETTER SMALL O
    0x304A, 0x82A8, // HIRAGANA LETTER O
    0x304B, 0x82A9, // HIRAGANA LETTER KA
    0x304C, 0x82AA, // HIRAGANA LETTER GA
    0x304D, 0x82AB, // HIRAGANA LETTER KI
    0x304E, 0x82AC, // HIRAGANA LETTER GI
    0x304F, 0x82AD, // HIRAGANA LETTER KU
    0x3050, 0x82AE, // HIRAGANA LETTER GU
    0x3051, 0x82AF, // HIRAGANA LETTER KE
    0x3052, 0x82B0, // HIRAGANA LETTER GE
    0x3053, 0x82B1, // HIRAGANA LETTER KO
    0x3054, 0x82B2, // HIRAGANA LETTER GO
    0x3055, 0x82B3, // HIRAGANA LETTER SA
    0x3056, 0x82B4, // HIRAGANA LETTER ZA
    0x3057, 0x82B5, // HIRAGANA LETTER SI
    0x3058, 0x82B6, // HIRAGANA LETTER ZI
    0x3059, 0x82B7, // HIRAGANA LETTER SU
    0x305A, 0x82B8, // HIRAGANA LETTER ZU
    0x305B, 0x82B9, // HIRAGANA LETTER SE
    0x305C, 0x82BA, // HIRAGANA LETTER ZE
    0x305D, 0x82BB, // HIRAGANA LETTER SO
    0x305E, 0x82BC, // HIRAGANA LETTER ZO
    0x305F, 0x82BD, // HIRAGANA LETTER TA
    0x3060, 0x82BE, // HIRAGANA LETTER DA
    0x3061, 0x82BF, // HIRAGANA LETTER TI
    0x3062, 0x82C0, // HIRAGANA LETTER DI
    0x3063, 0x82C1, // HIRAGANA LETTER SMALL TU
    0x3064, 0x82C2, // HIRAGANA LETTER TU
    0x3065, 0x82C3, // HIRAGANA LETTER DU
    0x3066, 0x82C4, // HIRAGANA LETTER TE
    0x3067, 0x82C5, // HIRAGANA LETTER DE
    0x3068, 0x82C6, // HIRAGANA LETTER TO
    0x3069, 0x82C7, // HIRAGANA LETTER DO
    0x306A, 0x82C8, // HIRAGANA LETTER NA
    0x306B, 0x82C9, // HIRAGANA LETTER NI
    0x306C, 0x82CA, // HIRAGANA LETTER NU
    0x306D, 0x82CB, // HIRAGANA LETTER NE
    0x306E, 0x82CC, // HIRAGANA LETTER NO
    0x306F, 0x82CD, // HIRAGANA LETTER HA
    0x3070, 0x82CE, // HIRAGANA LETTER BA
    0x3071, 0x82CF, // HIRAGANA LETTER PA
    0x3072, 0x82D0, // HIRAGANA LETTER HI
    0x3073, 0x82D1, // HIRAGANA LETTER BI
    0x3074, 0x82D2, // HIRAGANA LETTER PI
    0x3075, 0x82D3, // HIRAGANA LETTER HU
    0x3076, 0x82D4, // HIRAGANA LETTER BU
    0x3077, 0x82D5, // HIRAGANA LETTER PU
    0x3078, 0x82D6, // HIRAGANA LETTER HE
    0x3079, 0x82D7, // HIRAGANA LETTER BE
    0x307A, 0x82D8, // HIRAGANA LETTER PE
    0x307B, 0x82D9, // HIRAGANA LETTER HO
    0x307C, 0x82DA, // HIRAGANA LETTER BO
    0x307D, 0x82DB, // HIRAGANA LETTER PO
    0x307E, 0x82DC, // HIRAGANA LETTER MA
    0x307F, 0x82DD, // HIRAGANA LETTER MI
    0x3080, 0x82DE, // HIRAGANA LETTER MU
    0x3081, 0x82DF, // HIRAGANA LETTER ME
    0x3082, 0x82E0, // HIRAGANA LETTER MO
    0x3083, 0x82E1, // HIRAGANA LETTER SMALL YA
    0x3084, 0x82E2, // HIRAGANA LETTER YA
    0x3085, 0x82E3, // HIRAGANA LETTER SMALL YU
    0x3086, 0x82E4, // HIRAGANA LETTER YU
    0x3087, 0x82E5, // HIRAGANA LETTER SMALL YO
    0x3088, 0x82E6, // HIRAGANA LETTER YO
    0x3089, 0x82E7, // HIRAGANA LETTER RA
    0x308A, 0x82E8, // HIRAGANA LETTER RI
    0x308B, 0x82E9, // HIRAGANA LETTER RU
    0x308C, 0x82EA, // HIRAGANA LETTER RE
    0x308D, 0x82EB, // HIRAGANA LETTER RO
    0x308E, 0x82EC, // HIRAGANA LETTER SMALL WA
    0x308F, 0x82ED, // HIRAGANA LETTER WA
    0x3090, 0x82EE, // HIRAGANA LETTER WI
    0x3091, 0x82EF, // HIRAGANA LETTER WE
    0x3092, 0x82F0, // HIRAGANA LETTER WO
    0x3093, 0x82F1, // HIRAGANA LETTER N
    0x309B, 0x814A, // KATAKANA-HIRAGANA VOICED SOUND MARK
    0x309C, 0x814B, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
    0x309D, 0x8154, // HIRAGANA ITERATION MARK
    0x309E, 0x8155, // HIRAGANA VOICED ITERATION MARK
    0x30A1, 0x8340, // KATAKANA LETTER SMALL A
    0x30A2, 0x8341, // KATAKANA LETTER A
    0x30A3, 0x8342, // KATAKANA LETTER SMALL I
    0x30A4, 0x8343, // KATAKANA LETTER I
    0x30A5, 0x8344, // KATAKANA LETTER SMALL U
    0x30A6, 0x8345, // KATAKANA LETTER U
    0x30A7, 0x8346, // KATAKANA LETTER SMALL E
    0x30A8, 0x8347, // KATAKANA LETTER E
    0x30A9, 0x8348, // KATAKANA LETTER SMALL O
    0x30AA, 0x8349, // KATAKANA LETTER O
    0x30AB, 0x834A, // KATAKANA LETTER KA
    0x30AC, 0x834B, // KATAKANA LETTER GA
    0x30AD, 0x834C, // KATAKANA LETTER KI
    0x30AE, 0x834D, // KATAKANA LETTER GI
    0x30AF, 0x834E, // KATAKANA LETTER KU
    0x30B0, 0x834F, // KATAKANA LETTER GU
    0x30B1, 0x8350, // KATAKANA LETTER KE
    0x30B2, 0x8351, // KATAKANA LETTER GE
    0x30B3, 0x8352, // KATAKANA LETTER KO
    0x30B4, 0x8353, // KATAKANA LETTER GO
    0x30B5, 0x8354, // KATAKANA LETTER SA
    0x30B6, 0x8355, // KATAKANA LETTER ZA
    0x30B7, 0x8356, // KATAKANA LETTER SI
    0x30B8, 0x8357, // KATAKANA LETTER ZI
    0x30B9, 0x8358, // KATAKANA LETTER SU
    0x30BA, 0x8359, // KATAKANA LETTER ZU
    0x30BB, 0x835A, // KATAKANA LETTER SE
    0x30BD, 0x835C, // KATAKANA LETTER SO
    0x30BE, 0x835D, // KATAKANA LETTER ZO
    0x30BF, 0x835E, // KATAKANA LETTER TA
    0x30C0, 0x835F, // KATAKANA LETTER DA
    0x30C1, 0x8360, // KATAKANA LETTER TI
    0x30C2, 0x8361, // KATAKANA LETTER DI
    0x30C3, 0x8362, // KATAKANA LETTER SMALL TU
    0x30C4, 0x8363, // KATAKANA LETTER TU
    0x30C5, 0x8364, // KATAKANA LETTER DU
    0x30C6, 0x8365, // KATAKANA LETTER TE
    0x30C7, 0x8366, // KATAKANA LETTER DE
    0x30C8, 0x8367, // KATAKANA LETTER TO
    0x30C9, 0x8368, // KATAKANA LETTER DO
    0x30CA, 0x8369, // KATAKANA LETTER NA
    0x30CB, 0x836A, // KATAKANA LETTER NI
    0x30CC, 0x836B, // KATAKANA LETTER NU
    0x30CD, 0x836C, // KATAKANA LETTER NE
    0x30CE, 0x836D, // KATAKANA LETTER NO
    0x30CF, 0x836E, // KATAKANA LETTER HA
    0x30D0, 0x836F, // KATAKANA LETTER BA
    0x30D1, 0x8370, // KATAKANA LETTER PA
    0x30D2, 0x8371, // KATAKANA LETTER HI
    0x30D3, 0x8372, // KATAKANA LETTER BI
    0x30D4, 0x8373, // KATAKANA LETTER PI
    0x30D5, 0x8374, // KATAKANA LETTER HU
    0x30D6, 0x8375, // KATAKANA LETTER BU
    0x30D7, 0x8376, // KATAKANA LETTER PU
    0x30D8, 0x8377, // KATAKANA LETTER HE
    0x30D9, 0x8378, // KATAKANA LETTER BE
    0x30DA, 0x8379, // KATAKANA LETTER PE
    0x30DB, 0x837A, // KATAKANA LETTER HO
    0x30DC, 0x837B, // KATAKANA LETTER BO
    0x30DD, 0x837C, // KATAKANA LETTER PO
    0x30DE, 0x837D, // KATAKANA LETTER MA
    0x30DF, 0x837E, // KATAKANA LETTER MI
    0x30E0, 0x8380, // KATAKANA LETTER MU
    0x30E1, 0x8381, // KATAKANA LETTER ME
    0x30E2, 0x8382, // KATAKANA LETTER MO
    0x30E3, 0x8383, // KATAKANA LETTER SMALL YA
    0x30E4, 0x8384, // KATAKANA LETTER YA
    0x30E5, 0x8385, // KATAKANA LETTER SMALL YU
    0x30E6, 0x8386, // KATAKANA LETTER YU
    0x30E7, 0x8387, // KATAKANA LETTER SMALL YO
    0x30E8, 0x8388, // KATAKANA LETTER YO
    0x30E9, 0x8389, // KATAKANA LETTER RA
    0x30EA, 0x838A, // KATAKANA LETTER RI
    0x30EB, 0x838B, // KATAKANA LETTER RU
    0x30EC, 0x838C, // KATAKANA LETTER RE
    0x30ED, 0x838D, // KATAKANA LETTER RO
    0x30EE, 0x838E, // KATAKANA LETTER SMALL WA
    0x30EF, 0x838F, // KATAKANA LETTER WA
    0x30F0, 0x8390, // KATAKANA LETTER WI
    0x30F1, 0x8391, // KATAKANA LETTER WE
    0x30F2, 0x8392, // KATAKANA LETTER WO
    0x30F3, 0x8393, // KATAKANA LETTER N
    0x30F4, 0x8394, // KATAKANA LETTER VU
    0x30F5, 0x8395, // KATAKANA LETTER SMALL KA
    0x30F6, 0x8396, // KATAKANA LETTER SMALL KE
    0x30FB, 0x8145, // KATAKANA MIDDLE DOT
    0x30FD, 0x8152, // KATAKANA ITERATION MARK
    0x30FE, 0x8153, // KATAKANA VOICED ITERATION MARK
    0x4E00, 0x88EA, // <cjk>
    0x4E01, 0x929A, // <cjk>
    0x4E03, 0x8EB5, // <cjk>
    0x4E07, 0x969C, // <cjk>
    0x4E08, 0x8FE4, // <cjk>
    0x4E09, 0x8E4F, // <cjk>
    0x4E0A, 0x8FE3, // <cjk>
    0x4E0B, 0x89BA, // <cjk>
    0x4E0D, 0x9573, // <cjk>
    0x4E0E, 0x975E, // <cjk>
    0x4E10, 0x98A0, // <cjk>
    0x4E11, 0x894E, // <cjk>
    0x4E14, 0x8A8E, // <cjk>
    0x4E15, 0x98A1, // <cjk>
    0x4E16, 0x90A2, // <cjk>
    0x4E17, 0x99C0, // <cjk>
    0x4E18, 0x8B75, // <cjk>
    0x4E19, 0x95B8, // <cjk>
    0x4E1E, 0x8FE5, // <cjk>
    0x4E21, 0x97BC, // <cjk>
    0x4E26, 0x95C0, // <cjk>
    0x4E2A, 0x98A2, // <cjk>
    0x4E2D, 0x9286, // <cjk>
    0x4E31, 0x98A3, // <cjk>
    0x4E32, 0x8BF8, // <cjk>
    0x4E36, 0x98A4, // <cjk>
    0x4E38, 0x8ADB, // <cjk>
    0x4E39, 0x924F, // <cjk>
    0x4E3B, 0x8EE5, // <cjk>
    0x4E3C, 0x98A5, // <cjk>
    0x4E3F, 0x98A6, // <cjk>
    0x4E42, 0x98A7, // <cjk>
    0x4E43, 0x9454, // <cjk>
    0x4E45, 0x8B76, // <cjk>
    0x4E4B, 0x9456, // <cjk>
    0x4E4D, 0x93E1, // <cjk>
    0x4E4E, 0x8CC1, // <cjk>
    0x4E4F, 0x9652, // <cjk>
    0x4E55, 0xE568, // <cjk>
    0x4E56, 0x98A8, // <cjk>
    0x4E57, 0x8FE6, // <cjk>
    0x4E58, 0x98A9, // <cjk>
    0x4E59, 0x89B3, // <cjk>
    0x4E5D, 0x8BE3, // <cjk>
    0x4E5E, 0x8CEE, // <cjk>
    0x4E5F, 0x96E7, // <cjk>
    0x4E62, 0x9BA4, // <cjk>
    0x4E71, 0x9790, // <cjk>
    0x4E73, 0x93FB, // <cjk>
    0x4E7E, 0x8AA3, // <cjk>
    0x4E80, 0x8B54, // <cjk>
    0x4E82, 0x98AA, // <cjk>
    0x4E85, 0x98AB, // <cjk>
    0x4E86, 0x97B9, // <cjk>
    0x4E88, 0x975C, // <cjk>
    0x4E89, 0x9188, // <cjk>
    0x4E8A, 0x98AD, // <cjk>
    0x4E8B, 0x8E96, // <cjk>
    0x4E8C, 0x93F1, // <cjk>
    0x4E8E, 0x98B0, // <cjk>
    0x4E91, 0x895D, // <cjk>
    0x4E92, 0x8CDD, // <cjk>
    0x4E94, 0x8CDC, // <cjk>
    0x4E95, 0x88E4, // <cjk>
    0x4E98, 0x986A, // <cjk>
    0x4E99, 0x9869, // <cjk>
    0x4E9B, 0x8DB1, // <cjk>
    0x4E9C, 0x889F, // <cjk>
    0x4E9E, 0x98B1, // <cjk>
    0x4E9F, 0x98B2, // <cjk>
    0x4EA0, 0x98B3, // <cjk>
    0x4EA1, 0x9653, // <cjk>
    0x4EA2, 0x98B4, // <cjk>
    0x4EA4, 0x8CF0, // <cjk>
    0x4EA5, 0x88E5, // <cjk>
    0x4EA6, 0x9692, // <cjk>
    0x4EA8, 0x8B9C, // <cjk>
    0x4EAB, 0x8B9D, // <cjk>
    0x4EAC, 0x8B9E, // <cjk>
    0x4EAD, 0x92E0, // <cjk>
    0x4EAE, 0x97BA, // <cjk>
    0x4EB0, 0x98B5, // <cjk>
    0x4EB3, 0x98B6, // <cjk>
    0x4EB6, 0x98B7, // <cjk>
    0x4EBA, 0x906C, // <cjk>
    0x4EC0, 0x8F59, // <cjk>
    0x4EC1, 0x906D, // <cjk>
    0x4EC2, 0x98BC, // <cjk>
    0x4EC4, 0x98BA, // <cjk>
    0x4EC6, 0x98BB, // <cjk>
    0x4EC7, 0x8B77, // <cjk>
    0x4ECA, 0x8DA1, // <cjk>
    0x4ECB, 0x89EE, // <cjk>
    0x4ECD, 0x98B9, // <cjk>
    0x4ECE, 0x98B8, // <cjk>
    0x4ECF, 0x95A7, // <cjk>
    0x4ED4, 0x8E65, // <cjk>
    0x4ED5, 0x8E64, // <cjk>
    0x4ED6, 0x91BC, // <cjk>
    0x4ED7, 0x98BD, // <cjk>
    0x4ED8, 0x9574, // <cjk>
    0x4ED9, 0x90E5, // <cjk>
    0x4EDD, 0x8157, // <cjk>
    0x4EDE, 0x98BE, // <cjk>
    0x4EDF, 0x98C0, // <cjk>
    0x4EE3, 0x91E3, // <cjk>
    0x4EE4, 0x97DF, // <cjk>
    0x4EE5, 0x88C8, // <cjk>
    0x4EED, 0x98BF, // <cjk>
    0x4EEE, 0x89BC, // <cjk>
    0x4EF0, 0x8BC2, // <cjk>
    0x4EF2, 0x9287, // <cjk>
    0x4EF6, 0x8C8F, // <cjk>
    0x4EF7, 0x98C1, // <cjk>
    0x4EFB, 0x9443, // <cjk>
    0x4F01, 0x8AE9, // <cjk>
    0x4F09, 0x98C2, // <cjk>
    0x4F0A, 0x88C9, // <cjk>
    0x4F0D, 0x8CDE, // <cjk>
    0x4F0E, 0x8AEA, // <cjk>
    0x4F0F, 0x959A, // <cjk>
    0x4F10, 0x94B0, // <cjk>
    0x4F11, 0x8B78, // <cjk>
    0x4F1A, 0x89EF, // <cjk>
    0x4F1C, 0x98E5, // <cjk>
    0x4F1D, 0x9360, // <cjk>
    0x4F2F, 0x948C, // <cjk>
    0x4F30, 0x98C4, // <cjk>
    0x4F34, 0x94BA, // <cjk>
    0x4F36, 0x97E0, // <cjk>
    0x4F38, 0x904C, // <cjk>
    0x4F3A, 0x8E66, // <cjk>
    0x4F3C, 0x8E97, // <cjk>
    0x4F3D, 0x89BE, // <cjk>
    0x4F43, 0x92CF, // <cjk>
    0x4F46, 0x9241, // <cjk>
    0x4F47, 0x98C8, // <cjk>
    0x4F4D, 0x88CA, // <cjk>
    0x4F4E, 0x92E1, // <cjk>
    0x4F4F, 0x8F5A, // <cjk>
    0x4F50, 0x8DB2, // <cjk>
    0x4F51, 0x9743, // <cjk>
    0x4F53, 0x91CC, // <cjk>
    0x4F55, 0x89BD, // <cjk>
    0x4F57, 0x98C7, // <cjk>
    0x4F59, 0x975D, // <cjk>
    0x4F5A, 0x98C3, // <cjk>
    0x4F5B, 0x98C5, // <cjk>
    0x4F5C, 0x8DEC, // <cjk>
    0x4F5D, 0x98C6, // <cjk>
    0x4F5E, 0x9B43, // <cjk>
    0x4F69, 0x98CE, // <cjk>
    0x4F6F, 0x98D1, // <cjk>
    0x4F70, 0x98CF, // <cjk>
    0x4F73, 0x89C0, // <cjk>
    0x4F75, 0x95B9, // <cjk>
    0x4F76, 0x98C9, // <cjk>
    0x4F7B, 0x98CD, // <cjk>
    0x4F7C, 0x8CF1, // <cjk>
    0x4F7F, 0x8E67, // <cjk>
    0x4F83, 0x8AA4, // <cjk>
    0x4F86, 0x98D2, // <cjk>
    0x4F88, 0x98CA, // <cjk>
    0x4F8B, 0x97E1, // <cjk>
    0x4F8D, 0x8E98, // <cjk>
    0x4F8F, 0x98CB, // <cjk>
    0x4F91, 0x98D0, // <cjk>
    0x4F96, 0x98D3, // <cjk>
    0x4F98, 0x98CC, // <cjk>
    0x4F9B, 0x8B9F, // <cjk>
    0x4F9D, 0x88CB, // <cjk>
    0x4FA0, 0x8BA0, // <cjk>
    0x4FA1, 0x89BF, // <cjk>
    0x4FAB, 0x9B44, // <cjk>
    0x4FAD, 0x9699, // <cjk>
    0x4FAE, 0x958E, // <cjk>
    0x4FAF, 0x8CF2, // <cjk>
    0x4FB5, 0x904E, // <cjk>
    0x4FB6, 0x97B5, // <cjk>
    0x4FBF, 0x95D6, // <cjk>
    0x4FC2, 0x8C57, // <cjk>
    0x4FC3, 0x91A3, // <cjk>
    0x4FC4, 0x89E2, // <cjk>
    0x4FCA, 0x8F72, // <cjk>
    0x4FCE, 0x98D7, // <cjk>
    0x4FD0, 0x98DC, // <cjk>
    0x4FD1, 0x98DA, // <cjk>
    0x4FD4, 0x98D5, // <cjk>
    0x4FD7, 0x91AD, // <cjk>
    0x4FD8, 0x98D8, // <cjk>
    0x4FDA, 0x98DB, // <cjk>
    0x4FDB, 0x98D9, // <cjk>
    0x4FDD, 0x95DB, // <cjk>
    0x4FDF, 0x98D6, // <cjk>
    0x4FE1, 0x904D, // <cjk>
    0x4FE3, 0x9693, // <cjk>
    0x4FE4, 0x98DD, // <cjk>
    0x4FE5, 0x98DE, // <cjk>
    0x4FEE, 0x8F43, // <cjk>
    0x4FEF, 0x98EB, // <cjk>
    0x4FF3, 0x946F, // <cjk>
    0x4FF5, 0x9555, // <cjk>
    0x4FF6, 0x98E6, // <cjk>
    0x4FF8, 0x95EE, // <cjk>
    0x4FFA, 0x89B4, // <cjk>
    0x4FFE, 0x98EA, // <cjk>
    0x5005, 0x98E4, // <cjk>
    0x5006, 0x98ED, // <cjk>
    0x5009, 0x9171, // <cjk>
    0x500B, 0x8CC2, // <cjk>
    0x500D, 0x947B, // <cjk>
    0x500F, 0xE0C5, // <cjk>
    0x5011, 0x98EC, // <cjk>
    0x5012, 0x937C, // <cjk>
    0x5014, 0x98E1, // <cjk>
    0x5016, 0x8CF4, // <cjk>
    0x5019, 0x8CF3, // <cjk>
    0x501A, 0x98DF, // <cjk>
    0x501F, 0x8ED8, // <cjk>
    0x5021, 0x98E7, // <cjk>
    0x5023, 0x95ED, // <cjk>
    0x5024, 0x926C, // <cjk>
    0x5025, 0x98E3, // <cjk>
    0x5026, 0x8C91, // <cjk>
    0x5028, 0x98E0, // <cjk>
    0x5029, 0x98E8, // <cjk>
    0x502A, 0x98E2, // <cjk>
    0x502B, 0x97CF, // <cjk>
    0x502C, 0x98E9, // <cjk>
    0x502D, 0x9860, // <cjk>
    0x5036, 0x8BE4, // <cjk>
    0x5039, 0x8C90, // <cjk>
    0x5043, 0x98EE, // <cjk>
    0x5047, 0x98EF, // <cjk>
    0x5048, 0x98F3, // <cjk>
    0x5049, 0x88CC, // <cjk>
    0x504F, 0x95CE, // <cjk>
    0x5050, 0x98F2, // <cjk>
    0x5055, 0x98F1, // <cjk>
    0x5056, 0x98F5, // <cjk>
    0x505A, 0x98F4, // <cjk>
    0x505C, 0x92E2, // <cjk>
    0x5065, 0x8C92, // <cjk>
    0x506C, 0x98F6, // <cjk>
    0x5072, 0x8EC3, // <cjk>
    0x5074, 0x91A4, // <cjk>
    0x5075, 0x92E3, // <cjk>
    0x5076, 0x8BF4, // <cjk>
    0x5078, 0x98F7, // <cjk>
    0x507D, 0x8B55, // <cjk>
    0x5080, 0x98F8, // <cjk>
    0x5085, 0x98FA, // <cjk>
    0x508D, 0x9654, // <cjk>
    0x5091, 0x8C86, // <cjk>
    0x5098, 0x8E50, // <cjk>
    0x5099, 0x94F5, // <cjk>
    0x509A, 0x98F9, // <cjk>
    0x50AC, 0x8DC3, // <cjk>
    0x50AD, 0x9762, // <cjk>
    0x50B2, 0x98FC, // <cjk>
    0x50B3, 0x9942, // <cjk>
    0x50B4, 0x98FB, // <cjk>
    0x50B5, 0x8DC2, // <cjk>
    0x50B7, 0x8F9D, // <cjk>
    0x50BE, 0x8C58, // <cjk>
    0x50C2, 0x9943, // <cjk>
    0x50C5, 0x8BCD, // <cjk>
    0x50C9, 0x9940, // <cjk>
    0x50CA, 0x9941, // <cjk>
    0x50CD, 0x93AD, // <cjk>
    0x50CF, 0x919C, // <cjk>
    0x50D1, 0x8BA1, // <cjk>
    0x50D5, 0x966C, // <cjk>
    0x50D6, 0x9944, // <cjk>
    0x50DA, 0x97BB, // <cjk>
    0x50DE, 0x9945, // <cjk>
    0x50E3, 0x9948, // <cjk>
    0x50E5, 0x9946, // <cjk>
    0x50E7, 0x916D, // <cjk>
    0x50ED, 0x9947, // <cjk>
    0x50EE, 0x9949, // <cjk>
    0x50F5, 0x994B, // <cjk>
    0x50F9, 0x994A, // <cjk>
    0x50FB, 0x95C6, // <cjk>
    0x5100, 0x8B56, // <cjk>
    0x5101, 0x994D, // <cjk>
    0x5102, 0x994E, // <cjk>
    0x5104, 0x89AD, // <cjk>
    0x5109, 0x994C, // <cjk>
    0x5112, 0x8EF2, // <cjk>
    0x5114, 0x9951, // <cjk>
    0x5115, 0x9950, // <cjk>
    0x5116, 0x994F, // <cjk>
    0x5118, 0x98D4, // <cjk>
    0x511A, 0x9952, // <cjk>
    0x511F, 0x8F9E, // <cjk>
    0x5121, 0x9953, // <cjk>
    0x512A, 0x9744, // <cjk>
    0x5132, 0x96D7, // <cjk>
    0x5137, 0x9955, // <cjk>
    0x513A, 0x9954, // <cjk>
    0x513B, 0x9957, // <cjk>
    0x513C, 0x9956, // <cjk>
    0x513F, 0x9958, // <cjk>
    0x5140, 0x9959, // <cjk>
    0x5141, 0x88F2, // <cjk>
    0x5143, 0x8CB3, // <cjk>
    0x5144, 0x8C5A, // <cjk>
    0x5146, 0x929B, // <cjk>
    0x5147, 0x8BA2, // <cjk>
    0x5148, 0x90E6, // <cjk>
    0x5149, 0x8CF5, // <cjk>
    0x514B, 0x8D8E, // <cjk>
    0x514D, 0x96C6, // <cjk>
    0x514E, 0x9365, // <cjk>
    0x5150, 0x8E99, // <cjk>
    0x5152, 0x995A, // <cjk>
    0x5154, 0x995C, // <cjk>
    0x515A, 0x937D, // <cjk>
    0x515C, 0x8A95, // <cjk>
    0x5162, 0x995D, // <cjk>
    0x5165, 0x93FC, // <cjk>
    0x5168, 0x9153, // <cjk>
    0x5169, 0x995F, // <cjk>
    0x516A, 0x9960, // <cjk>
    0x516B, 0x94AA, // <cjk>
    0x516C, 0x8CF6, // <cjk>
    0x516D, 0x985A, // <cjk>
    0x516E, 0x9961, // <cjk>
    0x5171, 0x8BA4, // <cjk>
    0x5175, 0x95BA, // <cjk>
    0x5176, 0x91B4, // <cjk>
    0x5177, 0x8BEF, // <cjk>
    0x5178, 0x9354, // <cjk>
    0x517C, 0x8C93, // <cjk>
    0x5180, 0x9962, // <cjk>
    0x5182, 0x9963, // <cjk>
    0x5185, 0x93E0, // <cjk>
    0x5186, 0x897E, // <cjk>
    0x5189, 0x9966, // <cjk>
    0x518A, 0x8DFB, // <cjk>
    0x518C, 0x9965, // <cjk>
    0x518D, 0x8DC4, // <cjk>
    0x518F, 0x9967, // <cjk>
    0x5190, 0xE3EC, // <cjk>
    0x5191, 0x9968, // <cjk>
    0x5192, 0x9660, // <cjk>
    0x5193, 0x9969, // <cjk>
    0x5195, 0x996A, // <cjk>
    0x5196, 0x996B, // <cjk>
    0x5197, 0x8FE7, // <cjk>
    0x5199, 0x8ECA, // <cjk>
    0x51A0, 0x8AA5, // <cjk>
    0x51A2, 0x996E, // <cjk>
    0x51A4, 0x996C, // <cjk>
    0x51A5, 0x96BB, // <cjk>
    0x51A6, 0x996D, // <cjk>
    0x51A8, 0x9579, // <cjk>
    0x51A9, 0x996F, // <cjk>
    0x51AA, 0x9970, // <cjk>
    0x51AB, 0x9971, // <cjk>
    0x51AC, 0x937E, // <cjk>
    0x51B0, 0x9975, // <cjk>
    0x51B1, 0x9973, // <cjk>
    0x51B2, 0x9974, // <cjk>
    0x51B3, 0x9972, // <cjk>
    0x51B4, 0x8DE1, // <cjk>
    0x51B5, 0x9976, // <cjk>
    0x51B6, 0x96E8, // <cjk>
    0x51B7, 0x97E2, // <cjk>
    0x51BD, 0x9977, // <cjk>
    0x51C4, 0x90A6, // <cjk>
    0x51C5, 0x9978, // <cjk>
    0x51C6, 0x8F79, // <cjk>
    0x51C9, 0x9979, // <cjk>
    0x51CB, 0x929C, // <cjk>
    0x51CC, 0x97BD, // <cjk>
    0x51CD, 0x9380, // <cjk>
    0x51D6, 0x99C3, // <cjk>
    0x51DB, 0x997A, // <cjk>
    0x51DC, 0xEAA3, // <cjk>
    0x51DD, 0x8BC3, // <cjk>
    0x51E0, 0x997B, // <cjk>
    0x51E1, 0x967D, // <cjk>
    0x51E6, 0x8F88, // <cjk>
    0x51E7, 0x91FA, // <cjk>
    0x51E9, 0x997D, // <cjk>
    0x51EA, 0x93E2, // <cjk>
    0x51ED, 0x997E, // <cjk>
    0x51F0, 0x9980, // <cjk>
    0x51F1, 0x8A4D, // <cjk>
    0x51F5, 0x9981, // <cjk>
    0x51F6, 0x8BA5, // <cjk>
    0x51F8, 0x93CA, // <cjk>
    0x51F9, 0x899A, // <cjk>
    0x51FA, 0x8F6F, // <cjk>
    0x51FD, 0x949F, // <cjk>
    0x51FE, 0x9982, // <cjk>
    0x5200, 0x9381, // <cjk>
    0x5203, 0x906E, // <cjk>
    0x5204, 0x9983, // <cjk>
    0x5206, 0x95AA, // <cjk>
    0x5207, 0x90D8, // <cjk>
    0x5208, 0x8AA0, // <cjk>
    0x520A, 0x8AA7, // <cjk>
    0x520B, 0x9984, // <cjk>
    0x520E, 0x9986, // <cjk>
    0x5211, 0x8C59, // <cjk>
    0x5214, 0x9985, // <cjk>
    0x5217, 0x97F1, // <cjk>
    0x521D, 0x8F89, // <cjk>
    0x5224, 0x94BB, // <cjk>
    0x5225, 0x95CA, // <cjk>
    0x5227, 0x9987, // <cjk>
    0x5229, 0x9798, // <cjk>
    0x522A, 0x9988, // <cjk>
    0x522E, 0x9989, // <cjk>
    0x5230, 0x939E, // <cjk>
    0x5233, 0x998A, // <cjk>
    0x5236, 0x90A7, // <cjk>
    0x5237, 0x8DFC, // <cjk>
    0x5238, 0x8C94, // <cjk>
    0x5239, 0x998B, // <cjk>
    0x523A, 0x8E68, // <cjk>
    0x523B, 0x8D8F, // <cjk>
    0x5243, 0x92E4, // <cjk>
    0x5244, 0x998D, // <cjk>
    0x5247, 0x91A5, // <cjk>
    0x524A, 0x8DED, // <cjk>
    0x524B, 0x998E, // <cjk>
    0x524C, 0x998F, // <cjk>
    0x524D, 0x914F, // <cjk>
    0x524F, 0x998C, // <cjk>
    0x5254, 0x9991, // <cjk>
    0x5256, 0x9655, // <cjk>
    0x525B, 0x8D84, // <cjk>
    0x525E, 0x9990, // <cjk>
    0x5263, 0x8C95, // <cjk>
    0x5264, 0x8DDC, // <cjk>
    0x5265, 0x948D, // <cjk>
    0x5269, 0x9994, // <cjk>
    0x526A, 0x9992, // <cjk>
    0x526F, 0x959B, // <cjk>
    0x5270, 0x8FE8, // <cjk>
    0x5271, 0x999B, // <cjk>
    0x5272, 0x8A84, // <cjk>
    0x5273, 0x9995, // <cjk>
    0x5274, 0x9993, // <cjk>
    0x5275, 0x916E, // <cjk>
    0x527D, 0x9997, // <cjk>
    0x527F, 0x9996, // <cjk>
    0x5283, 0x8A63, // <cjk>
    0x5287, 0x8C80, // <cjk>
    0x5288, 0x999C, // <cjk>
    0x5289, 0x97AB, // <cjk>
    0x528D, 0x9998, // <cjk>
    0x5291, 0x999D, // <cjk>
    0x5292, 0x999A, // <cjk>
    0x5294, 0x9999, // <cjk>
    0x529B, 0x97CD, // <cjk>
    0x529F, 0x8CF7, // <cjk>
    0x52A0, 0x89C1, // <cjk>
    0x52A3, 0x97F2, // <cjk>
    0x52A9, 0x8F95, // <cjk>
    0x52AA, 0x9377, // <cjk>
    0x52AB, 0x8D85, // <cjk>
    0x52AC, 0x99A0, // <cjk>
    0x52AD, 0x99A1, // <cjk>
    0x52B1, 0x97E3, // <cjk>
    0x52B4, 0x984A, // <cjk>
    0x52B5, 0x99A3, // <cjk>
    0x52B9, 0x8CF8, // <cjk>
    0x52BC, 0x99A2, // <cjk>
    0x52BE, 0x8A4E, // <cjk>
    0x52C1, 0x99A4, // <cjk>
    0x52C3, 0x9675, // <cjk>
    0x52C5, 0x92BA, // <cjk>
    0x52C7, 0x9745, // <cjk>
    0x52C9, 0x95D7, // <cjk>
    0x52CD, 0x99A5, // <cjk>
    0x52D2, 0xE8D3, // <cjk>
    0x52D5, 0x93AE, // <cjk>
    0x52D7, 0x99A6, // <cjk>
    0x52D8, 0x8AA8, // <cjk>
    0x52D9, 0x96B1, // <cjk>
    0x52DD, 0x8F9F, // <cjk>
    0x52DE, 0x99A7, // <cjk>
    0x52DF, 0x95E5, // <cjk>
    0x52E0, 0x99AB, // <cjk>
    0x52E2, 0x90A8, // <cjk>
    0x52E3, 0x99A8, // <cjk>
    0x52E4, 0x8BCE, // <cjk>
    0x52E6, 0x99A9, // <cjk>
    0x52E7, 0x8AA9, // <cjk>
    0x52F2, 0x8C4D, // <cjk>
    0x52F3, 0x99AC, // <cjk>
    0x52F5, 0x99AD, // <cjk>
    0x52F8, 0x99AE, // <cjk>
    0x52F9, 0x99AF, // <cjk>
    0x52FA, 0x8ED9, // <cjk>
    0x52FE, 0x8CF9, // <cjk>
    0x52FF, 0x96DC, // <cjk>
    0x5301, 0x96E6, // <cjk>
    0x5302, 0x93F5, // <cjk>
    0x5305, 0x95EF, // <cjk>
    0x5306, 0x99B0, // <cjk>
    0x5308, 0x99B1, // <cjk>
    0x530D, 0x99B3, // <cjk>
    0x530F, 0x99B5, // <cjk>
    0x5310, 0x99B4, // <cjk>
    0x5315, 0x99B6, // <cjk>
    0x5316, 0x89BB, // <cjk>
    0x5317, 0x966B, // <cjk>
    0x5319, 0x8DFA, // <cjk>
    0x531A, 0x99B7, // <cjk>
    0x531D, 0x9178, // <cjk>
    0x5320, 0x8FA0, // <cjk>
    0x5321, 0x8BA7, // <cjk>
    0x5323, 0x99B8, // <cjk>
    0x532A, 0x94D9, // <cjk>
    0x532F, 0x99B9, // <cjk>
    0x5331, 0x99BA, // <cjk>
    0x5333, 0x99BB, // <cjk>
    0x5338, 0x99BC, // <cjk>
    0x5339, 0x9543, // <cjk>
    0x533A, 0x8BE6, // <cjk>
    0x533B, 0x88E3, // <cjk>
    0x533F, 0x93BD, // <cjk>
    0x5340, 0x99BD, // <cjk>
    0x5341, 0x8F5C, // <cjk>
    0x5343, 0x90E7, // <cjk>
    0x5345, 0x99BF, // <cjk>
    0x5346, 0x99BE, // <cjk>
    0x5347, 0x8FA1, // <cjk>
    0x5348, 0x8CDF, // <cjk>
    0x5349, 0x99C1, // <cjk>
    0x534A, 0x94BC, // <cjk>
    0x534D, 0x99C2, // <cjk>
    0x5351, 0x94DA, // <cjk>
    0x5352, 0x91B2, // <cjk>
    0x5353, 0x91EC, // <cjk>
    0x5354, 0x8BA6, // <cjk>
    0x5357, 0x93EC, // <cjk>
    0x5358, 0x9250, // <cjk>
    0x535A, 0x948E, // <cjk>
    0x535C, 0x966D, // <cjk>
    0x535E, 0x99C4, // <cjk>
    0x5360, 0x90E8, // <cjk>
    0x5366, 0x8C54, // <cjk>
    0x5369, 0x99C5, // <cjk>
    0x536E, 0x99C6, // <cjk>
    0x536F, 0x894B, // <cjk>
    0x5370, 0x88F3, // <cjk>
    0x5371, 0x8AEB, // <cjk>
    0x5373, 0x91A6, // <cjk>
    0x5374, 0x8B70, // <cjk>
    0x5375, 0x9791, // <cjk>
    0x5377, 0x99C9, // <cjk>
    0x5378, 0x89B5, // <cjk>
    0x537B, 0x99C8, // <cjk>
    0x537F, 0x8BA8, // <cjk>
    0x5382, 0x99CA, // <cjk>
    0x5384, 0x96EF, // <cjk>
    0x5396, 0x99CB, // <cjk>
    0x5398, 0x97D0, // <cjk>
    0x539A, 0x8CFA, // <cjk>
    0x539F, 0x8CB4, // <cjk>
    0x53A0, 0x99CC, // <cjk>
    0x53A5, 0x99CE, // <cjk>
    0x53A6, 0x99CD, // <cjk>
    0x53A8, 0x907E, // <cjk>
    0x53A9, 0x8958, // <cjk>
    0x53AD, 0x897D, // <cjk>
    0x53AE, 0x99CF, // <cjk>
    0x53B0, 0x99D0, // <cjk>
    0x53B3, 0x8CB5, // <cjk>
    0x53B6, 0x99D1, // <cjk>
    0x53BB, 0x8B8E, // <cjk>
    0x53C2, 0x8E51, // <cjk>
    0x53C3, 0x99D2, // <cjk>
    0x53C8, 0x9694, // <cjk>
    0x53C9, 0x8DB3, // <cjk>
    0x53CA, 0x8B79, // <cjk>
    0x53CB, 0x9746, // <cjk>
    0x53CC, 0x916F, // <cjk>
    0x53CD, 0x94BD, // <cjk>
    0x53CE, 0x8EFB, // <cjk>
    0x53D4, 0x8F66, // <cjk>
    0x53D6, 0x8EE6, // <cjk>
    0x53D7, 0x8EF3, // <cjk>
    0x53D9, 0x8F96, // <cjk>
    0x53DB, 0x94BE, // <cjk>
    0x53DF, 0x99D5, // <cjk>
    0x53E1, 0x8962, // <cjk>
    0x53E2, 0x9170, // <cjk>
    0x53E3, 0x8CFB, // <cjk>
    0x53E4, 0x8CC3, // <cjk>
    0x53E5, 0x8BE5, // <cjk>
    0x53E8, 0x99D9, // <cjk>
    0x53E9, 0x9240, // <cjk>
    0x53EA, 0x91FC, // <cjk>
    0x53EB, 0x8BA9, // <cjk>
    0x53EC, 0x8FA2, // <cjk>
    0x53ED, 0x99DA, // <cjk>
    0x53EE, 0x99D8, // <cjk>
    0x53EF, 0x89C2, // <cjk>
    0x53F0, 0x91E4, // <cjk>
    0x53F1, 0x8EB6, // <cjk>
    0x53F2, 0x8E6A, // <cjk>
    0x53F3, 0x8945, // <cjk>
    0x53F6, 0x8A90, // <cjk>
    0x53F7, 0x8D86, // <cjk>
    0x53F8, 0x8E69, // <cjk>
    0x53FA, 0x99DB, // <cjk>
    0x5401, 0x99DC, // <cjk>
    0x5403, 0x8B68, // <cjk>
    0x5404, 0x8A65, // <cjk>
    0x5408, 0x8D87, // <cjk>
    0x5409, 0x8B67, // <cjk>
    0x540A, 0x92DD, // <cjk>
    0x540B, 0x8944, // <cjk>
    0x540C, 0x93AF, // <cjk>
    0x540D, 0x96BC, // <cjk>
    0x540E, 0x8D40, // <cjk>
    0x540F, 0x9799, // <cjk>
    0x5410, 0x9366, // <cjk>
    0x5411, 0x8CFC, // <cjk>
    0x541B, 0x8C4E, // <cjk>
    0x541D, 0x99E5, // <cjk>
    0x541F, 0x8BE1, // <cjk>
    0x5420, 0x9669, // <cjk>
    0x5426, 0x94DB, // <cjk>
    0x5429, 0x99E4, // <cjk>
    0x542B, 0x8ADC, // <cjk>
    0x542C, 0x99DF, // <cjk>
    0x542D, 0x99E0, // <cjk>
    0x542E, 0x99E2, // <cjk>
    0x5436, 0x99E3, // <cjk>
    0x5438, 0x8B7A, // <cjk>
    0x5439, 0x9081, // <cjk>
    0x543B, 0x95AB, // <cjk>
    0x543C, 0x99E1, // <cjk>
    0x543D, 0x99DD, // <cjk>
    0x543E, 0x8CE1, // <cjk>
    0x5440, 0x99DE, // <cjk>
    0x5442, 0x9843, // <cjk>
    0x5446, 0x95F0, // <cjk>
    0x5448, 0x92E6, // <cjk>
    0x5449, 0x8CE0, // <cjk>
    0x544A, 0x8D90, // <cjk>
    0x544E, 0x99E6, // <cjk>
    0x5451, 0x93DB, // <cjk>
    0x545F, 0x99EA, // <cjk>
    0x5468, 0x8EFC, // <cjk>
    0x546A, 0x8EF4, // <cjk>
    0x5470, 0x99ED, // <cjk>
    0x5471, 0x99EB, // <cjk>
    0x5473, 0x96A1, // <cjk>
    0x5475, 0x99E8, // <cjk>
    0x5476, 0x99F1, // <cjk>
    0x5477, 0x99EC, // <cjk>
    0x547B, 0x99EF, // <cjk>
    0x547C, 0x8CC4, // <cjk>
    0x547D, 0x96BD, // <cjk>
    0x5480, 0x99F0, // <cjk>
    0x5484, 0x99F2, // <cjk>
    0x5486, 0x99F4, // <cjk>
    0x548B, 0x8DEE, // <cjk>
    0x548C, 0x9861, // <cjk>
    0x548E, 0x99E9, // <cjk>
    0x548F, 0x99E7, // <cjk>
    0x5490, 0x99F3, // <cjk>
    0x5492, 0x99EE, // <cjk>
    0x54A2, 0x99F6, // <cjk>
    0x54A4, 0x9A42, // <cjk>
    0x54A5, 0x99F8, // <cjk>
    0x54A8, 0x99FC, // <cjk>
    0x54AB, 0x9A40, // <cjk>
    0x54AC, 0x99F9, // <cjk>
    0x54AF, 0x9A5D, // <cjk>
    0x54B2, 0x8DE7, // <cjk>
    0x54B3, 0x8A50, // <cjk>
    0x54B8, 0x99F7, // <cjk>
    0x54BC, 0x9A44, // <cjk>
    0x54BD, 0x88F4, // <cjk>
    0x54BE, 0x9A43, // <cjk>
    0x54C0, 0x88A3, // <cjk>
    0x54C1, 0x9569, // <cjk>
    0x54C2, 0x9A41, // <cjk>
    0x54C4, 0x99FA, // <cjk>
    0x54C7, 0x99F5, // <cjk>
    0x54C8, 0x99FB, // <cjk>
    0x54C9, 0x8DC6, // <cjk>
    0x54D8, 0x9A45, // <cjk>
    0x54E1, 0x88F5, // <cjk>
    0x54E2, 0x9A4E, // <cjk>
    0x54E5, 0x9A46, // <cjk>
    0x54E6, 0x9A47, // <cjk>
    0x54E8, 0x8FA3, // <cjk>
    0x54E9, 0x9689, // <cjk>
    0x54ED, 0x9A4C, // <cjk>
    0x54EE, 0x9A4B, // <cjk>
    0x54F2, 0x934E, // <cjk>
    0x54FA, 0x9A4D, // <cjk>
    0x54FD, 0x9A4A, // <cjk>
    0x5504, 0x8953, // <cjk>
    0x5506, 0x8DB4, // <cjk>
    0x5507, 0x904F, // <cjk>
    0x550F, 0x9A48, // <cjk>
    0x5510, 0x9382, // <cjk>
    0x5514, 0x9A49, // <cjk>
    0x5516, 0x88A0, // <cjk>
    0x552E, 0x9A53, // <cjk>
    0x552F, 0x9742, // <cjk>
    0x5531, 0x8FA5, // <cjk>
    0x5533, 0x9A59, // <cjk>
    0x5538, 0x9A58, // <cjk>
    0x5539, 0x9A4F, // <cjk>
    0x553E, 0x91C1, // <cjk>
    0x5540, 0x9A50, // <cjk>
    0x5544, 0x91ED, // <cjk>
    0x5545, 0x9A55, // <cjk>
    0x5546, 0x8FA4, // <cjk>
    0x554C, 0x9A52, // <cjk>
    0x554F, 0x96E2, // <cjk>
    0x5556, 0x9A56, // <cjk>
    0x5557, 0x9A57, // <cjk>
    0x555C, 0x9A54, // <cjk>
    0x555D, 0x9A5A, // <cjk>
    0x5563, 0x9A51, // <cjk>
    0x557B, 0x9A60, // <cjk>
    0x557C, 0x9A65, // <cjk>
    0x557E, 0x9A61, // <cjk>
    0x5580, 0x9A5C, // <cjk>
    0x5583, 0x9A66, // <cjk>
    0x5584, 0x9150, // <cjk>
    0x5587, 0x9A68, // <cjk>
    0x5589, 0x8D41, // <cjk>
    0x558A, 0x9A5E, // <cjk>
    0x558B, 0x929D, // <cjk>
    0x5598, 0x9A62, // <cjk>
    0x559A, 0x8AAB, // <cjk>
    0x559C, 0x8AEC, // <cjk>
    0x559D, 0x8A85, // <cjk>
    0x559E, 0x9A63, // <cjk>
    0x559F, 0x9A5F, // <cjk>
    0x55A7, 0x8C96, // <cjk>
    0x55A8, 0x9A69, // <cjk>
    0x55A9, 0x9A67, // <cjk>
    0x55AA, 0x9172, // <cjk>
    0x55AB, 0x8B69, // <cjk>
    0x55AC, 0x8BAA, // <cjk>
    0x55AE, 0x9A64, // <cjk>
    0x55B0, 0x8BF2, // <cjk>
    0x55B6, 0x8963, // <cjk>
    0x55C4, 0x9A6D, // <cjk>
    0x55C5, 0x9A6B, // <cjk>
    0x55C7, 0x9AA5, // <cjk>
    0x55D4, 0x9A70, // <cjk>
    0x55DA, 0x9A6A, // <cjk>
    0x55DC, 0x9A6E, // <cjk>
    0x55DF, 0x9A6C, // <cjk>
    0x55E3, 0x8E6B, // <cjk>
    0x55E4, 0x9A6F, // <cjk>
    0x55F7, 0x9A72, // <cjk>
    0x55F9, 0x9A77, // <cjk>
    0x55FD, 0x9A75, // <cjk>
    0x55FE, 0x9A74, // <cjk>
    0x5606, 0x9251, // <cjk>
    0x5609, 0x89C3, // <cjk>
    0x5614, 0x9A71, // <cjk>
    0x5616, 0x9A73, // <cjk>
    0x5617, 0x8FA6, // <cjk>
    0x5618, 0x8952, // <cjk>
    0x561B, 0x9A76, // <cjk>
    0x5629, 0x89DC, // <cjk>
    0x562F, 0x9A82, // <cjk>
    0x5631, 0x8FFA, // <cjk>
    0x5632, 0x9A7D, // <cjk>
    0x5634, 0x9A7B, // <cjk>
    0x5636, 0x9A7C, // <cjk>
    0x5638, 0x9A7E, // <cjk>
    0x5642, 0x895C, // <cjk>
    0x564C, 0x9158, // <cjk>
    0x564E, 0x9A78, // <cjk>
    0x5650, 0x9A79, // <cjk>
    0x565B, 0x8A9A, // <cjk>
    0x5664, 0x9A81, // <cjk>
    0x5668, 0x8AED, // <cjk>
    0x566A, 0x9A84, // <cjk>
    0x566B, 0x9A80, // <cjk>
    0x566C, 0x9A83, // <cjk>
    0x5674, 0x95AC, // <cjk>
    0x5678, 0x93D3, // <cjk>
    0x567A, 0x94B6, // <cjk>
    0x5680, 0x9A86, // <cjk>
    0x5686, 0x9A85, // <cjk>
    0x5687, 0x8A64, // <cjk>
    0x568A, 0x9A87, // <cjk>
    0x568F, 0x9A8A, // <cjk>
    0x5694, 0x9A89, // <cjk>
    0x56A0, 0x9A88, // <cjk>
    0x56A2, 0x9458, // <cjk>
    0x56A5, 0x9A8B, // <cjk>
    0x56AE, 0x9A8C, // <cjk>
    0x56B4, 0x9A8E, // <cjk>
    0x56B6, 0x9A8D, // <cjk>
    0x56BC, 0x9A90, // <cjk>
    0x56C0, 0x9A93, // <cjk>
    0x56C1, 0x9A91, // <cjk>
    0x56C2, 0x9A8F, // <cjk>
    0x56C3, 0x9A92, // <cjk>
    0x56C8, 0x9A94, // <cjk>
    0x56CE, 0x9A95, // <cjk>
    0x56D1, 0x9A96, // <cjk>
    0x56D3, 0x9A97, // <cjk>
    0x56D7, 0x9A98, // <cjk>
    0x56D8, 0x9964, // <cjk>
    0x56DA, 0x8EFA, // <cjk>
    0x56DB, 0x8E6C, // <cjk>
    0x56DE, 0x89F1, // <cjk>
    0x56E0, 0x88F6, // <cjk>
    0x56E3, 0x9263, // <cjk>
    0x56EE, 0x9A99, // <cjk>
    0x56F0, 0x8DA2, // <cjk>
    0x56F2, 0x88CD, // <cjk>
    0x56F3, 0x907D, // <cjk>
    0x56F9, 0x9A9A, // <cjk>
    0x56FA, 0x8CC5, // <cjk>
    0x56FD, 0x8D91, // <cjk>
    0x56FF, 0x9A9C, // <cjk>
    0x5700, 0x9A9B, // <cjk>
    0x5703, 0x95DE, // <cjk>
    0x5704, 0x9A9D, // <cjk>
    0x5708, 0x9A9F, // <cjk>
    0x5709, 0x9A9E, // <cjk>
    0x570B, 0x9AA0, // <cjk>
    0x570D, 0x9AA1, // <cjk>
    0x570F, 0x8C97, // <cjk>
    0x5712, 0x8980, // <cjk>
    0x5713, 0x9AA2, // <cjk>
    0x5716, 0x9AA4, // <cjk>
    0x5718, 0x9AA3, // <cjk>
    0x571C, 0x9AA6, // <cjk>
    0x571F, 0x9379, // <cjk>
    0x5726, 0x9AA7, // <cjk>
    0x5727, 0x88B3, // <cjk>
    0x5728, 0x8DDD, // <cjk>
    0x572D, 0x8C5C, // <cjk>
    0x5730, 0x926E, // <cjk>
    0x5737, 0x9AA8, // <cjk>
    0x5738, 0x9AA9, // <cjk>
    0x573B, 0x9AAB, // <cjk>
    0x5740, 0x9AAC, // <cjk>
    0x5742, 0x8DE2, // <cjk>
    0x5747, 0x8BCF, // <cjk>
    0x574A, 0x9656, // <cjk>
    0x574E, 0x9AAA, // <cjk>
    0x574F, 0x9AAD, // <cjk>
    0x5750, 0x8DBF, // <cjk>
    0x5751, 0x8D42, // <cjk>
    0x5761, 0x9AB1, // <cjk>
    0x5764, 0x8DA3, // <cjk>
    0x5766, 0x9252, // <cjk>
    0x5769, 0x9AAE, // <cjk>
    0x576A, 0x92D8, // <cjk>
    0x577F, 0x9AB2, // <cjk>
    0x5782, 0x9082, // <cjk>
    0x5788, 0x9AB0, // <cjk>
    0x5789, 0x9AB3, // <cjk>
    0x578B, 0x8C5E, // <cjk>
    0x5793, 0x9AB4, // <cjk>
    0x57A0, 0x9AB5, // <cjk>
    0x57A2, 0x8D43, // <cjk>
    0x57A3, 0x8A5F, // <cjk>
    0x57A4, 0x9AB7, // <cjk>
    0x57AA, 0x9AB8, // <cjk>
    0x57B0, 0x9AB9, // <cjk>
    0x57B3, 0x9AB6, // <cjk>
    0x57C0, 0x9AAF, // <cjk>
    0x57C3, 0x9ABA, // <cjk>
    0x57C6, 0x9ABB, // <cjk>
    0x57CB, 0x9684, // <cjk>
    0x57CE, 0x8FE9, // <cjk>
    0x57D2, 0x9ABD, // <cjk>
    0x57D3, 0x9ABE, // <cjk>
    0x57D4, 0x9ABC, // <cjk>
    0x57D6, 0x9AC0, // <cjk>
    0x57DC, 0x9457, // <cjk>
    0x57DF, 0x88E6, // <cjk>
    0x57E0, 0x9575, // <cjk>
    0x57E3, 0x9AC1, // <cjk>
    0x57F4, 0x8FFB, // <cjk>
    0x57F7, 0x8EB7, // <cjk>
    0x57F9, 0x947C, // <cjk>
    0x57FA, 0x8AEE, // <cjk>
    0x57FC, 0x8DE9, // <cjk>
    0x5800, 0x9678, // <cjk>
    0x5802, 0x93B0, // <cjk>
    0x5805, 0x8C98, // <cjk>
    0x5806, 0x91CD, // <cjk>
    0x580A, 0x9ABF, // <cjk>
    0x580B, 0x9AC2, // <cjk>
    0x5815, 0x91C2, // <cjk>
    0x5819, 0x9AC3, // <cjk>
    0x581D, 0x9AC4, // <cjk>
    0x5821, 0x9AC6, // <cjk>
    0x5824, 0x92E7, // <cjk>
    0x582A, 0x8AAC, // <cjk>
    0x582F, 0xEA9F, // <cjk>
    0x5830, 0x8981, // <cjk>
    0x5831, 0x95F1, // <cjk>
    0x5834, 0x8FEA, // <cjk>
    0x5835, 0x9367, // <cjk>
    0x583A, 0x8DE4, // <cjk>
    0x583D, 0x9ACC, // <cjk>
    0x5840, 0x95BB, // <cjk>
    0x5841, 0x97DB, // <cjk>
    0x584A, 0x89F2, // <cjk>
    0x584B, 0x9AC8, // <cjk>
    0x5851, 0x9159, // <cjk>
    0x5852, 0x9ACB, // <cjk>
    0x5854, 0x9383, // <cjk>
    0x5857, 0x9368, // <cjk>
    0x5858, 0x9384, // <cjk>
    0x5859, 0x94B7, // <cjk>
    0x585A, 0x92CB, // <cjk>
    0x585E, 0x8DC7, // <cjk>
    0x5862, 0x9AC7, // <cjk>
    0x5869, 0x8996, // <cjk>
    0x586B, 0x9355, // <cjk>
    0x5870, 0x9AC9, // <cjk>
    0x5872, 0x9AC5, // <cjk>
    0x5875, 0x906F, // <cjk>
    0x5879, 0x9ACD, // <cjk>
    0x587E, 0x8F6D, // <cjk>
    0x5883, 0x8BAB, // <cjk>
    0x5885, 0x9ACE, // <cjk>
    0x5893, 0x95E6, // <cjk>
    0x5897, 0x919D, // <cjk>
    0x589C, 0x92C4, // <cjk>
    0x589F, 0x9AD0, // <cjk>
    0x58A8, 0x966E, // <cjk>
    0x58AB, 0x9AD1, // <cjk>
    0x58AE, 0x9AD6, // <cjk>
    0x58B3, 0x95AD, // <cjk>
    0x58B8, 0x9AD5, // <cjk>
    0x58B9, 0x9ACF, // <cjk>
    0x58BA, 0x9AD2, // <cjk>
    0x58BB, 0x9AD4, // <cjk>
    0x58BE, 0x8DA4, // <cjk>
    0x58C1, 0x95C7, // <cjk>
    0x58C5, 0x9AD7, // <cjk>
    0x58C7, 0x9264, // <cjk>
    0x58CA, 0x89F3, // <cjk>
    0x58CC, 0x8FEB, // <cjk>
    0x58D1, 0x9AD9, // <cjk>
    0x58D3, 0x9AD8, // <cjk>
    0x58D5, 0x8D88, // <cjk>
    0x58D7, 0x9ADA, // <cjk>
    0x58D8, 0x9ADC, // <cjk>
    0x58D9, 0x9ADB, // <cjk>
    0x58DC, 0x9ADE, // <cjk>
    0x58DE, 0x9AD3, // <cjk>
    0x58DF, 0x9AE0, // <cjk>
    0x58E4, 0x9ADF, // <cjk>
    0x58E5, 0x9ADD, // <cjk>
    0x58EB, 0x8E6D, // <cjk>
    0x58EC, 0x9070, // <cjk>
    0x58EE, 0x9173, // <cjk>
    0x58EF, 0x9AE1, // <cjk>
    0x58F0, 0x90BA, // <cjk>
    0x58F1, 0x88EB, // <cjk>
    0x58F2, 0x9484, // <cjk>
    0x58F7, 0x92D9, // <cjk>
    0x58F9, 0x9AE3, // <cjk>
    0x58FA, 0x9AE2, // <cjk>
    0x58FB, 0x9AE4, // <cjk>
    0x58FC, 0x9AE5, // <cjk>
    0x58FD, 0x9AE6, // <cjk>
    0x5902, 0x9AE7, // <cjk>
    0x5909, 0x95CF, // <cjk>
    0x590A, 0x9AE8, // <cjk>
    0x590F, 0x89C4, // <cjk>
    0x5910, 0x9AE9, // <cjk>
    0x5916, 0x8A4F, // <cjk>
    0x5918, 0x99C7, // <cjk>
    0x5919, 0x8F67, // <cjk>
    0x591A, 0x91BD, // <cjk>
    0x591B, 0x9AEA, // <cjk>
    0x591C, 0x96E9, // <cjk>
    0x5922, 0x96B2, // <cjk>
    0x5925, 0x9AEC, // <cjk>
    0x5927, 0x91E5, // <cjk>
    0x5929, 0x9356, // <cjk>
    0x592A, 0x91BE, // <cjk>
    0x592B, 0x9576, // <cjk>
    0x592C, 0x9AED, // <cjk>
    0x592D, 0x9AEE, // <cjk>
    0x592E, 0x899B, // <cjk>
    0x5931, 0x8EB8, // <cjk>
    0x5932, 0x9AEF, // <cjk>
    0x5937, 0x88CE, // <cjk>
    0x5938, 0x9AF0, // <cjk>
    0x593E, 0x9AF1, // <cjk>
    0x5944, 0x8982, // <cjk>
    0x5947, 0x8AEF, // <cjk>
    0x5948, 0x93DE, // <cjk>
    0x5949, 0x95F2, // <cjk>
    0x594E, 0x9AF5, // <cjk>
    0x594F, 0x9174, // <cjk>
    0x5950, 0x9AF4, // <cjk>
    0x5951, 0x8C5F, // <cjk>
    0x5954, 0x967A, // <cjk>
    0x5955, 0x9AF3, // <cjk>
    0x5957, 0x9385, // <cjk>
    0x5958, 0x9AF7, // <cjk>
    0x595A, 0x9AF6, // <cjk>
    0x5960, 0x9AF9, // <cjk>
    0x5962, 0x9AF8, // <cjk>
    0x5965, 0x899C, // <cjk>
    0x5967, 0x9AFA, // <cjk>
    0x5968, 0x8FA7, // <cjk>
    0x5969, 0x9AFC, // <cjk>
    0x596A, 0x9244, // <cjk>
    0x596C, 0x9AFB, // <cjk>
    0x596E, 0x95B1, // <cjk>
    0x5973, 0x8F97, // <cjk>
    0x5974, 0x937A, // <cjk>
    0x5978, 0x9B40, // <cjk>
    0x597D, 0x8D44, // <cjk>
    0x5981, 0x9B41, // <cjk>
    0x5982, 0x9440, // <cjk>
    0x5983, 0x94DC, // <cjk>
    0x5984, 0x96CF, // <cjk>
    0x598A, 0x9444, // <cjk>
    0x598D, 0x9B4A, // <cjk>
    0x5993, 0x8B57, // <cjk>
    0x5996, 0x9764, // <cjk>
    0x5999, 0x96AD, // <cjk>
    0x599B, 0x9BAA, // <cjk>
    0x599D, 0x9B42, // <cjk>
    0x59A3, 0x9B45, // <cjk>
    0x59A5, 0x91C3, // <cjk>
    0x59A8, 0x9657, // <cjk>
    0x59AC, 0x9369, // <cjk>
    0x59B2, 0x9B46, // <cjk>
    0x59B9, 0x9685, // <cjk>
    0x59BB, 0x8DC8, // <cjk>
    0x59BE, 0x8FA8, // <cjk>
    0x59C6, 0x9B47, // <cjk>
    0x59C9, 0x8E6F, // <cjk>
    0x59CB, 0x8E6E, // <cjk>
    0x59D0, 0x88B7, // <cjk>
    0x59D1, 0x8CC6, // <cjk>
    0x59D3, 0x90A9, // <cjk>
    0x59D4, 0x88CF, // <cjk>
    0x59D9, 0x9B4B, // <cjk>
    0x59DA, 0x9B4C, // <cjk>
    0x59DC, 0x9B49, // <cjk>
    0x59E5, 0x8957, // <cjk>
    0x59E6, 0x8AAD, // <cjk>
    0x59E8, 0x9B48, // <cjk>
    0x59EA, 0x96C3, // <cjk>
    0x59EB, 0x9550, // <cjk>
    0x59F6, 0x88A6, // <cjk>
    0x59FB, 0x88F7, // <cjk>
    0x59FF, 0x8E70, // <cjk>
    0x5A01, 0x88D0, // <cjk>
    0x5A03, 0x88A1, // <cjk>
    0x5A09, 0x9B51, // <cjk>
    0x5A11, 0x9B4F, // <cjk>
    0x5A18, 0x96BA, // <cjk>
    0x5A1A, 0x9B52, // <cjk>
    0x5A1C, 0x9B50, // <cjk>
    0x5A1F, 0x9B4E, // <cjk>
    0x5A20, 0x9050, // <cjk>
    0x5A25, 0x9B4D, // <cjk>
    0x5A29, 0x95D8, // <cjk>
    0x5A2F, 0x8CE2, // <cjk>
    0x5A35, 0x9B56, // <cjk>
    0x5A36, 0x9B57, // <cjk>
    0x5A3C, 0x8FA9, // <cjk>
    0x5A40, 0x9B53, // <cjk>
    0x5A41, 0x984B, // <cjk>
    0x5A46, 0x946B, // <cjk>
    0x5A49, 0x9B55, // <cjk>
    0x5A5A, 0x8DA5, // <cjk>
    0x5A62, 0x9B58, // <cjk>
    0x5A66, 0x9577, // <cjk>
    0x5A6A, 0x9B59, // <cjk>
    0x5A6C, 0x9B54, // <cjk>
    0x5A7F, 0x96B9, // <cjk>
    0x5A92, 0x947D, // <cjk>
    0x5A9A, 0x9B5A, // <cjk>
    0x5A9B, 0x9551, // <cjk>
    0x5ABD, 0x9B5F, // <cjk>
    0x5ABE, 0x9B5C, // <cjk>
    0x5AC1, 0x89C5, // <cjk>
    0x5AC2, 0x9B5E, // <cjk>
    0x5AC9, 0x8EB9, // <cjk>
    0x5ACB, 0x9B5D, // <cjk>
    0x5ACC, 0x8C99, // <cjk>
    0x5AD0, 0x9B6B, // <cjk>
    0x5AD6, 0x9B64, // <cjk>
    0x5AD7, 0x9B61, // <cjk>
    0x5AE1, 0x9284, // <cjk>
    0x5AE3, 0x9B60, // <cjk>
    0x5AE6, 0x9B62, // <cjk>
    0x5AE9, 0x9B63, // <cjk>
    0x5AFA, 0x9B65, // <cjk>
    0x5AFB, 0x9B66, // <cjk>
    0x5B09, 0x8AF0, // <cjk>
    0x5B0B, 0x9B68, // <cjk>
    0x5B0C, 0x9B67, // <cjk>
    0x5B16, 0x9B69, // <cjk>
    0x5B22, 0x8FEC, // <cjk>
    0x5B2A, 0x9B6C, // <cjk>
    0x5B2C, 0x92DA, // <cjk>
    0x5B30, 0x8964, // <cjk>
    0x5B32, 0x9B6A, // <cjk>
    0x5B36, 0x9B6D, // <cjk>
    0x5B3E, 0x9B6E, // <cjk>
    0x5B40, 0x9B71, // <cjk>
    0x5B43, 0x9B6F, // <cjk>
    0x5B45, 0x9B70, // <cjk>
    0x5B50, 0x8E71, // <cjk>
    0x5B51, 0x9B72, // <cjk>
    0x5B54, 0x8D45, // <cjk>
    0x5B55, 0x9B73, // <cjk>
    0x5B57, 0x8E9A, // <cjk>
    0x5B58, 0x91B6, // <cjk>
    0x5B5A, 0x9B74, // <cjk>
    0x5B5B, 0x9B75, // <cjk>
    0x5B5C, 0x8E79, // <cjk>
    0x5B5D, 0x8D46, // <cjk>
    0x5B5F, 0x96D0, // <cjk>
    0x5B63, 0x8B47, // <cjk>
    0x5B64, 0x8CC7, // <cjk>
    0x5B65, 0x9B76, // <cjk>
    0x5B66, 0x8A77, // <cjk>
    0x5B69, 0x9B77, // <cjk>
    0x5B6B, 0x91B7, // <cjk>
    0x5B70, 0x9B78, // <cjk>
    0x5B71, 0x9BA1, // <cjk>
    0x5B73, 0x9B79, // <cjk>
    0x5B75, 0x9B7A, // <cjk>
    0x5B78, 0x9B7B, // <cjk>
    0x5B7A, 0x9B7D, // <cjk>
    0x5B80, 0x9B7E, // <cjk>
    0x5B83, 0x9B80, // <cjk>
    0x5B85, 0x91EE, // <cjk>
    0x5B87, 0x8946, // <cjk>
    0x5B88, 0x8EE7, // <cjk>
    0x5B89, 0x88C0, // <cjk>
    0x5B8B, 0x9176, // <cjk>
    0x5B8C, 0x8AAE, // <cjk>
    0x5B8D, 0x8EB3, // <cjk>
    0x5B8F, 0x8D47, // <cjk>
    0x5B95, 0x9386, // <cjk>
    0x5B97, 0x8F40, // <cjk>
    0x5B98, 0x8AAF, // <cjk>
    0x5B99, 0x9288, // <cjk>
    0x5B9A, 0x92E8, // <cjk>
    0x5B9B, 0x88B6, // <cjk>
    0x5B9C, 0x8B58, // <cjk>
    0x5B9D, 0x95F3, // <cjk>
    0x5B9F, 0x8EC0, // <cjk>
    0x5BA2, 0x8B71, // <cjk>
    0x5BA3, 0x90E9, // <cjk>
    0x5BA4, 0x8EBA, // <cjk>
    0x5BA5, 0x9747, // <cjk>
    0x5BA6, 0x9B81, // <cjk>
    0x5BAE, 0x8B7B, // <cjk>
    0x5BB0, 0x8DC9, // <cjk>
    0x5BB3, 0x8A51, // <cjk>
    0x5BB4, 0x8983, // <cjk>
    0x5BB5, 0x8FAA, // <cjk>
    0x5BB6, 0x89C6, // <cjk>
    0x5BB8, 0x9B82, // <cjk>
    0x5BB9, 0x9765, // <cjk>
    0x5BBF, 0x8F68, // <cjk>
    0x5BC2, 0x8EE2, // <cjk>
    0x5BC3, 0x9B83, // <cjk>
    0x5BC4, 0x8AF1, // <cjk>
    0x5BC5, 0x93D0, // <cjk>
    0x5BC6, 0x96A7, // <cjk>
    0x5BC7, 0x9B84, // <cjk>
    0x5BC9, 0x9B85, // <cjk>
    0x5BCC, 0x9578, // <cjk>
    0x5BD0, 0x9B87, // <cjk>
    0x5BD2, 0x8AA6, // <cjk>
    0x5BD3, 0x8BF5, // <cjk>
    0x5BD4, 0x9B86, // <cjk>
    0x5BDB, 0x8AB0, // <cjk>
    0x5BDD, 0x9051, // <cjk>
    0x5BDE, 0x9B8B, // <cjk>
    0x5BDF, 0x8E40, // <cjk>
    0x5BE1, 0x89C7, // <cjk>
    0x5BE2, 0x9B8A, // <cjk>
    0x5BE4, 0x9B88, // <cjk>
    0x5BE5, 0x9B8C, // <cjk>
    0x5BE6, 0x9B89, // <cjk>
    0x5BE7, 0x944A, // <cjk>
    0x5BE8, 0x9ECB, // <cjk>
    0x5BE9, 0x9052, // <cjk>
    0x5BEB, 0x9B8D, // <cjk>
    0x5BEE, 0x97BE, // <cjk>
    0x5BF0, 0x9B8E, // <cjk>
    0x5BF3, 0x9B90, // <cjk>
    0x5BF5, 0x929E, // <cjk>
    0x5BF6, 0x9B8F, // <cjk>
    0x5BF8, 0x90A1, // <cjk>
    0x5BFA, 0x8E9B, // <cjk>
    0x5BFE, 0x91CE, // <cjk>
    0x5BFF, 0x8EF5, // <cjk>
    0x5C01, 0x9595, // <cjk>
    0x5C02, 0x90EA, // <cjk>
    0x5C04, 0x8ECB, // <cjk>
    0x5C05, 0x9B91, // <cjk>
    0x5C06, 0x8FAB, // <cjk>
    0x5C07, 0x9B92, // <cjk>
    0x5C08, 0x9B93, // <cjk>
    0x5C09, 0x88D1, // <cjk>
    0x5C0A, 0x91B8, // <cjk>
    0x5C0B, 0x9071, // <cjk>
    0x5C0D, 0x9B94, // <cjk>
    0x5C0E, 0x93B1, // <cjk>
    0x5C0F, 0x8FAC, // <cjk>
    0x5C11, 0x8FAD, // <cjk>
    0x5C13, 0x9B95, // <cjk>
    0x5C16, 0x90EB, // <cjk>
    0x5C1A, 0x8FAE, // <cjk>
    0x5C20, 0x9B96, // <cjk>
    0x5C22, 0x9B97, // <cjk>
    0x5C24, 0x96DE, // <cjk>
    0x5C28, 0x9B98, // <cjk>
    0x5C2D, 0x8BC4, // <cjk>
    0x5C31, 0x8F41, // <cjk>
    0x5C38, 0x9B99, // <cjk>
    0x5C39, 0x9B9A, // <cjk>
    0x5C3A, 0x8EDA, // <cjk>
    0x5C3B, 0x904B, // <cjk>
    0x5C3C, 0x93F2, // <cjk>
    0x5C3D, 0x9073, // <cjk>
    0x5C3E, 0x94F6, // <cjk>
    0x5C3F, 0x9441, // <cjk>
    0x5C40, 0x8BC7, // <cjk>
    0x5C41, 0x9B9B, // <cjk>
    0x5C45, 0x8B8F, // <cjk>
    0x5C46, 0x9B9C, // <cjk>
    0x5C48, 0x8BFC, // <cjk>
    0x5C4A, 0x93CD, // <cjk>
    0x5C4B, 0x89AE, // <cjk>
    0x5C4D, 0x8E72, // <cjk>
    0x5C4E, 0x9B9D, // <cjk>
    0x5C4F, 0x9BA0, // <cjk>
    0x5C50, 0x9B9F, // <cjk>
    0x5C51, 0x8BFB, // <cjk>
    0x5C53, 0x9B9E, // <cjk>
    0x5C55, 0x9357, // <cjk>
    0x5C5E, 0x91AE, // <cjk>
    0x5C60, 0x936A, // <cjk>
    0x5C61, 0x8EC6, // <cjk>
    0x5C64, 0x9177, // <cjk>
    0x5C65, 0x979A, // <cjk>
    0x5C6C, 0x9BA2, // <cjk>
    0x5C6E, 0x9BA3, // <cjk>
    0x5C6F, 0x93D4, // <cjk>
    0x5C71, 0x8E52, // <cjk>
    0x5C76, 0x9BA5, // <cjk>
    0x5C79, 0x9BA6, // <cjk>
    0x5C8C, 0x9BA7, // <cjk>
    0x5C90, 0x8AF2, // <cjk>
    0x5C91, 0x9BA8, // <cjk>
    0x5C94, 0x9BA9, // <cjk>
    0x5CA1, 0x89AA, // <cjk>
    0x5CA8, 0x915A, // <cjk>
    0x5CA9, 0x8AE2, // <cjk>
    0x5CAB, 0x9BAB, // <cjk>
    0x5CAC, 0x96A6, // <cjk>
    0x5CB1, 0x91D0, // <cjk>
    0x5CB3, 0x8A78, // <cjk>
    0x5CB6, 0x9BAD, // <cjk>
    0x5CB7, 0x9BAF, // <cjk>
    0x5CB8, 0x8ADD, // <cjk>
    0x5CBB, 0x9BAC, // <cjk>
    0x5CBC, 0x9BAE, // <cjk>
    0x5CBE, 0x9BB1, // <cjk>
    0x5CC5, 0x9BB0, // <cjk>
    0x5CC7, 0x9BB2, // <cjk>
    0x5CD9, 0x9BB3, // <cjk>
    0x5CE0, 0x93BB, // <cjk>
    0x5CE1, 0x8BAC, // <cjk>
    0x5CE8, 0x89E3, // <cjk>
    0x5CE9, 0x9BB4, // <cjk>
    0x5CEA, 0x9BB9, // <cjk>
    0x5CED, 0x9BB7, // <cjk>
    0x5CEF, 0x95F5, // <cjk>
    0x5CF0, 0x95F4, // <cjk>
    0x5CF6, 0x9387, // <cjk>
    0x5CFA, 0x9BB6, // <cjk>
    0x5CFB, 0x8F73, // <cjk>
    0x5CFD, 0x9BB5, // <cjk>
    0x5D07, 0x9092, // <cjk>
    0x5D0B, 0x9BBA, // <cjk>
    0x5D0E, 0x8DE8, // <cjk>
    0x5D11, 0x9BC0, // <cjk>
    0x5D14, 0x9BC1, // <cjk>
    0x5D15, 0x9BBB, // <cjk>
    0x5D16, 0x8A52, // <cjk>
    0x5D17, 0x9BBC, // <cjk>
    0x5D18, 0x9BC5, // <cjk>
    0x5D19, 0x9BC4, // <cjk>
    0x5D1A, 0x9BC3, // <cjk>
    0x5D1B, 0x9BBF, // <cjk>
    0x5D1F, 0x9BBE, // <cjk>
    0x5D22, 0x9BC2, // <cjk>
    0x5D29, 0x95F6, // <cjk>
    0x5D4B, 0x9BC9, // <cjk>
    0x5D4C, 0x9BC6, // <cjk>
    0x5D4E, 0x9BC8, // <cjk>
    0x5D50, 0x9792, // <cjk>
    0x5D52, 0x9BC7, // <cjk>
    0x5D5C, 0x9BBD, // <cjk>
    0x5D69, 0x9093, // <cjk>
    0x5D6C, 0x9BCA, // <cjk>
    0x5D6F, 0x8DB5, // <cjk>
    0x5D73, 0x9BCB, // <cjk>
    0x5D76, 0x9BCC, // <cjk>
    0x5D82, 0x9BCF, // <cjk>
    0x5D84, 0x9BCE, // <cjk>
    0x5D87, 0x9BCD, // <cjk>
    0x5D8B, 0x9388, // <cjk>
    0x5D8C, 0x9BB8, // <cjk>
    0x5D90, 0x9BD5, // <cjk>
    0x5D9D, 0x9BD1, // <cjk>
    0x5DA2, 0x9BD0, // <cjk>
    0x5DAC, 0x9BD2, // <cjk>
    0x5DAE, 0x9BD3, // <cjk>
    0x5DB7, 0x9BD6, // <cjk>
    0x5DBA, 0x97E4, // <cjk>
    0x5DBC, 0x9BD7, // <cjk>
    0x5DBD, 0x9BD4, // <cjk>
    0x5DC9, 0x9BD8, // <cjk>
    0x5DCC, 0x8ADE, // <cjk>
    0x5DCD, 0x9BD9, // <cjk>
    0x5DD2, 0x9BDB, // <cjk>
    0x5DD3, 0x9BDA, // <cjk>
    0x5DD6, 0x9BDC, // <cjk>
    0x5DDB, 0x9BDD, // <cjk>
    0x5DDD, 0x90EC, // <cjk>
    0x5DDE, 0x8F42, // <cjk>
    0x5DE1, 0x8F84, // <cjk>
    0x5DE3, 0x9183, // <cjk>
    0x5DE5, 0x8D48, // <cjk>
    0x5DE6, 0x8DB6, // <cjk>
    0x5DE7, 0x8D49, // <cjk>
    0x5DE8, 0x8B90, // <cjk>
    0x5DEB, 0x9BDE, // <cjk>
    0x5DEE, 0x8DB7, // <cjk>
    0x5DF1, 0x8CC8, // <cjk>
    0x5DF2, 0x9BDF, // <cjk>
    0x5DF3, 0x96A4, // <cjk>
    0x5DF4, 0x9462, // <cjk>
    0x5DF5, 0x9BE0, // <cjk>
    0x5DF7, 0x8D4A, // <cjk>
    0x5DFB, 0x8AAA, // <cjk>
    0x5DFD, 0x9246, // <cjk>
    0x5DFE, 0x8BD0, // <cjk>
    0x5E02, 0x8E73, // <cjk>
    0x5E03, 0x957A, // <cjk>
    0x5E06, 0x94BF, // <cjk>
    0x5E0B, 0x9BE1, // <cjk>
    0x5E0C, 0x8AF3, // <cjk>
    0x5E11, 0x9BE4, // <cjk>
    0x5E16, 0x929F, // <cjk>
    0x5E19, 0x9BE3, // <cjk>
    0x5E1A, 0x9BE2, // <cjk>
    0x5E1B, 0x9BE5, // <cjk>
    0x5E1D, 0x92E9, // <cjk>
    0x5E25, 0x9083, // <cjk>
    0x5E2B, 0x8E74, // <cjk>
    0x5E2D, 0x90C8, // <cjk>
    0x5E2F, 0x91D1, // <cjk>
    0x5E30, 0x8B41, // <cjk>
    0x5E33, 0x92A0, // <cjk>
    0x5E36, 0x9BE6, // <cjk>
    0x5E37, 0x9BE7, // <cjk>
    0x5E38, 0x8FED, // <cjk>
    0x5E3D, 0x9658, // <cjk>
    0x5E40, 0x9BEA, // <cjk>
    0x5E43, 0x9BE9, // <cjk>
    0x5E44, 0x9BE8, // <cjk>
    0x5E45, 0x959D, // <cjk>
    0x5E47, 0x9BF1, // <cjk>
    0x5E4C, 0x9679, // <cjk>
    0x5E4E, 0x9BEB, // <cjk>
    0x5E54, 0x9BED, // <cjk>
    0x5E55, 0x968B, // <cjk>
    0x5E57, 0x9BEC, // <cjk>
    0x5E5F, 0x9BEE, // <cjk>
    0x5E61, 0x94A6, // <cjk>
    0x5E62, 0x9BEF, // <cjk>
    0x5E63, 0x95BC, // <cjk>
    0x5E64, 0x9BF0, // <cjk>
    0x5E72, 0x8AB1, // <cjk>
    0x5E73, 0x95BD, // <cjk>
    0x5E74, 0x944E, // <cjk>
    0x5E75, 0x9BF2, // <cjk>
    0x5E76, 0x9BF3, // <cjk>
    0x5E78, 0x8D4B, // <cjk>
    0x5E79, 0x8AB2, // <cjk>
    0x5E7A, 0x9BF4, // <cjk>
    0x5E7B, 0x8CB6, // <cjk>
    0x5E7C, 0x9763, // <cjk>
    0x5E7D, 0x9748, // <cjk>
    0x5E7E, 0x8AF4, // <cjk>
    0x5E7F, 0x9BF6, // <cjk>
    0x5E81, 0x92A1, // <cjk>
    0x5E83, 0x8D4C, // <cjk>
    0x5E84, 0x8FAF, // <cjk>
    0x5E87, 0x94DD, // <cjk>
    0x5E8A, 0x8FB0, // <cjk>
    0x5E8F, 0x8F98, // <cjk>
    0x5E95, 0x92EA, // <cjk>
    0x5E96, 0x95F7, // <cjk>
    0x5E97, 0x9358, // <cjk>
    0x5E9A, 0x8D4D, // <cjk>
    0x5E9C, 0x957B, // <cjk>
    0x5EA0, 0x9BF7, // <cjk>
    0x5EA6, 0x9378, // <cjk>
    0x5EA7, 0x8DC0, // <cjk>
    0x5EAB, 0x8CC9, // <cjk>
    0x5EAD, 0x92EB, // <cjk>
    0x5EB5, 0x88C1, // <cjk>
    0x5EB6, 0x8F8E, // <cjk>
    0x5EB7, 0x8D4E, // <cjk>
    0x5EB8, 0x9766, // <cjk>
    0x5EC1, 0x9BF8, // <cjk>
    0x5EC2, 0x9BF9, // <cjk>
    0x5EC3, 0x9470, // <cjk>
    0x5EC8, 0x9BFA, // <cjk>
    0x5EC9, 0x97F5, // <cjk>
    0x5ECA, 0x984C, // <cjk>
    0x5ECF, 0x9BFC, // <cjk>
    0x5ED0, 0x9BFB, // <cjk>
    0x5ED3, 0x8A66, // <cjk>
    0x5ED6, 0x9C40, // <cjk>
    0x5EDA, 0x9C43, // <cjk>
    0x5EDB, 0x9C44, // <cjk>
    0x5EDD, 0x9C42, // <cjk>
    0x5EDF, 0x955F, // <cjk>
    0x5EE0, 0x8FB1, // <cjk>
    0x5EE1, 0x9C46, // <cjk>
    0x5EE2, 0x9C45, // <cjk>
    0x5EE3, 0x9C41, // <cjk>
    0x5EE8, 0x9C47, // <cjk>
    0x5EE9, 0x9C48, // <cjk>
    0x5EEC, 0x9C49, // <cjk>
    0x5EF0, 0x9C4C, // <cjk>
    0x5EF1, 0x9C4A, // <cjk>
    0x5EF3, 0x9C4B, // <cjk>
    0x5EF4, 0x9C4D, // <cjk>
    0x5EF6, 0x8984, // <cjk>
    0x5EF7, 0x92EC, // <cjk>
    0x5EF8, 0x9C4E, // <cjk>
    0x5EFA, 0x8C9A, // <cjk>
    0x5EFB, 0x89F4, // <cjk>
    0x5EFC, 0x9455, // <cjk>
    0x5EFE, 0x9C4F, // <cjk>
    0x5EFF, 0x93F9, // <cjk>
    0x5F01, 0x95D9, // <cjk>
    0x5F03, 0x9C50, // <cjk>
    0x5F04, 0x984D, // <cjk>
    0x5F09, 0x9C51, // <cjk>
    0x5F0A, 0x95BE, // <cjk>
    0x5F0B, 0x9C54, // <cjk>
    0x5F0C, 0x989F, // <cjk>
    0x5F0D, 0x98AF, // <cjk>
    0x5F0F, 0x8EAE, // <cjk>
    0x5F10, 0x93F3, // <cjk>
    0x5F11, 0x9C55, // <cjk>
    0x5F13, 0x8B7C, // <cjk>
    0x5F14, 0x92A2, // <cjk>
    0x5F15, 0x88F8, // <cjk>
    0x5F16, 0x9C56, // <cjk>
    0x5F17, 0x95A4, // <cjk>
    0x5F18, 0x8D4F, // <cjk>
    0x5F1B, 0x926F, // <cjk>
    0x5F1F, 0x92ED, // <cjk>
    0x5F25, 0x96ED, // <cjk>
    0x5F26, 0x8CB7, // <cjk>
    0x5F27, 0x8CCA, // <cjk>
    0x5F29, 0x9C57, // <cjk>
    0x5F2D, 0x9C58, // <cjk>
    0x5F2F, 0x9C5E, // <cjk>
    0x5F31, 0x8EE3, // <cjk>
    0x5F35, 0x92A3, // <cjk>
    0x5F37, 0x8BAD, // <cjk>
    0x5F38, 0x9C59, // <cjk>
    0x5F3C, 0x954A, // <cjk>
    0x5F3E, 0x9265, // <cjk>
    0x5F41, 0x9C5A, // <cjk>
    0x5F4A, 0x8BAE, // <cjk>
    0x5F4C, 0x9C5C, // <cjk>
    0x5F4E, 0x9C5D, // <cjk>
    0x5F51, 0x9C5F, // <cjk>
    0x5F53, 0x9396, // <cjk>
    0x5F56, 0x9C60, // <cjk>
    0x5F57, 0x9C61, // <cjk>
    0x5F59, 0x9C62, // <cjk>
    0x5F5C, 0x9C53, // <cjk>
    0x5F5D, 0x9C52, // <cjk>
    0x5F61, 0x9C63, // <cjk>
    0x5F62, 0x8C60, // <cjk>
    0x5F66, 0x9546, // <cjk>
    0x5F69, 0x8DCA, // <cjk>
    0x5F6A, 0x9556, // <cjk>
    0x5F6B, 0x92A4, // <cjk>
    0x5F6C, 0x956A, // <cjk>
    0x5F6D, 0x9C64, // <cjk>
    0x5F70, 0x8FB2, // <cjk>
    0x5F71, 0x8965, // <cjk>
    0x5F73, 0x9C65, // <cjk>
    0x5F77, 0x9C66, // <cjk>
    0x5F79, 0x96F0, // <cjk>
    0x5F7C, 0x94DE, // <cjk>
    0x5F7F, 0x9C69, // <cjk>
    0x5F80, 0x899D, // <cjk>
    0x5F81, 0x90AA, // <cjk>
    0x5F82, 0x9C68, // <cjk>
    0x5F83, 0x9C67, // <cjk>
    0x5F84, 0x8C61, // <cjk>
    0x5F85, 0x91D2, // <cjk>
    0x5F87, 0x9C6D, // <cjk>
    0x5F88, 0x9C6B, // <cjk>
    0x5F8A, 0x9C6A, // <cjk>
    0x5F8B, 0x97A5, // <cjk>
    0x5F8C, 0x8CE3, // <cjk>
    0x5F90, 0x8F99, // <cjk>
    0x5F91, 0x9C6C, // <cjk>
    0x5F92, 0x936B, // <cjk>
    0x5F93, 0x8F5D, // <cjk>
    0x5F97, 0x93BE, // <cjk>
    0x5F98, 0x9C70, // <cjk>
    0x5F99, 0x9C6F, // <cjk>
    0x5F9E, 0x9C6E, // <cjk>
    0x5FA0, 0x9C71, // <cjk>
    0x5FA1, 0x8CE4, // <cjk>
    0x5FA8, 0x9C72, // <cjk>
    0x5FA9, 0x959C, // <cjk>
    0x5FAA, 0x8F7A, // <cjk>
    0x5FAD, 0x9C73, // <cjk>
    0x5FAE, 0x94F7, // <cjk>
    0x5FB3, 0x93BF, // <cjk>
    0x5FB4, 0x92A5, // <cjk>
    0x5FB9, 0x934F, // <cjk>
    0x5FBC, 0x9C74, // <cjk>
    0x5FBD, 0x8B4A, // <cjk>
    0x5FC3, 0x9053, // <cjk>
    0x5FC5, 0x954B, // <cjk>
    0x5FCC, 0x8AF5, // <cjk>
    0x5FCD, 0x9445, // <cjk>
    0x5FD6, 0x9C75, // <cjk>
    0x5FD7, 0x8E75, // <cjk>
    0x5FD8, 0x9659, // <cjk>
    0x5FD9, 0x965A, // <cjk>
    0x5FDC, 0x899E, // <cjk>
    0x5FDD, 0x9C7A, // <cjk>
    0x5FE0, 0x9289, // <cjk>
    0x5FE4, 0x9C77, // <cjk>
    0x5FEB, 0x89F5, // <cjk>
    0x5FF0, 0x9CAB, // <cjk>
    0x5FF1, 0x9C79, // <cjk>
    0x5FF5, 0x944F, // <cjk>
    0x5FF8, 0x9C78, // <cjk>
    0x5FFB, 0x9C76, // <cjk>
    0x5FFD, 0x8D9A, // <cjk>
    0x5FFF, 0x9C7C, // <cjk>
    0x600E, 0x9C83, // <cjk>
    0x600F, 0x9C89, // <cjk>
    0x6010, 0x9C81, // <cjk>
    0x6012, 0x937B, // <cjk>
    0x6015, 0x9C86, // <cjk>
    0x6016, 0x957C, // <cjk>
    0x6019, 0x9C80, // <cjk>
    0x601B, 0x9C85, // <cjk>
    0x601C, 0x97E5, // <cjk>
    0x601D, 0x8E76, // <cjk>
    0x6020, 0x91D3, // <cjk>
    0x6021, 0x9C7D, // <cjk>
    0x6025, 0x8B7D, // <cjk>
    0x6026, 0x9C88, // <cjk>
    0x6027, 0x90AB, // <cjk>
    0x6028, 0x8985, // <cjk>
    0x6029, 0x9C82, // <cjk>
    0x602A, 0x89F6, // <cjk>
    0x602B, 0x9C87, // <cjk>
    0x602F, 0x8BAF, // <cjk>
    0x6031, 0x9C84, // <cjk>
    0x603A, 0x9C8A, // <cjk>
    0x6041, 0x9C8C, // <cjk>
    0x6042, 0x9C96, // <cjk>
    0x6043, 0x9C94, // <cjk>
    0x6046, 0x9C91, // <cjk>
    0x604A, 0x9C90, // <cjk>
    0x604B, 0x97F6, // <cjk>
    0x604D, 0x9C92, // <cjk>
    0x6050, 0x8BB0, // <cjk>
    0x6052, 0x8D50, // <cjk>
    0x6055, 0x8F9A, // <cjk>
    0x6059, 0x9C99, // <cjk>
    0x605A, 0x9C8B, // <cjk>
    0x605F, 0x9C8F, // <cjk>
    0x6060, 0x9C7E, // <cjk>
    0x6062, 0x89F8, // <cjk>
    0x6063, 0x9C93, // <cjk>
    0x6064, 0x9C95, // <cjk>
    0x6065, 0x9270, // <cjk>
    0x6068, 0x8DA6, // <cjk>
    0x6069, 0x89B6, // <cjk>
    0x606A, 0x9C8D, // <cjk>
    0x606B, 0x9C98, // <cjk>
    0x606C, 0x9C97, // <cjk>
    0x606D, 0x8BB1, // <cjk>
    0x606F, 0x91A7, // <cjk>
    0x6070, 0x8A86, // <cjk>
    0x6075, 0x8C62, // <cjk>
    0x6077, 0x9C8E, // <cjk>
    0x6081, 0x9C9A, // <cjk>
    0x6083, 0x9C9D, // <cjk>
    0x6084, 0x9C9F, // <cjk>
    0x6089, 0x8EBB, // <cjk>
    0x608B, 0x9CA5, // <cjk>
    0x608C, 0x92EE, // <cjk>
    0x608D, 0x9C9B, // <cjk>
    0x6092, 0x9CA3, // <cjk>
    0x6094, 0x89F7, // <cjk>
    0x6096, 0x9CA1, // <cjk>
    0x6097, 0x9CA2, // <cjk>
    0x609A, 0x9C9E, // <cjk>
    0x609B, 0x9CA0, // <cjk>
    0x609F, 0x8CE5, // <cjk>
    0x60A0, 0x9749, // <cjk>
    0x60A3, 0x8AB3, // <cjk>
    0x60A6, 0x8978, // <cjk>
    0x60A7, 0x9CA4, // <cjk>
    0x60A9, 0x9459, // <cjk>
    0x60AA, 0x88AB, // <cjk>
    0x60B2, 0x94DF, // <cjk>
    0x60B3, 0x9C7B, // <cjk>
    0x60B4, 0x9CAA, // <cjk>
    0x60B5, 0x9CAE, // <cjk>
    0x60B6, 0x96E3, // <cjk>
    0x60B8, 0x9CA7, // <cjk>
    0x60BC, 0x9389, // <cjk>
    0x60BD, 0x9CAC, // <cjk>
    0x60C5, 0x8FEE, // <cjk>
    0x60C6, 0x9CAD, // <cjk>
    0x60C7, 0x93D5, // <cjk>
    0x60D1, 0x9866, // <cjk>
    0x60D3, 0x9CA9, // <cjk>
    0x60D8, 0x9CAF, // <cjk>
    0x60DA, 0x8D9B, // <cjk>
    0x60DC, 0x90C9, // <cjk>
    0x60DF, 0x88D2, // <cjk>
    0x60E0, 0x9CA8, // <cjk>
    0x60E1, 0x9CA6, // <cjk>
    0x60E3, 0x9179, // <cjk>
    0x60E7, 0x9C9C, // <cjk>
    0x60E8, 0x8E53, // <cjk>
    0x60F0, 0x91C4, // <cjk>
    0x60F1, 0x9CBB, // <cjk>
    0x60F3, 0x917A, // <cjk>
    0x60F4, 0x9CB6, // <cjk>
    0x60F6, 0x9CB3, // <cjk>
    0x60F7, 0x9CB4, // <cjk>
    0x60F9, 0x8EE4, // <cjk>
    0x60FA, 0x9CB7, // <cjk>
    0x60FB, 0x9CBA, // <cjk>
    0x6100, 0x9CB5, // <cjk>
    0x6101, 0x8F44, // <cjk>
    0x6103, 0x9CB8, // <cjk>
    0x6106, 0x9CB2, // <cjk>
    0x6108, 0x96FA, // <cjk>
    0x6109, 0x96F9, // <cjk>
    0x610D, 0x9CBC, // <cjk>
    0x610E, 0x9CBD, // <cjk>
    0x610F, 0x88D3, // <cjk>
    0x6115, 0x9CB1, // <cjk>
    0x611A, 0x8BF0, // <cjk>
    0x611B, 0x88A4, // <cjk>
    0x611F, 0x8AB4, // <cjk>
    0x6121, 0x9CB9, // <cjk>
    0x6127, 0x9CC1, // <cjk>
    0x6128, 0x9CC0, // <cjk>
    0x612C, 0x9CC5, // <cjk>
    0x6134, 0x9CC6, // <cjk>
    0x613C, 0x9CC4, // <cjk>
    0x613D, 0x9CC7, // <cjk>
    0x613E, 0x9CBF, // <cjk>
    0x613F, 0x9CC3, // <cjk>
    0x6142, 0x9CC8, // <cjk>
    0x6144, 0x9CC9, // <cjk>
    0x6147, 0x9CBE, // <cjk>
    0x6148, 0x8E9C, // <cjk>
    0x614A, 0x9CC2, // <cjk>
    0x614B, 0x91D4, // <cjk>
    0x614C, 0x8D51, // <cjk>
    0x614D, 0x9CB0, // <cjk>
    0x614E, 0x9054, // <cjk>
    0x6153, 0x9CD6, // <cjk>
    0x6155, 0x95E7, // <cjk>
    0x6158, 0x9CCC, // <cjk>
    0x6159, 0x9CCD, // <cjk>
    0x615A, 0x9CCE, // <cjk>
    0x615D, 0x9CD5, // <cjk>
    0x615F, 0x9CD4, // <cjk>
    0x6162, 0x969D, // <cjk>
    0x6163, 0x8AB5, // <cjk>
    0x6165, 0x9CD2, // <cjk>
    0x6167, 0x8C64, // <cjk>
    0x6168, 0x8A53, // <cjk>
    0x616B, 0x9CCF, // <cjk>
    0x616E, 0x97B6, // <cjk>
    0x616F, 0x9CD1, // <cjk>
    0x6170, 0x88D4, // <cjk>
    0x6171, 0x9CD3, // <cjk>
    0x6173, 0x9CCA, // <cjk>
    0x6174, 0x9CD0, // <cjk>
    0x6175, 0x9CD7, // <cjk>
    0x6176, 0x8C63, // <cjk>
    0x6177, 0x9CCB, // <cjk>
    0x617E, 0x977C, // <cjk>
    0x6182, 0x974A, // <cjk>
    0x6187, 0x9CDA, // <cjk>
    0x618A, 0x9CDE, // <cjk>
    0x618E, 0x919E, // <cjk>
    0x6190, 0x97F7, // <cjk>
    0x6191, 0x9CDF, // <cjk>
    0x6194, 0x9CDC, // <cjk>
    0x6196, 0x9CD9, // <cjk>
    0x6199, 0x9CD8, // <cjk>
    0x619A, 0x9CDD, // <cjk>
    0x61A4, 0x95AE, // <cjk>
    0x61A7, 0x93B2, // <cjk>
    0x61A9, 0x8C65, // <cjk>
    0x61AB, 0x9CE0, // <cjk>
    0x61AC, 0x9CDB, // <cjk>
    0x61AE, 0x9CE1, // <cjk>
    0x61B2, 0x8C9B, // <cjk>
    0x61B6, 0x89AF, // <cjk>
    0x61BA, 0x9CE9, // <cjk>
    0x61BE, 0x8AB6, // <cjk>
    0x61C3, 0x9CE7, // <cjk>
    0x61C6, 0x9CE8, // <cjk>
    0x61C7, 0x8DA7, // <cjk>
    0x61C8, 0x9CE6, // <cjk>
    0x61C9, 0x9CE4, // <cjk>
    0x61CA, 0x9CE3, // <cjk>
    0x61CB, 0x9CEA, // <cjk>
    0x61CC, 0x9CE2, // <cjk>
    0x61CD, 0x9CEC, // <cjk>
    0x61D0, 0x89F9, // <cjk>
    0x61E3, 0x9CEE, // <cjk>
    0x61E6, 0x9CED, // <cjk>
    0x61F2, 0x92A6, // <cjk>
    0x61F4, 0x9CF1, // <cjk>
    0x61F6, 0x9CEF, // <cjk>
    0x61F7, 0x9CE5, // <cjk>
    0x61F8, 0x8C9C, // <cjk>
    0x61FA, 0x9CF0, // <cjk>
    0x61FC, 0x9CF4, // <cjk>
    0x61FD, 0x9CF3, // <cjk>
    0x61FE, 0x9CF5, // <cjk>
    0x61FF, 0x9CF2, // <cjk>
    0x6200, 0x9CF6, // <cjk>
    0x6208, 0x9CF7, // <cjk>
    0x6209, 0x9CF8, // <cjk>
    0x620A, 0x95E8, // <cjk>
    0x620C, 0x9CFA, // <cjk>
    0x620D, 0x9CF9, // <cjk>
    0x620E, 0x8F5E, // <cjk>
    0x6210, 0x90AC, // <cjk>
    0x6211, 0x89E4, // <cjk>
    0x6212, 0x89FA, // <cjk>
    0x6214, 0x9CFB, // <cjk>
    0x6216, 0x88BD, // <cjk>
    0x621A, 0x90CA, // <cjk>
    0x621B, 0x9CFC, // <cjk>
    0x621D, 0xE6C1, // <cjk>
    0x621E, 0x9D40, // <cjk>
    0x621F, 0x8C81, // <cjk>
    0x6221, 0x9D41, // <cjk>
    0x6226, 0x90ED, // <cjk>
    0x622A, 0x9D42, // <cjk>
    0x622E, 0x9D43, // <cjk>
    0x622F, 0x8B59, // <cjk>
    0x6230, 0x9D44, // <cjk>
    0x6232, 0x9D45, // <cjk>
    0x6233, 0x9D46, // <cjk>
    0x6234, 0x91D5, // <cjk>
    0x6238, 0x8CCB, // <cjk>
    0x623B, 0x96DF, // <cjk>
    0x6240, 0x8F8A, // <cjk>
    0x6241, 0x9D47, // <cjk>
    0x6247, 0x90EE, // <cjk>
    0x6248, 0xE7BB, // <cjk>
    0x6249, 0x94E0, // <cjk>
    0x624B, 0x8EE8, // <cjk>
    0x624D, 0x8DCB, // <cjk>
    0x624E, 0x9D48, // <cjk>
    0x6253, 0x91C5, // <cjk>
    0x6255, 0x95A5, // <cjk>
    0x6258, 0x91EF, // <cjk>
    0x625B, 0x9D4B, // <cjk>
    0x625E, 0x9D49, // <cjk>
    0x6260, 0x9D4C, // <cjk>
    0x6263, 0x9D4A, // <cjk>
    0x6268, 0x9D4D, // <cjk>
    0x626E, 0x95AF, // <cjk>
    0x6271, 0x88B5, // <cjk>
    0x6276, 0x957D, // <cjk>
    0x6279, 0x94E1, // <cjk>
    0x627C, 0x9D4E, // <cjk>
    0x627E, 0x9D51, // <cjk>
    0x627F, 0x8FB3, // <cjk>
    0x6280, 0x8B5A, // <cjk>
    0x6282, 0x9D4F, // <cjk>
    0x6283, 0x9D56, // <cjk>
    0x6284, 0x8FB4, // <cjk>
    0x6289, 0x9D50, // <cjk>
    0x628A, 0x9463, // <cjk>
    0x6291, 0x977D, // <cjk>
    0x6292, 0x9D52, // <cjk>
    0x6293, 0x9D53, // <cjk>
    0x6294, 0x9D57, // <cjk>
    0x6295, 0x938A, // <cjk>
    0x6296, 0x9D54, // <cjk>
    0x6297, 0x8D52, // <cjk>
    0x6298, 0x90DC, // <cjk>
    0x629B, 0x9D65, // <cjk>
    0x629C, 0x94B2, // <cjk>
    0x629E, 0x91F0, // <cjk>
    0x62AB, 0x94E2, // <cjk>
    0x62AC, 0x9DAB, // <cjk>
    0x62B1, 0x95F8, // <cjk>
    0x62B5, 0x92EF, // <cjk>
    0x62B9, 0x9695, // <cjk>
    0x62BB, 0x9D5A, // <cjk>
    0x62BC, 0x899F, // <cjk>
    0x62BD, 0x928A, // <cjk>
    0x62C2, 0x9D63, // <cjk>
    0x62C5, 0x9253, // <cjk>
    0x62C6, 0x9D5D, // <cjk>
    0x62C7, 0x9D64, // <cjk>
    0x62C8, 0x9D5F, // <cjk>
    0x62C9, 0x9D66, // <cjk>
    0x62CA, 0x9D62, // <cjk>
    0x62CC, 0x9D61, // <cjk>
    0x62CD, 0x948F, // <cjk>
    0x62D0, 0x89FB, // <cjk>
    0x62D1, 0x9D59, // <cjk>
    0x62D2, 0x8B91, // <cjk>
    0x62D3, 0x91F1, // <cjk>
    0x62D4, 0x9D55, // <cjk>
    0x62D7, 0x9D58, // <cjk>
    0x62D8, 0x8D53, // <cjk>
    0x62D9, 0x90D9, // <cjk>
    0x62DB, 0x8FB5, // <cjk>
    0x62DC, 0x9D60, // <cjk>
    0x62DD, 0x9471, // <cjk>
    0x62E0, 0x8B92, // <cjk>
    0x62E1, 0x8A67, // <cjk>
    0x62EC, 0x8A87, // <cjk>
    0x62ED, 0x9040, // <cjk>
    0x62EE, 0x9D68, // <cjk>
    0x62EF, 0x9D6D, // <cjk>
    0x62F1, 0x9D69, // <cjk>
    0x62F3, 0x8C9D, // <cjk>
    0x62F5, 0x9D6E, // <cjk>
    0x62F6, 0x8E41, // <cjk>
    0x62F7, 0x8D89, // <cjk>
    0x62FE, 0x8F45, // <cjk>
    0x62FF, 0x9D5C, // <cjk>
    0x6301, 0x8E9D, // <cjk>
    0x6302, 0x9D6B, // <cjk>
    0x6307, 0x8E77, // <cjk>
    0x6308, 0x9D6C, // <cjk>
    0x6309, 0x88C2, // <cjk>
    0x630C, 0x9D67, // <cjk>
    0x6311, 0x92A7, // <cjk>
    0x6319, 0x8B93, // <cjk>
    0x631F, 0x8BB2, // <cjk>
    0x6327, 0x9D6A, // <cjk>
    0x6328, 0x88A5, // <cjk>
    0x632B, 0x8DC1, // <cjk>
    0x632F, 0x9055, // <cjk>
    0x633A, 0x92F0, // <cjk>
    0x633D, 0x94D2, // <cjk>
    0x633E, 0x9D70, // <cjk>
    0x633F, 0x917D, // <cjk>
    0x6349, 0x91A8, // <cjk>
    0x634C, 0x8E4A, // <cjk>
    0x634D, 0x9D71, // <cjk>
    0x634F, 0x9D73, // <cjk>
    0x6350, 0x9D6F, // <cjk>
    0x6355, 0x95DF, // <cjk>
    0x6357, 0x92BB, // <cjk>
    0x635C, 0x917B, // <cjk>
    0x6367, 0x95F9, // <cjk>
    0x6368, 0x8ECC, // <cjk>
    0x6369, 0x9D80, // <cjk>
    0x636B, 0x9D7E, // <cjk>
    0x636E, 0x9098, // <cjk>
    0x6372, 0x8C9E, // <cjk>
    0x6376, 0x9D78, // <cjk>
    0x6377, 0x8FB7, // <cjk>
    0x637A, 0x93E6, // <cjk>
    0x637B, 0x9450, // <cjk>
    0x6380, 0x9D76, // <cjk>
    0x6383, 0x917C, // <cjk>
    0x6388, 0x8EF6, // <cjk>
    0x6389, 0x9D7B, // <cjk>
    0x638C, 0x8FB6, // <cjk>
    0x638E, 0x9D75, // <cjk>
    0x638F, 0x9D7A, // <cjk>
    0x6392, 0x9472, // <cjk>
    0x6396, 0x9D74, // <cjk>
    0x6398, 0x8C40, // <cjk>
    0x639B, 0x8A7C, // <cjk>
    0x639F, 0x9D7C, // <cjk>
    0x63A0, 0x97A9, // <cjk>
    0x63A1, 0x8DCC, // <cjk>
    0x63A2, 0x9254, // <cjk>
    0x63A3, 0x9D79, // <cjk>
    0x63A5, 0x90DA, // <cjk>
    0x63A7, 0x8D54, // <cjk>
    0x63A8, 0x9084, // <cjk>
    0x63A9, 0x8986, // <cjk>
    0x63AB, 0x9D77, // <cjk>
    0x63AC, 0x8B64, // <cjk>
    0x63B2, 0x8C66, // <cjk>
    0x63B4, 0x92CD, // <cjk>
    0x63B5, 0x9D7D, // <cjk>
    0x63BB, 0x917E, // <cjk>
    0x63BE, 0x9D81, // <cjk>
    0x63C0, 0x9D83, // <cjk>
    0x63C3, 0x91B5, // <cjk>
    0x63C4, 0x9D89, // <cjk>
    0x63C6, 0x9D84, // <cjk>
    0x63C9, 0x9D86, // <cjk>
    0x63CF, 0x9560, // <cjk>
    0x63D0, 0x92F1, // <cjk>
    0x63D2, 0x9D87, // <cjk>
    0x63D6, 0x974B, // <cjk>
    0x63DA, 0x9767, // <cjk>
    0x63DB, 0x8AB7, // <cjk>
    0x63E1, 0x88AC, // <cjk>
    0x63E3, 0x9D85, // <cjk>
    0x63E9, 0x9D82, // <cjk>
    0x63EE, 0x8AF6, // <cjk>
    0x63F4, 0x8987, // <cjk>
    0x63F6, 0x9D88, // <cjk>
    0x63FA, 0x9768, // <cjk>
    0x6406, 0x9D8C, // <cjk>
    0x640D, 0x91B9, // <cjk>
    0x640F, 0x9D93, // <cjk>
    0x6413, 0x9D8D, // <cjk>
    0x6416, 0x9D8A, // <cjk>
    0x6417, 0x9D91, // <cjk>
    0x641C, 0x9D72, // <cjk>
    0x6426, 0x9D8E, // <cjk>
    0x6428, 0x9D92, // <cjk>
    0x642C, 0x94C0, // <cjk>
    0x642D, 0x938B, // <cjk>
    0x6434, 0x9D8B, // <cjk>
    0x6436, 0x9D8F, // <cjk>
    0x643A, 0x8C67, // <cjk>
    0x643E, 0x8DEF, // <cjk>
    0x6442, 0x90DB, // <cjk>
    0x644E, 0x9D97, // <cjk>
    0x6458, 0x9345, // <cjk>
    0x6467, 0x9D94, // <cjk>
    0x6469, 0x9680, // <cjk>
    0x646F, 0x9D95, // <cjk>
    0x6476, 0x9D96, // <cjk>
    0x6478, 0x96CC, // <cjk>
    0x647A, 0x90A0, // <cjk>
    0x6483, 0x8C82, // <cjk>
    0x6488, 0x9D9D, // <cjk>
    0x6492, 0x8E54, // <cjk>
    0x6493, 0x9D9A, // <cjk>
    0x6495, 0x9D99, // <cjk>
    0x649A, 0x9451, // <cjk>
    0x649E, 0x93B3, // <cjk>
    0x64A4, 0x9350, // <cjk>
    0x64A5, 0x9D9B, // <cjk>
    0x64A9, 0x9D9C, // <cjk>
    0x64AB, 0x958F, // <cjk>
    0x64AD, 0x9464, // <cjk>
    0x64AE, 0x8E42, // <cjk>
    0x64B0, 0x90EF, // <cjk>
    0x64B2, 0x966F, // <cjk>
    0x64B9, 0x8A68, // <cjk>
    0x64BB, 0x9DA3, // <cjk>
    0x64BC, 0x9D9E, // <cjk>
    0x64C1, 0x9769, // <cjk>
    0x64C2, 0x9DA5, // <cjk>
    0x64C5, 0x9DA1, // <cjk>
    0x64C7, 0x9DA2, // <cjk>
    0x64CD, 0x9180, // <cjk>
    0x64D2, 0x9DA0, // <cjk>
    0x64D4, 0x9D5E, // <cjk>
    0x64D8, 0x9DA4, // <cjk>
    0x64DA, 0x9D9F, // <cjk>
    0x64E0, 0x9DA9, // <cjk>
    0x64E1, 0x9DAA, // <cjk>
    0x64E2, 0x9346, // <cjk>
    0x64E3, 0x9DAC, // <cjk>
    0x64E6, 0x8E43, // <cjk>
    0x64E7, 0x9DA7, // <cjk>
    0x64EF, 0x9DAD, // <cjk>
    0x64F1, 0x9DA6, // <cjk>
    0x64F2, 0x9DB1, // <cjk>
    0x64F4, 0x9DB0, // <cjk>
    0x64F6, 0x9DAF, // <cjk>
    0x64FA, 0x9DB2, // <cjk>
    0x64FD, 0x9DB4, // <cjk>
    0x64FE, 0x8FEF, // <cjk>
    0x6500, 0x9DB3, // <cjk>
    0x6505, 0x9DB7, // <cjk>
    0x6518, 0x9DB5, // <cjk>
    0x651C, 0x9DB6, // <cjk>
    0x651D, 0x9D90, // <cjk>
    0x6523, 0x9DB9, // <cjk>
    0x6524, 0x9DB8, // <cjk>
    0x652A, 0x9D98, // <cjk>
    0x652B, 0x9DBA, // <cjk>
    0x652C, 0x9DAE, // <cjk>
    0x652F, 0x8E78, // <cjk>
    0x6534, 0x9DBB, // <cjk>
    0x6535, 0x9DBC, // <cjk>
    0x6536, 0x9DBE, // <cjk>
    0x6537, 0x9DBD, // <cjk>
    0x6538, 0x9DBF, // <cjk>
    0x6539, 0x89FC, // <cjk>
    0x653B, 0x8D55, // <cjk>
    0x653E, 0x95FA, // <cjk>
    0x653F, 0x90AD, // <cjk>
    0x6545, 0x8CCC, // <cjk>
    0x6548, 0x9DC1, // <cjk>
    0x654D, 0x9DC4, // <cjk>
    0x654F, 0x9571, // <cjk>
    0x6551, 0x8B7E, // <cjk>
    0x6555, 0x9DC3, // <cjk>
    0x6556, 0x9DC2, // <cjk>
    0x6557, 0x9473, // <cjk>
    0x6558, 0x9DC5, // <cjk>
    0x6559, 0x8BB3, // <cjk>
    0x655D, 0x9DC7, // <cjk>
    0x655E, 0x9DC6, // <cjk>
    0x6562, 0x8AB8, // <cjk>
    0x6563, 0x8E55, // <cjk>
    0x6566, 0x93D6, // <cjk>
    0x656C, 0x8C68, // <cjk>
    0x6570, 0x9094, // <cjk>
    0x6572, 0x9DC8, // <cjk>
    0x6574, 0x90AE, // <cjk>
    0x6575, 0x9347, // <cjk>
    0x6577, 0x957E, // <cjk>
    0x6578, 0x9DC9, // <cjk>
    0x6582, 0x9DCA, // <cjk>
    0x6583, 0x9DCB, // <cjk>
    0x6587, 0x95B6, // <cjk>
    0x6588, 0x9B7C, // <cjk>
    0x6589, 0x90C4, // <cjk>
    0x658C, 0x956B, // <cjk>
    0x658E, 0x8DD6, // <cjk>
    0x6590, 0x94E3, // <cjk>
    0x6591, 0x94C1, // <cjk>
    0x6597, 0x936C, // <cjk>
    0x6599, 0x97BF, // <cjk>
    0x659B, 0x9DCD, // <cjk>
    0x659C, 0x8ECE, // <cjk>
    0x659F, 0x9DCE, // <cjk>
    0x65A1, 0x88B4, // <cjk>
    0x65A4, 0x8BD2, // <cjk>
    0x65A5, 0x90CB, // <cjk>
    0x65A7, 0x9580, // <cjk>
    0x65AB, 0x9DCF, // <cjk>
    0x65AC, 0x8E61, // <cjk>
    0x65AD, 0x9266, // <cjk>
    0x65AF, 0x8E7A, // <cjk>
    0x65B0, 0x9056, // <cjk>
    0x65B7, 0x9DD0, // <cjk>
    0x65B9, 0x95FB, // <cjk>
    0x65BC, 0x8997, // <cjk>
    0x65BD, 0x8E7B, // <cjk>
    0x65C1, 0x9DD3, // <cjk>
    0x65C3, 0x9DD1, // <cjk>
    0x65C4, 0x9DD4, // <cjk>
    0x65C5, 0x97B7, // <cjk>
    0x65C6, 0x9DD2, // <cjk>
    0x65CB, 0x90F9, // <cjk>
    0x65CC, 0x9DD5, // <cjk>
    0x65CF, 0x91B0, // <cjk>
    0x65D2, 0x9DD6, // <cjk>
    0x65D7, 0x8AF8, // <cjk>
    0x65D9, 0x9DD8, // <cjk>
    0x65DB, 0x9DD7, // <cjk>
    0x65E0, 0x9DD9, // <cjk>
    0x65E1, 0x9DDA, // <cjk>
    0x65E2, 0x8AF9, // <cjk>
    0x65E5, 0x93FA, // <cjk>
    0x65E6, 0x9255, // <cjk>
    0x65E7, 0x8B8C, // <cjk>
    0x65E8, 0x8E7C, // <cjk>
    0x65E9, 0x9181, // <cjk>
    0x65EC, 0x8F7B, // <cjk>
    0x65ED, 0x88AE, // <cjk>
    0x65F1, 0x9DDB, // <cjk>
    0x65FA, 0x89A0, // <cjk>
    0x65FB, 0x9DDF, // <cjk>
    0x6602, 0x8D56, // <cjk>
    0x6603, 0x9DDE, // <cjk>
    0x6606, 0x8DA9, // <cjk>
    0x6607, 0x8FB8, // <cjk>
    0x660A, 0x9DDD, // <cjk>
    0x660C, 0x8FB9, // <cjk>
    0x660E, 0x96BE, // <cjk>
    0x660F, 0x8DA8, // <cjk>
    0x6613, 0x88D5, // <cjk>
    0x6614, 0x90CC, // <cjk>
    0x661C, 0x9DE4, // <cjk>
    0x661F, 0x90AF, // <cjk>
    0x6620, 0x8966, // <cjk>
    0x6625, 0x8F74, // <cjk>
    0x6627, 0x9686, // <cjk>
    0x6628, 0x8DF0, // <cjk>
    0x662D, 0x8FBA, // <cjk>
    0x662F, 0x90A5, // <cjk>
    0x6634, 0x9DE3, // <cjk>
    0x6635, 0x9DE1, // <cjk>
    0x6636, 0x9DE2, // <cjk>
    0x663C, 0x928B, // <cjk>
    0x663F, 0x9E45, // <cjk>
    0x6641, 0x9DE8, // <cjk>
    0x6642, 0x8E9E, // <cjk>
    0x6643, 0x8D57, // <cjk>
    0x6644, 0x9DE6, // <cjk>
    0x6649, 0x9DE7, // <cjk>
    0x664B, 0x9057, // <cjk>
    0x664F, 0x9DE5, // <cjk>
    0x6652, 0x8E4E, // <cjk>
    0x665D, 0x9DEA, // <cjk>
    0x665E, 0x9DE9, // <cjk>
    0x665F, 0x9DEE, // <cjk>
    0x6662, 0x9DEF, // <cjk>
    0x6664, 0x9DEB, // <cjk>
    0x6666, 0x8A41, // <cjk>
    0x6667, 0x9DEC, // <cjk>
    0x6668, 0x9DED, // <cjk>
    0x6669, 0x94D3, // <cjk>
    0x666E, 0x9581, // <cjk>
    0x666F, 0x8C69, // <cjk>
    0x6670, 0x9DF0, // <cjk>
    0x6674, 0x90B0, // <cjk>
    0x6676, 0x8FBB, // <cjk>
    0x667A, 0x9271, // <cjk>
    0x6681, 0x8BC5, // <cjk>
    0x6683, 0x9DF1, // <cjk>
    0x6684, 0x9DF5, // <cjk>
    0x6687, 0x89C9, // <cjk>
    0x6688, 0x9DF2, // <cjk>
    0x6689, 0x9DF4, // <cjk>
    0x668E, 0x9DF3, // <cjk>
    0x6691, 0x8F8B, // <cjk>
    0x6696, 0x9267, // <cjk>
    0x6697, 0x88C3, // <cjk>
    0x6698, 0x9DF6, // <cjk>
    0x669D, 0x9DF7, // <cjk>
    0x66A2, 0x92A8, // <cjk>
    0x66A6, 0x97EF, // <cjk>
    0x66AB, 0x8E62, // <cjk>
    0x66AE, 0x95E9, // <cjk>
    0x66B4, 0x965C, // <cjk>
    0x66B8, 0x9E41, // <cjk>
    0x66B9, 0x9DF9, // <cjk>
    0x66BC, 0x9DFC, // <cjk>
    0x66BE, 0x9DFB, // <cjk>
    0x66C1, 0x9DF8, // <cjk>
    0x66C4, 0x9E40, // <cjk>
    0x66C7, 0x93DC, // <cjk>
    0x66C9, 0x9DFA, // <cjk>
    0x66D6, 0x9E42, // <cjk>
    0x66D9, 0x8F8C, // <cjk>
    0x66DA, 0x9E43, // <cjk>
    0x66DC, 0x976A, // <cjk>
    0x66DD, 0x9498, // <cjk>
    0x66E0, 0x9E44, // <cjk>
    0x66E6, 0x9E46, // <cjk>
    0x66E9, 0x9E47, // <cjk>
    0x66F0, 0x9E48, // <cjk>
    0x66F2, 0x8BC8, // <cjk>
    0x66F3, 0x8967, // <cjk>
    0x66F4, 0x8D58, // <cjk>
    0x66F5, 0x9E49, // <cjk>
    0x66F7, 0x9E4A, // <cjk>
    0x66F8, 0x8F91, // <cjk>
    0x66F9, 0x9182, // <cjk>
    0x66FC, 0x99D6, // <cjk>
    0x66FD, 0x915D, // <cjk>
    0x66FE, 0x915C, // <cjk>
    0x66FF, 0x91D6, // <cjk>
    0x6700, 0x8DC5, // <cjk>
    0x6703, 0x98F0, // <cjk>
    0x6708, 0x8C8E, // <cjk>
    0x6709, 0x974C, // <cjk>
    0x670B, 0x95FC, // <cjk>
    0x670D, 0x959E, // <cjk>
    0x670F, 0x9E4B, // <cjk>
    0x6714, 0x8DF1, // <cjk>
    0x6715, 0x92BD, // <cjk>
    0x6716, 0x9E4C, // <cjk>
    0x6717, 0x984E, // <cjk>
    0x671B, 0x965D, // <cjk>
    0x671D, 0x92A9, // <cjk>
    0x671E, 0x9E4D, // <cjk>
    0x671F, 0x8AFA, // <cjk>
    0x6726, 0x9E4E, // <cjk>
    0x6727, 0x9E4F, // <cjk>
    0x6728, 0x96D8, // <cjk>
    0x672A, 0x96A2, // <cjk>
    0x672B, 0x9696, // <cjk>
    0x672C, 0x967B, // <cjk>
    0x672D, 0x8E44, // <cjk>
    0x672E, 0x9E51, // <cjk>
    0x6731, 0x8EE9, // <cjk>
    0x6734, 0x9670, // <cjk>
    0x6736, 0x9E53, // <cjk>
    0x6737, 0x9E56, // <cjk>
    0x6738, 0x9E55, // <cjk>
    0x673A, 0x8AF7, // <cjk>
    0x673D, 0x8B80, // <cjk>
    0x673F, 0x9E52, // <cjk>
    0x6741, 0x9E54, // <cjk>
    0x6746, 0x9E57, // <cjk>
    0x6749, 0x9099, // <cjk>
    0x674E, 0x979B, // <cjk>
    0x674F, 0x88C7, // <cjk>
    0x6750, 0x8DDE, // <cjk>
    0x6751, 0x91BA, // <cjk>
    0x6753, 0x8EDB, // <cjk>
    0x6756, 0x8FF1, // <cjk>
    0x6759, 0x9E5A, // <cjk>
    0x675C, 0x936D, // <cjk>
    0x675E, 0x9E58, // <cjk>
    0x675F, 0x91A9, // <cjk>
    0x6760, 0x9E59, // <cjk>
    0x6761, 0x8FF0, // <cjk>
    0x6762, 0x96DB, // <cjk>
    0x6764, 0x9E5C, // <cjk>
    0x6765, 0x9788, // <cjk>
    0x676A, 0x9E61, // <cjk>
    0x676D, 0x8D59, // <cjk>
    0x676F, 0x9474, // <cjk>
    0x6770, 0x9E5E, // <cjk>
    0x6771, 0x938C, // <cjk>
    0x6772, 0x9DDC, // <cjk>
    0x6773, 0x9DE0, // <cjk>
    0x6775, 0x8B6E, // <cjk>
    0x6777, 0x9466, // <cjk>
    0x677C, 0x9E60, // <cjk>
    0x677E, 0x8FBC, // <cjk>
    0x677F, 0x94C2, // <cjk>
    0x6785, 0x9E66, // <cjk>
    0x6787, 0x94F8, // <cjk>
    0x6789, 0x9E5D, // <cjk>
    0x678B, 0x9E63, // <cjk>
    0x678C, 0x9E62, // <cjk>
    0x6790, 0x90CD, // <cjk>
    0x6795, 0x968D, // <cjk>
    0x6797, 0x97D1, // <cjk>
    0x679A, 0x9687, // <cjk>
    0x679C, 0x89CA, // <cjk>
    0x679D, 0x8E7D, // <cjk>
    0x67A0, 0x9867, // <cjk>
    0x67A1, 0x9E65, // <cjk>
    0x67A2, 0x9095, // <cjk>
    0x67A6, 0x9E64, // <cjk>
    0x67A9, 0x9E5F, // <cjk>
    0x67AF, 0x8CCD, // <cjk>
    0x67B3, 0x9E6B, // <cjk>
    0x67B4, 0x9E69, // <cjk>
    0x67B6, 0x89CB, // <cjk>
    0x67B7, 0x9E67, // <cjk>
    0x67B8, 0x9E6D, // <cjk>
    0x67B9, 0x9E73, // <cjk>
    0x67C1, 0x91C6, // <cjk>
    0x67C4, 0x95BF, // <cjk>
    0x67C6, 0x9E75, // <cjk>
    0x67CA, 0x9541, // <cjk>
    0x67CE, 0x9E74, // <cjk>
    0x67CF, 0x9490, // <cjk>
    0x67D0, 0x965E, // <cjk>
    0x67D1, 0x8AB9, // <cjk>
    0x67D3, 0x90F5, // <cjk>
    0x67D4, 0x8F5F, // <cjk>
    0x67D8, 0x92D1, // <cjk>
    0x67DA, 0x974D, // <cjk>
    0x67DD, 0x9E70, // <cjk>
    0x67DE, 0x9E6F, // <cjk>
    0x67E2, 0x9E71, // <cjk>
    0x67E4, 0x9E6E, // <cjk>
    0x67E7, 0x9E76, // <cjk>
    0x67E9, 0x9E6C, // <cjk>
    0x67EC, 0x9E6A, // <cjk>
    0x67EE, 0x9E72, // <cjk>
    0x67EF, 0x9E68, // <cjk>
    0x67F1, 0x928C, // <cjk>
    0x67F3, 0x96F6, // <cjk>
    0x67F4, 0x8EC4, // <cjk>
    0x67F5, 0x8DF2, // <cjk>
    0x67FB, 0x8DB8, // <cjk>
    0x67FE, 0x968F, // <cjk>
    0x67FF, 0x8A60, // <cjk>
    0x6802, 0x92CC, // <cjk>
    0x6803, 0x93C8, // <cjk>
    0x6804, 0x8968, // <cjk>
    0x6813, 0x90F0, // <cjk>
    0x6816, 0x90B2, // <cjk>
    0x6817, 0x8C49, // <cjk>
    0x681E, 0x9E78, // <cjk>
    0x6821, 0x8D5A, // <cjk>
    0x6822, 0x8A9C, // <cjk>
    0x6829, 0x9E7A, // <cjk>
    0x682A, 0x8A94, // <cjk>
    0x682B, 0x9E81, // <cjk>
    0x6832, 0x9E7D, // <cjk>
    0x6834, 0x90F1, // <cjk>
    0x6838, 0x8A6A, // <cjk>
    0x6839, 0x8DAA, // <cjk>
    0x683C, 0x8A69, // <cjk>
    0x683D, 0x8DCD, // <cjk>
    0x6840, 0x9E7B, // <cjk>
    0x6841, 0x8C85, // <cjk>
    0x6842, 0x8C6A, // <cjk>
    0x6843, 0x938D, // <cjk>
    0x6846, 0x9E79, // <cjk>
    0x6848, 0x88C4, // <cjk>
    0x684D, 0x9E7C, // <cjk>
    0x684E, 0x9E7E, // <cjk>
    0x6850, 0x8BCB, // <cjk>
    0x6851, 0x8C4B, // <cjk>
    0x6853, 0x8ABA, // <cjk>
    0x6854, 0x8B6A, // <cjk>
    0x6859, 0x9E82, // <cjk>
    0x685C, 0x8DF7, // <cjk>
    0x685D, 0x9691, // <cjk>
    0x685F, 0x8E56, // <cjk>
    0x6863, 0x9E83, // <cjk>
    0x6867, 0x954F, // <cjk>
    0x6874, 0x9E8F, // <cjk>
    0x6876, 0x89B1, // <cjk>
    0x6877, 0x9E84, // <cjk>
    0x687E, 0x9E95, // <cjk>
    0x687F, 0x9E85, // <cjk>
    0x6881, 0x97C0, // <cjk>
    0x6883, 0x9E8C, // <cjk>
    0x6885, 0x947E, // <cjk>
    0x688D, 0x9E94, // <cjk>
    0x688F, 0x9E87, // <cjk>
    0x6893, 0x88B2, // <cjk>
    0x6894, 0x9E89, // <cjk>
    0x689B, 0x9E8B, // <cjk>
    0x689D, 0x9E8A, // <cjk>
    0x689F, 0x9E86, // <cjk>
    0x68A0, 0x9E91, // <cjk>
    0x68A2, 0x8FBD, // <cjk>
    0x68A6, 0x9AEB, // <cjk>
    0x68A7, 0x8CE6, // <cjk>
    0x68A8, 0x979C, // <cjk>
    0x68AD, 0x9E88, // <cjk>
    0x68AF, 0x92F2, // <cjk>
    0x68B0, 0x8A42, // <cjk>
    0x68B1, 0x8DAB, // <cjk>
    0x68B3, 0x9E80, // <cjk>
    0x68B5, 0x9E90, // <cjk>
    0x68B6, 0x8A81, // <cjk>
    0x68B9, 0x9E8E, // <cjk>
    0x68BA, 0x9E92, // <cjk>
    0x68BC, 0x938E, // <cjk>
    0x68C4, 0x8AFC, // <cjk>
    0x68C6, 0x9EB0, // <cjk>
    0x68C9, 0x96C7, // <cjk>
    0x68CA, 0x9E97, // <cjk>
    0x68CB, 0x8AFB, // <cjk>
    0x68CD, 0x9E9E, // <cjk>
    0x68D2, 0x965F, // <cjk>
    0x68D4, 0x9E9F, // <cjk>
    0x68D5, 0x9EA1, // <cjk>
    0x68D7, 0x9EA5, // <cjk>
    0x68D8, 0x9E99, // <cjk>
    0x68DA, 0x9249, // <cjk>
    0x68DF, 0x938F, // <cjk>
    0x68E0, 0x9EA9, // <cjk>
    0x68E1, 0x9E9C, // <cjk>
    0x68E3, 0x9EA6, // <cjk>
    0x68E7, 0x9EA0, // <cjk>
    0x68EE, 0x9058, // <cjk>
    0x68EF, 0x9EAA, // <cjk>
    0x68F2, 0x90B1, // <cjk>
    0x68F9, 0x9EA8, // <cjk>
    0x68FA, 0x8ABB, // <cjk>
    0x6900, 0x986F, // <cjk>
    0x6901, 0x9E96, // <cjk>
    0x6904, 0x9EA4, // <cjk>
    0x6905, 0x88D6, // <cjk>
    0x6908, 0x9E98, // <cjk>
    0x690B, 0x96B8, // <cjk>
    0x690C, 0x9E9D, // <cjk>
    0x690D, 0x9041, // <cjk>
    0x690E, 0x92C5, // <cjk>
    0x690F, 0x9E93, // <cjk>
    0x6912, 0x9EA3, // <cjk>
    0x6919, 0x909A, // <cjk>
    0x691A, 0x9EAD, // <cjk>
    0x691B, 0x8A91, // <cjk>
    0x691C, 0x8C9F, // <cjk>
    0x6921, 0x9EAF, // <cjk>
    0x6922, 0x9E9A, // <cjk>
    0x6923, 0x9EAE, // <cjk>
    0x6925, 0x9EA7, // <cjk>
    0x6926, 0x9E9B, // <cjk>
    0x6928, 0x9EAB, // <cjk>
    0x692A, 0x9EAC, // <cjk>
    0x6930, 0x9EBD, // <cjk>
    0x6934, 0x93CC, // <cjk>
    0x6936, 0x9EA2, // <cjk>
    0x6939, 0x9EB9, // <cjk>
    0x693D, 0x9EBB, // <cjk>
    0x693F, 0x92D6, // <cjk>
    0x694A, 0x976B, // <cjk>
    0x6953, 0x9596, // <cjk>
    0x6954, 0x9EB6, // <cjk>
    0x6955, 0x91C8, // <cjk>
    0x6959, 0x9EBC, // <cjk>
    0x695A, 0x915E, // <cjk>
    0x695C, 0x9EB3, // <cjk>
    0x695D, 0x9EC0, // <cjk>
    0x695E, 0x9EBF, // <cjk>
    0x6960, 0x93ED, // <cjk>
    0x6961, 0x9EBE, // <cjk>
    0x6962, 0x93E8, // <cjk>
    0x696A, 0x9EC2, // <cjk>
    0x696B, 0x9EB5, // <cjk>
    0x696D, 0x8BC6, // <cjk>
    0x696E, 0x9EB8, // <cjk>
    0x696F, 0x8F7C, // <cjk>
    0x6973, 0x9480, // <cjk>
    0x6974, 0x9EBA, // <cjk>
    0x6975, 0x8BC9, // <cjk>
    0x6977, 0x9EB2, // <cjk>
    0x6978, 0x9EB4, // <cjk>
    0x6979, 0x9EB1, // <cjk>
    0x697C, 0x984F, // <cjk>
    0x697D, 0x8A79, // <cjk>
    0x697E, 0x9EB7, // <cjk>
    0x6981, 0x9EC1, // <cjk>
    0x6982, 0x8A54, // <cjk>
    0x698A, 0x8DE5, // <cjk>
    0x698E, 0x897C, // <cjk>
    0x6991, 0x9ED2, // <cjk>
    0x6994, 0x9850, // <cjk>
    0x6995, 0x9ED5, // <cjk>
    0x699B, 0x9059, // <cjk>
    0x699C, 0x9ED4, // <cjk>
    0x69A0, 0x9ED3, // <cjk>
    0x69A7, 0x9ED0, // <cjk>
    0x69AE, 0x9EC4, // <cjk>
    0x69B1, 0x9EE1, // <cjk>
    0x69B2, 0x9EC3, // <cjk>
    0x69B4, 0x9ED6, // <cjk>
    0x69BB, 0x9ECE, // <cjk>
    0x69BE, 0x9EC9, // <cjk>
    0x69BF, 0x9EC6, // <cjk>
    0x69C1, 0x9EC7, // <cjk>
    0x69C3, 0x9ECF, // <cjk>
    0x69C7, 0xEAA0, // <cjk>
    0x69CA, 0x9ECC, // <cjk>
    0x69CB, 0x8D5C, // <cjk>
    0x69CC, 0x92C6, // <cjk>
    0x69CD, 0x9184, // <cjk>
    0x69CE, 0x9ECA, // <cjk>
    0x69D0, 0x9EC5, // <cjk>
    0x69D3, 0x9EC8, // <cjk>
    0x69D8, 0x976C, // <cjk>
    0x69D9, 0x968A, // <cjk>
    0x69DD, 0x9ECD, // <cjk>
    0x69DE, 0x9ED7, // <cjk>
    0x69E7, 0x9EDF, // <cjk>
    0x69E8, 0x9ED8, // <cjk>
    0x69EB, 0x9EE5, // <cjk>
    0x69ED, 0x9EE3, // <cjk>
    0x69F2, 0x9EDE, // <cjk>
    0x69F9, 0x9EDD, // <cjk>
    0x69FB, 0x92CE, // <cjk>
    0x69FD, 0x9185, // <cjk>
    0x69FF, 0x9EDB, // <cjk>
    0x6A02, 0x9ED9, // <cjk>
    0x6A05, 0x9EE0, // <cjk>
    0x6A0A, 0x9EE6, // <cjk>
    0x6A0B, 0x94F3, // <cjk>
    0x6A0C, 0x9EEC, // <cjk>
    0x6A12, 0x9EE7, // <cjk>
    0x6A13, 0x9EEA, // <cjk>
    0x6A14, 0x9EE4, // <cjk>
    0x6A17, 0x9294, // <cjk>
    0x6A19, 0x9557, // <cjk>
    0x6A1B, 0x9EDA, // <cjk>
    0x6A1E, 0x9EE2, // <cjk>
    0x6A1F, 0x8FBE, // <cjk>
    0x6A21, 0x96CD, // <cjk>
    0x6A22, 0x9EF6, // <cjk>
    0x6A23, 0x9EE9, // <cjk>
    0x6A29, 0x8CA0, // <cjk>
    0x6A2A, 0x89A1, // <cjk>
    0x6A2B, 0x8A7E, // <cjk>
    0x6A2E, 0x9ED1, // <cjk>
    0x6A35, 0x8FBF, // <cjk>
    0x6A36, 0x9EEE, // <cjk>
    0x6A38, 0x9EF5, // <cjk>
    0x6A39, 0x8EF7, // <cjk>
    0x6A3A, 0x8A92, // <cjk>
    0x6A3D, 0x924D, // <cjk>
    0x6A44, 0x9EEB, // <cjk>
    0x6A47, 0x9EF0, // <cjk>
    0x6A48, 0x9EF4, // <cjk>
    0x6A4B, 0x8BB4, // <cjk>
    0x6A58, 0x8B6B, // <cjk>
    0x6A59, 0x9EF2, // <cjk>
    0x6A5F, 0x8B40, // <cjk>
    0x6A61, 0x93C9, // <cjk>
    0x6A62, 0x9EF1, // <cjk>
    0x6A66, 0x9EF3, // <cjk>
    0x6A72, 0x9EED, // <cjk>
    0x6A78, 0x9EEF, // <cjk>
    0x6A7F, 0x8A80, // <cjk>
    0x6A80, 0x9268, // <cjk>
    0x6A84, 0x9EFA, // <cjk>
    0x6A8D, 0x9EF8, // <cjk>
    0x6A8E, 0x8CE7, // <cjk>
    0x6A90, 0x9EF7, // <cjk>
    0x6A97, 0x9F40, // <cjk>
    0x6A9C, 0x9E77, // <cjk>
    0x6AA0, 0x9EF9, // <cjk>
    0x6AA2, 0x9EFB, // <cjk>
    0x6AA3, 0x9EFC, // <cjk>
    0x6AAA, 0x9F4B, // <cjk>
    0x6AAC, 0x9F47, // <cjk>
    0x6AAE, 0x9E8D, // <cjk>
    0x6AB3, 0x9F46, // <cjk>
    0x6AB8, 0x9F45, // <cjk>
    0x6ABB, 0x9F42, // <cjk>
    0x6AC1, 0x9EE8, // <cjk>
    0x6AC2, 0x9F44, // <cjk>
    0x6AC3, 0x9F43, // <cjk>
    0x6AD1, 0x9F49, // <cjk>
    0x6AD3, 0x9845, // <cjk>
    0x6ADA, 0x9F4C, // <cjk>
    0x6ADB, 0x8BF9, // <cjk>
    0x6ADE, 0x9F48, // <cjk>
    0x6ADF, 0x9F4A, // <cjk>
    0x6AE8, 0x94A5, // <cjk>
    0x6AEA, 0x9F4D, // <cjk>
    0x6AFA, 0x9F51, // <cjk>
    0x6AFB, 0x9F4E, // <cjk>
    0x6B04, 0x9793, // <cjk>
    0x6B05, 0x9F4F, // <cjk>
    0x6B0A, 0x9EDC, // <cjk>
    0x6B12, 0x9F52, // <cjk>
    0x6B16, 0x9F53, // <cjk>
    0x6B1D, 0x8954, // <cjk>
    0x6B1F, 0x9F55, // <cjk>
    0x6B20, 0x8C87, // <cjk>
    0x6B21, 0x8E9F, // <cjk>
    0x6B23, 0x8BD3, // <cjk>
    0x6B27, 0x89A2, // <cjk>
    0x6B32, 0x977E, // <cjk>
    0x6B37, 0x9F57, // <cjk>
    0x6B38, 0x9F56, // <cjk>
    0x6B39, 0x9F59, // <cjk>
    0x6B3A, 0x8B5C, // <cjk>
    0x6B3D, 0x8BD4, // <cjk>
    0x6B3E, 0x8ABC, // <cjk>
    0x6B43, 0x9F5C, // <cjk>
    0x6B49, 0x9F5D, // <cjk>
    0x6B4C, 0x89CC, // <cjk>
    0x6B4E, 0x9256, // <cjk>
    0x6B50, 0x9F5E, // <cjk>
    0x6B53, 0x8ABD, // <cjk>
    0x6B54, 0x9F60, // <cjk>
    0x6B59, 0x9F5F, // <cjk>
    0x6B5B, 0x9F61, // <cjk>
    0x6B5F, 0x9F62, // <cjk>
    0x6B61, 0x9F63, // <cjk>
    0x6B62, 0x8E7E, // <cjk>
    0x6B63, 0x90B3, // <cjk>
    0x6B64, 0x8D9F, // <cjk>
    0x6B66, 0x9590, // <cjk>
    0x6B69, 0x95E0, // <cjk>
    0x6B6A, 0x9863, // <cjk>
    0x6B6F, 0x8E95, // <cjk>
    0x6B73, 0x8DCE, // <cjk>
    0x6B74, 0x97F0, // <cjk>
    0x6B78, 0x9F64, // <cjk>
    0x6B79, 0x9F65, // <cjk>
    0x6B7B, 0x8E80, // <cjk>
    0x6B7F, 0x9F66, // <cjk>
    0x6B80, 0x9F67, // <cjk>
    0x6B83, 0x9F69, // <cjk>
    0x6B84, 0x9F68, // <cjk>
    0x6B86, 0x9677, // <cjk>
    0x6B89, 0x8F7D, // <cjk>
    0x6B8A, 0x8EEA, // <cjk>
    0x6B8B, 0x8E63, // <cjk>
    0x6B8D, 0x9F6A, // <cjk>
    0x6B95, 0x9F6C, // <cjk>
    0x6B96, 0x9042, // <cjk>
    0x6B98, 0x9F6B, // <cjk>
    0x6B9E, 0x9F6D, // <cjk>
    0x6BA4, 0x9F6E, // <cjk>
    0x6BAA, 0x9F6F, // <cjk>
    0x6BAB, 0x9F70, // <cjk>
    0x6BAF, 0x9F71, // <cjk>
    0x6BB1, 0x9F73, // <cjk>
    0x6BB2, 0x9F72, // <cjk>
    0x6BB3, 0x9F74, // <cjk>
    0x6BB4, 0x89A3, // <cjk>
    0x6BB5, 0x9269, // <cjk>
    0x6BB7, 0x9F75, // <cjk>
    0x6BBA, 0x8E45, // <cjk>
    0x6BBB, 0x8A6B, // <cjk>
    0x6BBC, 0x9F76, // <cjk>
    0x6BBF, 0x9361, // <cjk>
    0x6BC0, 0x9ACA, // <cjk>
    0x6BC5, 0x8B42, // <cjk>
    0x6BC6, 0x9F77, // <cjk>
    0x6BCB, 0x9F78, // <cjk>
    0x6BCD, 0x95EA, // <cjk>
    0x6BCE, 0x9688, // <cjk>
    0x6BD2, 0x93C5, // <cjk>
    0x6BD3, 0x9F79, // <cjk>
    0x6BD4, 0x94E4, // <cjk>
    0x6BD8, 0x94F9, // <cjk>
    0x6BDB, 0x96D1, // <cjk>
    0x6BDF, 0x9F7A, // <cjk>
    0x6BEB, 0x9F7C, // <cjk>
    0x6BEC, 0x9F7B, // <cjk>
    0x6BEF, 0x9F7E, // <cjk>
    0x6BF3, 0x9F7D, // <cjk>
    0x6C08, 0x9F81, // <cjk>
    0x6C0F, 0x8E81, // <cjk>
    0x6C11, 0x96AF, // <cjk>
    0x6C13, 0x9F82, // <cjk>
    0x6C14, 0x9F83, // <cjk>
    0x6C17, 0x8B43, // <cjk>
    0x6C1B, 0x9F84, // <cjk>
    0x6C23, 0x9F86, // <cjk>
    0x6C24, 0x9F85, // <cjk>
    0x6C34, 0x9085, // <cjk>
    0x6C37, 0x9558, // <cjk>
    0x6C38, 0x8969, // <cjk>
    0x6C3E, 0x94C3, // <cjk>
    0x6C40, 0x92F3, // <cjk>
    0x6C41, 0x8F60, // <cjk>
    0x6C42, 0x8B81, // <cjk>
    0x6C4E, 0x94C4, // <cjk>
    0x6C50, 0x8EAC, // <cjk>
    0x6C55, 0x9F88, // <cjk>
    0x6C57, 0x8ABE, // <cjk>
    0x6C5A, 0x8998, // <cjk>
    0x6C5D, 0x93F0, // <cjk>
    0x6C5E, 0x9F87, // <cjk>
    0x6C5F, 0x8D5D, // <cjk>
    0x6C60, 0x9272, // <cjk>
    0x6C62, 0x9F89, // <cjk>
    0x6C68, 0x9F91, // <cjk>
    0x6C6A, 0x9F8A, // <cjk>
    0x6C70, 0x91BF, // <cjk>
    0x6C72, 0x8B82, // <cjk>
    0x6C73, 0x9F92, // <cjk>
    0x6C7A, 0x8C88, // <cjk>
    0x6C7D, 0x8B44, // <cjk>
    0x6C7E, 0x9F90, // <cjk>
    0x6C81, 0x9F8E, // <cjk>
    0x6C82, 0x9F8B, // <cjk>
    0x6C83, 0x9780, // <cjk>
    0x6C88, 0x92BE, // <cjk>
    0x6C8C, 0x93D7, // <cjk>
    0x6C8D, 0x9F8C, // <cjk>
    0x6C90, 0x9F94, // <cjk>
    0x6C92, 0x9F93, // <cjk>
    0x6C93, 0x8C42, // <cjk>
    0x6C96, 0x89AB, // <cjk>
    0x6C99, 0x8DB9, // <cjk>
    0x6C9A, 0x9F8D, // <cjk>
    0x6C9B, 0x9F8F, // <cjk>
    0x6CA1, 0x9676, // <cjk>
    0x6CA2, 0x91F2, // <cjk>
    0x6CAB, 0x9697, // <cjk>
    0x6CAE, 0x9F9C, // <cjk>
    0x6CB1, 0x9F9D, // <cjk>
    0x6CB3, 0x89CD, // <cjk>
    0x6CB8, 0x95A6, // <cjk>
    0x6CB9, 0x96FB, // <cjk>
    0x6CBA, 0x9F9F, // <cjk>
    0x6CBB, 0x8EA1, // <cjk>
    0x6CBC, 0x8FC0, // <cjk>
    0x6CBD, 0x9F98, // <cjk>
    0x6CBE, 0x9F9E, // <cjk>
    0x6CBF, 0x8988, // <cjk>
    0x6CC1, 0x8BB5, // <cjk>
    0x6CC4, 0x9F95, // <cjk>
    0x6CC5, 0x9F9A, // <cjk>
    0x6CC9, 0x90F2, // <cjk>
    0x6CCA, 0x9491, // <cjk>
    0x6CCC, 0x94E5, // <cjk>
    0x6CD3, 0x9F97, // <cjk>
    0x6CD5, 0x9640, // <cjk>
    0x6CD7, 0x9F99, // <cjk>
    0x6CD9, 0x9FA2, // <cjk>
    0x6CDB, 0x9FA0, // <cjk>
    0x6CDD, 0x9F9B, // <cjk>
    0x6CE1, 0x9641, // <cjk>
    0x6CE2, 0x9467, // <cjk>
    0x6CE3, 0x8B83, // <cjk>
    0x6CE5, 0x9344, // <cjk>
    0x6CE8, 0x928D, // <cjk>
    0x6CEA, 0x9FA3, // <cjk>
    0x6CEF, 0x9FA1, // <cjk>
    0x6CF0, 0x91D7, // <cjk>
    0x6CF1, 0x9F96, // <cjk>
    0x6CF3, 0x896A, // <cjk>
    0x6D0B, 0x976D, // <cjk>
    0x6D0C, 0x9FAE, // <cjk>
    0x6D12, 0x9FAD, // <cjk>
    0x6D17, 0x90F4, // <cjk>
    0x6D19, 0x9FAA, // <cjk>
    0x6D1B, 0x978C, // <cjk>
    0x6D1E, 0x93B4, // <cjk>
    0x6D1F, 0x9FA4, // <cjk>
    0x6D25, 0x92C3, // <cjk>
    0x6D29, 0x896B, // <cjk>
    0x6D2A, 0x8D5E, // <cjk>
    0x6D2B, 0x9FA7, // <cjk>
    0x6D32, 0x8F46, // <cjk>
    0x6D33, 0x9FAC, // <cjk>
    0x6D35, 0x9FAB, // <cjk>
    0x6D36, 0x9FA6, // <cjk>
    0x6D38, 0x9FA9, // <cjk>
    0x6D3B, 0x8A88, // <cjk>
    0x6D3D, 0x9FA8, // <cjk>
    0x6D3E, 0x9468, // <cjk>
    0x6D41, 0x97AC, // <cjk>
    0x6D44, 0x8FF2, // <cjk>
    0x6D45, 0x90F3, // <cjk>
    0x6D59, 0x9FB4, // <cjk>
    0x6D5A, 0x9FB2, // <cjk>
    0x6D5C, 0x956C, // <cjk>
    0x6D63, 0x9FAF, // <cjk>
    0x6D64, 0x9FB1, // <cjk>
    0x6D66, 0x8959, // <cjk>
    0x6D69, 0x8D5F, // <cjk>
    0x6D6A, 0x9851, // <cjk>
    0x6D6C, 0x8A5C, // <cjk>
    0x6D6E, 0x9582, // <cjk>
    0x6D74, 0x9781, // <cjk>
    0x6D77, 0x8A43, // <cjk>
    0x6D78, 0x905A, // <cjk>
    0x6D79, 0x9FB3, // <cjk>
    0x6D85, 0x9FB8, // <cjk>
    0x6D88, 0x8FC1, // <cjk>
    0x6D8C, 0x974F, // <cjk>
    0x6D8E, 0x9FB5, // <cjk>
    0x6D93, 0x9FB0, // <cjk>
    0x6D95, 0x9FB6, // <cjk>
    0x6D99, 0x97DC, // <cjk>
    0x6D9B, 0x9393, // <cjk>
    0x6D9C, 0x93C0, // <cjk>
    0x6DAF, 0x8A55, // <cjk>
    0x6DB2, 0x8974, // <cjk>
    0x6DB5, 0x9FBC, // <cjk>
    0x6DB8, 0x9FBF, // <cjk>
    0x6DBC, 0x97C1, // <cjk>
    0x6DC0, 0x9784, // <cjk>
    0x6DC5, 0x9FC6, // <cjk>
    0x6DC6, 0x9FC0, // <cjk>
    0x6DC7, 0x9FBD, // <cjk>
    0x6DCB, 0x97D2, // <cjk>
    0x6DCC, 0x9FC3, // <cjk>
    0x6DD1, 0x8F69, // <cjk>
    0x6DD2, 0x9FC5, // <cjk>
    0x6DD5, 0x9FCA, // <cjk>
    0x6DD8, 0x9391, // <cjk>
    0x6DD9, 0x9FC8, // <cjk>
    0x6DDE, 0x9FC2, // <cjk>
    0x6DE1, 0x9257, // <cjk>
    0x6DE4, 0x9FC9, // <cjk>
    0x6DE6, 0x9FBE, // <cjk>
    0x6DE8, 0x9FC4, // <cjk>
    0x6DEA, 0x9FCB, // <cjk>
    0x6DEB, 0x88FA, // <cjk>
    0x6DEC, 0x9FC1, // <cjk>
    0x6DEE, 0x9FCC, // <cjk>
    0x6DF3, 0x8F7E, // <cjk>
    0x6DF5, 0x95A3, // <cjk>
    0x6DF7, 0x8DAC, // <cjk>
    0x6DF9, 0x9FB9, // <cjk>
    0x6DFA, 0x9FC7, // <cjk>
    0x6DFB, 0x9359, // <cjk>
    0x6E05, 0x90B4, // <cjk>
    0x6E07, 0x8A89, // <cjk>
    0x6E08, 0x8DCF, // <cjk>
    0x6E09, 0x8FC2, // <cjk>
    0x6E0A, 0x9FBB, // <cjk>
    0x6E0B, 0x8F61, // <cjk>
    0x6E13, 0x8C6B, // <cjk>
    0x6E15, 0x9FBA, // <cjk>
    0x6E19, 0x9FD0, // <cjk>
    0x6E1A, 0x8F8D, // <cjk>
    0x6E1B, 0x8CB8, // <cjk>
    0x6E1D, 0x9FDF, // <cjk>
    0x6E1F, 0x9FD9, // <cjk>
    0x6E20, 0x8B94, // <cjk>
    0x6E21, 0x936E, // <cjk>
    0x6E23, 0x9FD4, // <cjk>
    0x6E24, 0x9FDD, // <cjk>
    0x6E25, 0x88AD, // <cjk>
    0x6E26, 0x8951, // <cjk>
    0x6E29, 0x89B7, // <cjk>
    0x6E2B, 0x9FD6, // <cjk>
    0x6E2C, 0x91AA, // <cjk>
    0x6E2D, 0x9FCD, // <cjk>
    0x6E2E, 0x9FCF, // <cjk>
    0x6E2F, 0x8D60, // <cjk>
    0x6E38, 0x9FE0, // <cjk>
    0x6E3A, 0x9FDB, // <cjk>
    0x6E3E, 0x9FD3, // <cjk>
    0x6E43, 0x9FDA, // <cjk>
    0x6E4A, 0x96A9, // <cjk>
    0x6E4D, 0x9FD8, // <cjk>
    0x6E4E, 0x9FDC, // <cjk>
    0x6E56, 0x8CCE, // <cjk>
    0x6E58, 0x8FC3, // <cjk>
    0x6E5B, 0x9258, // <cjk>
    0x6E5F, 0x9FD2, // <cjk>
    0x6E67, 0x974E, // <cjk>
    0x6E6B, 0x9FD5, // <cjk>
    0x6E6E, 0x9FCE, // <cjk>
    0x6E6F, 0x9392, // <cjk>
    0x6E72, 0x9FD1, // <cjk>
    0x6E76, 0x9FD7, // <cjk>
    0x6E7E, 0x9870, // <cjk>
    0x6E7F, 0x8EBC, // <cjk>
    0x6E80, 0x969E, // <cjk>
    0x6E82, 0x9FE1, // <cjk>
    0x6E8C, 0x94AC, // <cjk>
    0x6E8F, 0x9FED, // <cjk>
    0x6E90, 0x8CB9, // <cjk>
    0x6E96, 0x8F80, // <cjk>
    0x6E98, 0x9FE3, // <cjk>
    0x6E9C, 0x97AD, // <cjk>
    0x6E9D, 0x8D61, // <cjk>
    0x6E9F, 0x9FF0, // <cjk>
    0x6EA2, 0x88EC, // <cjk>
    0x6EA5, 0x9FEE, // <cjk>
    0x6EAA, 0x9FE2, // <cjk>
    0x6EAF, 0x9FE8, // <cjk>
    0x6EB2, 0x9FEA, // <cjk>
    0x6EB6, 0x976E, // <cjk>
    0x6EB7, 0x9FE5, // <cjk>
    0x6EBA, 0x934D, // <cjk>
    0x6EBD, 0x9FE7, // <cjk>
    0x6EC2, 0x9FEF, // <cjk>
    0x6EC4, 0x9FE9, // <cjk>
    0x6EC5, 0x96C5, // <cjk>
    0x6EC9, 0x9FE4, // <cjk>
    0x6ECB, 0x8EA0, // <cjk>
    0x6ECC, 0x9FFC, // <cjk>
    0x6ED1, 0x8A8A, // <cjk>
    0x6ED3, 0x9FE6, // <cjk>
    0x6ED4, 0x9FEB, // <cjk>
    0x6ED5, 0x9FEC, // <cjk>
    0x6EDD, 0x91EA, // <cjk>
    0x6EDE, 0x91D8, // <cjk>
    0x6EEC, 0x9FF4, // <cjk>
    0x6EEF, 0x9FFA, // <cjk>
    0x6EF2, 0x9FF8, // <cjk>
    0x6EF4, 0x9348, // <cjk>
    0x6EF7, 0xE042, // <cjk>
    0x6EF8, 0x9FF5, // <cjk>
    0x6EFE, 0x9FF6, // <cjk>
    0x6EFF, 0x9FDE, // <cjk>
    0x6F01, 0x8B99, // <cjk>
    0x6F02, 0x9559, // <cjk>
    0x6F06, 0x8EBD, // <cjk>
    0x6F09, 0x8D97, // <cjk>
    0x6F0F, 0x9852, // <cjk>
    0x6F11, 0x9FF2, // <cjk>
    0x6F13, 0xE041, // <cjk>
    0x6F14, 0x8989, // <cjk>
    0x6F15, 0x9186, // <cjk>
    0x6F20, 0x9499, // <cjk>
    0x6F22, 0x8ABF, // <cjk>
    0x6F23, 0x97F8, // <cjk>
    0x6F2B, 0x969F, // <cjk>
    0x6F2C, 0x92D0, // <cjk>
    0x6F31, 0x9FF9, // <cjk>
    0x6F32, 0x9FFB, // <cjk>
    0x6F38, 0x9151, // <cjk>
    0x6F3E, 0xE040, // <cjk>
    0x6F3F, 0x9FF7, // <cjk>
    0x6F41, 0x9FF1, // <cjk>
    0x6F45, 0x8AC1, // <cjk>
    0x6F54, 0x8C89, // <cjk>
    0x6F58, 0xE04E, // <cjk>
    0x6F5B, 0xE049, // <cjk>
    0x6F5C, 0x90F6, // <cjk>
    0x6F5F, 0x8A83, // <cjk>
    0x6F64, 0x8F81, // <cjk>
    0x6F66, 0xE052, // <cjk>
    0x6F6D, 0xE04B, // <cjk>
    0x6F6E, 0x92AA, // <cjk>
    0x6F6F, 0xE048, // <cjk>
    0x6F70, 0x92D7, // <cjk>
    0x6F74, 0xE06B, // <cjk>
    0x6F78, 0xE045, // <cjk>
    0x6F7A, 0xE044, // <cjk>
    0x6F7C, 0xE04D, // <cjk>
    0x6F80, 0xE047, // <cjk>
    0x6F81, 0xE046, // <cjk>
    0x6F82, 0xE04C, // <cjk>
    0x6F84, 0x909F, // <cjk>
    0x6F86, 0xE043, // <cjk>
    0x6F8E, 0xE04F, // <cjk>
    0x6F91, 0xE050, // <cjk>
    0x6F97, 0x8AC0, // <cjk>
    0x6FA1, 0xE055, // <cjk>
    0x6FA3, 0xE054, // <cjk>
    0x6FA4, 0xE056, // <cjk>
    0x6FAA, 0xE059, // <cjk>
    0x6FB1, 0x9362, // <cjk>
    0x6FB3, 0xE053, // <cjk>
    0x6FB9, 0xE057, // <cjk>
    0x6FC0, 0x8C83, // <cjk>
    0x6FC1, 0x91F7, // <cjk>
    0x6FC2, 0xE051, // <cjk>
    0x6FC3, 0x945A, // <cjk>
    0x6FC6, 0xE058, // <cjk>
    0x6FD4, 0xE05D, // <cjk>
    0x6FD8, 0xE05E, // <cjk>
    0x6FDB, 0xE061, // <cjk>
    0x6FDF, 0xE05A, // <cjk>
    0x6FE0, 0x8D8A, // <cjk>
    0x6FE1, 0x9447, // <cjk>
    0x6FE4, 0x9FB7, // <cjk>
    0x6FEB, 0x9794, // <cjk>
    0x6FEC, 0xE05C, // <cjk>
    0x6FEE, 0xE060, // <cjk>
    0x6FEF, 0x91F3, // <cjk>
    0x6FF1, 0xE05F, // <cjk>
    0x6FF3, 0xE04A, // <cjk>
    0x6FF6, 0xE889, // <cjk>
    0x6FFA, 0xE064, // <cjk>
    0x6FFE, 0xE068, // <cjk>
    0x7001, 0xE066, // <cjk>
    0x7009, 0xE062, // <cjk>
    0x700B, 0xE063, // <cjk>
    0x700F, 0xE067, // <cjk>
    0x7011, 0xE065, // <cjk>
    0x7015, 0x956D, // <cjk>
    0x7018, 0xE06D, // <cjk>
    0x701A, 0xE06A, // <cjk>
    0x701B, 0xE069, // <cjk>
    0x701D, 0xE06C, // <cjk>
    0x701E, 0x93D2, // <cjk>
    0x701F, 0xE06E, // <cjk>
    0x7026, 0x9295, // <cjk>
    0x7027, 0x91EB, // <cjk>
    0x702C, 0x90A3, // <cjk>
    0x7030, 0xE06F, // <cjk>
    0x7032, 0xE071, // <cjk>
    0x703E, 0xE070, // <cjk>
    0x704C, 0x9FF3, // <cjk>
    0x7051, 0xE072, // <cjk>
    0x7058, 0x93E5, // <cjk>
    0x7063, 0xE073, // <cjk>
    0x706B, 0x89CE, // <cjk>
    0x706F, 0x9394, // <cjk>
    0x7070, 0x8A44, // <cjk>
    0x7078, 0x8B84, // <cjk>
    0x707C, 0x8EDC, // <cjk>
    0x707D, 0x8DD0, // <cjk>
    0x7089, 0x9846, // <cjk>
    0x708A, 0x9086, // <cjk>
    0x708E, 0x898A, // <cjk>
    0x7092, 0xE075, // <cjk>
    0x7099, 0xE074, // <cjk>
    0x70AC, 0xE078, // <cjk>
    0x70AD, 0x9259, // <cjk>
    0x70AE, 0xE07B, // <cjk>
    0x70AF, 0xE076, // <cjk>
    0x70B3, 0xE07A, // <cjk>
    0x70B8, 0xE079, // <cjk>
    0x70B9, 0x935F, // <cjk>
    0x70BA, 0x88D7, // <cjk>
    0x70C8, 0x97F3, // <cjk>
    0x70CB, 0xE07D, // <cjk>
    0x70CF, 0x8947, // <cjk>
    0x70D9, 0xE080, // <cjk>
    0x70DD, 0xE07E, // <cjk>
    0x70DF, 0xE07C, // <cjk>
    0x70F1, 0xE077, // <cjk>
    0x70F9, 0x9642, // <cjk>
    0x70FD, 0xE082, // <cjk>
    0x7109, 0xE081, // <cjk>
    0x7114, 0x898B, // <cjk>
    0x7119, 0xE084, // <cjk>
    0x711A, 0x95B0, // <cjk>
    0x711C, 0xE083, // <cjk>
    0x7121, 0x96B3, // <cjk>
    0x7126, 0x8FC5, // <cjk>
    0x7136, 0x9152, // <cjk>
    0x713C, 0x8FC4, // <cjk>
    0x7149, 0x97F9, // <cjk>
    0x714C, 0xE08A, // <cjk>
    0x714E, 0x90F7, // <cjk>
    0x7155, 0xE086, // <cjk>
    0x7156, 0xE08B, // <cjk>
    0x7159, 0x898C, // <cjk>
    0x7162, 0xE089, // <cjk>
    0x7164, 0x9481, // <cjk>
    0x7165, 0xE085, // <cjk>
    0x7166, 0xE088, // <cjk>
    0x7167, 0x8FC6, // <cjk>
    0x7169, 0x94CF, // <cjk>
    0x716C, 0xE08C, // <cjk>
    0x716E, 0x8ECF, // <cjk>
    0x717D, 0x90F8, // <cjk>
    0x7184, 0xE08F, // <cjk>
    0x7188, 0xE087, // <cjk>
    0x718A, 0x8C46, // <cjk>
    0x718F, 0xE08D, // <cjk>
    0x7194, 0x976F, // <cjk>
    0x7195, 0xE090, // <cjk>
    0x7199, 0xEAA4, // <cjk>
    0x719F, 0x8F6E, // <cjk>
    0x71A8, 0xE091, // <cjk>
    0x71AC, 0xE092, // <cjk>
    0x71B1, 0x944D, // <cjk>
    0x71B9, 0xE094, // <cjk>
    0x71BE, 0xE095, // <cjk>
    0x71C3, 0x9452, // <cjk>
    0x71C8, 0x9395, // <cjk>
    0x71C9, 0xE097, // <cjk>
    0x71CE, 0xE099, // <cjk>
    0x71D0, 0x97D3, // <cjk>
    0x71D2, 0xE096, // <cjk>
    0x71D4, 0xE098, // <cjk>
    0x71D5, 0x898D, // <cjk>
    0x71D7, 0xE093, // <cjk>
    0x71DF, 0x9A7A, // <cjk>
    0x71E0, 0xE09A, // <cjk>
    0x71E5, 0x9187, // <cjk>
    0x71E6, 0x8E57, // <cjk>
    0x71E7, 0xE09C, // <cjk>
    0x71EC, 0xE09B, // <cjk>
    0x71ED, 0x9043, // <cjk>
    0x71EE, 0x99D7, // <cjk>
    0x71F5, 0xE09D, // <cjk>
    0x71F9, 0xE09F, // <cjk>
    0x71FB, 0xE08E, // <cjk>
    0x71FC, 0xE09E, // <cjk>
    0x71FF, 0xE0A0, // <cjk>
    0x7206, 0x949A, // <cjk>
    0x720D, 0xE0A1, // <cjk>
    0x7210, 0xE0A2, // <cjk>
    0x721B, 0xE0A3, // <cjk>
    0x7228, 0xE0A4, // <cjk>
    0x722A, 0x92DC, // <cjk>
    0x722C, 0xE0A6, // <cjk>
    0x722D, 0xE0A5, // <cjk>
    0x7230, 0xE0A7, // <cjk>
    0x7232, 0xE0A8, // <cjk>
    0x7235, 0x8EDD, // <cjk>
    0x7236, 0x9583, // <cjk>
    0x723A, 0x96EA, // <cjk>
    0x723B, 0xE0A9, // <cjk>
    0x723C, 0xE0AA, // <cjk>
    0x723D, 0x9175, // <cjk>
    0x723E, 0x8EA2, // <cjk>
    0x723F, 0xE0AB, // <cjk>
    0x7240, 0xE0AC, // <cjk>
    0x7246, 0xE0AD, // <cjk>
    0x7247, 0x95D0, // <cjk>
    0x7248, 0x94C5, // <cjk>
    0x724B, 0xE0AE, // <cjk>
    0x724C, 0x9476, // <cjk>
    0x7252, 0x92AB, // <cjk>
    0x7258, 0xE0AF, // <cjk>
    0x7259, 0x89E5, // <cjk>
    0x725B, 0x8B8D, // <cjk>
    0x725D, 0x96C4, // <cjk>
    0x725F, 0x96B4, // <cjk>
    0x7261, 0x89B2, // <cjk>
    0x7262, 0x9853, // <cjk>
    0x7267, 0x9671, // <cjk>
    0x7269, 0x95A8, // <cjk>
    0x7272, 0x90B5, // <cjk>
    0x7274, 0xE0B0, // <cjk>
    0x7279, 0x93C1, // <cjk>
    0x727D, 0x8CA1, // <cjk>
    0x727E, 0xE0B1, // <cjk>
    0x7280, 0x8DD2, // <cjk>
    0x7281, 0xE0B3, // <cjk>
    0x7282, 0xE0B2, // <cjk>
    0x7287, 0xE0B4, // <cjk>
    0x7292, 0xE0B5, // <cjk>
    0x7296, 0xE0B6, // <cjk>
    0x72A0, 0x8B5D, // <cjk>
    0x72A2, 0xE0B7, // <cjk>
    0x72A7, 0xE0B8, // <cjk>
    0x72AC, 0x8CA2, // <cjk>
    0x72AF, 0x94C6, // <cjk>
    0x72B2, 0xE0BA, // <cjk>
    0x72B6, 0x8FF3, // <cjk>
    0x72B9, 0xE0B9, // <cjk>
    0x72C2, 0x8BB6, // <cjk>
    0x72C3, 0xE0BB, // <cjk>
    0x72C4, 0xE0BD, // <cjk>
    0x72C6, 0xE0BC, // <cjk>
    0x72CE, 0xE0BE, // <cjk>
    0x72D0, 0x8CCF, // <cjk>
    0x72D2, 0xE0BF, // <cjk>
    0x72D7, 0x8BE7, // <cjk>
    0x72D9, 0x915F, // <cjk>
    0x72DB, 0x8D9D, // <cjk>
    0x72E0, 0xE0C1, // <cjk>
    0x72E1, 0xE0C2, // <cjk>
    0x72E2, 0xE0C0, // <cjk>
    0x72E9, 0x8EEB, // <cjk>
    0x72EC, 0x93C6, // <cjk>
    0x72ED, 0x8BB7, // <cjk>
    0x72F7, 0xE0C4, // <cjk>
    0x72F8, 0x924B, // <cjk>
    0x72F9, 0xE0C3, // <cjk>
    0x72FC, 0x9854, // <cjk>
    0x72FD, 0x9482, // <cjk>
    0x730A, 0xE0C7, // <cjk>
    0x7316, 0xE0C9, // <cjk>
    0x7317, 0xE0C6, // <cjk>
    0x731B, 0x96D2, // <cjk>
    0x731C, 0xE0C8, // <cjk>
    0x731D, 0xE0CA, // <cjk>
    0x731F, 0x97C2, // <cjk>
    0x7325, 0xE0CE, // <cjk>
    0x7329, 0xE0CD, // <cjk>
    0x732A, 0x9296, // <cjk>
    0x732B, 0x944C, // <cjk>
    0x732E, 0x8CA3, // <cjk>
    0x732F, 0xE0CC, // <cjk>
    0x7334, 0xE0CB, // <cjk>
    0x7336, 0x9750, // <cjk>
    0x7337, 0x9751, // <cjk>
    0x733E, 0xE0CF, // <cjk>
    0x733F, 0x898E, // <cjk>
    0x7344, 0x8D96, // <cjk>
    0x7345, 0x8E82, // <cjk>
    0x734E, 0xE0D0, // <cjk>
    0x734F, 0xE0D1, // <cjk>
    0x7357, 0xE0D3, // <cjk>
    0x7363, 0x8F62, // <cjk>
    0x7368, 0xE0D5, // <cjk>
    0x736A, 0xE0D4, // <cjk>
    0x7370, 0xE0D6, // <cjk>
    0x7372, 0x8A6C, // <cjk>
    0x7375, 0xE0D8, // <cjk>
    0x7378, 0xE0D7, // <cjk>
    0x737A, 0xE0DA, // <cjk>
    0x737B, 0xE0D9, // <cjk>
    0x7384, 0x8CBA, // <cjk>
    0x7387, 0x97A6, // <cjk>
    0x7389, 0x8BCA, // <cjk>
    0x738B, 0x89A4, // <cjk>
    0x7396, 0x8BE8, // <cjk>
    0x73A9, 0x8ADF, // <cjk>
    0x73B2, 0x97E6, // <cjk>
    0x73B3, 0xE0DC, // <cjk>
    0x73BB, 0xE0DE, // <cjk>
    0x73C0, 0xE0DF, // <cjk>
    0x73C2, 0x89CF, // <cjk>
    0x73C8, 0xE0DB, // <cjk>
    0x73CA, 0x8E58, // <cjk>
    0x73CD, 0x92BF, // <cjk>
    0x73CE, 0xE0DD, // <cjk>
    0x73DE, 0xE0E2, // <cjk>
    0x73E0, 0x8EEC, // <cjk>
    0x73E5, 0xE0E0, // <cjk>
    0x73EA, 0x8C5D, // <cjk>
    0x73ED, 0x94C7, // <cjk>
    0x73EE, 0xE0E1, // <cjk>
    0x73F1, 0xE0FC, // <cjk>
    0x73F8, 0xE0E7, // <cjk>
    0x73FE, 0x8CBB, // <cjk>
    0x7403, 0x8B85, // <cjk>
    0x7405, 0xE0E4, // <cjk>
    0x7406, 0x979D, // <cjk>
    0x7409, 0x97AE, // <cjk>
    0x7422, 0x91F4, // <cjk>
    0x7425, 0xE0E6, // <cjk>
    0x7432, 0xE0E8, // <cjk>
    0x7433, 0x97D4, // <cjk>
    0x7434, 0x8BD5, // <cjk>
    0x7435, 0x94FA, // <cjk>
    0x7436, 0x9469, // <cjk>
    0x743A, 0xE0E9, // <cjk>
    0x743F, 0xE0EB, // <cjk>
    0x7441, 0xE0EE, // <cjk>
    0x7455, 0xE0EA, // <cjk>
    0x7459, 0xE0ED, // <cjk>
    0x745A, 0x8CE8, // <cjk>
    0x745B, 0x896C, // <cjk>
    0x745C, 0xE0EF, // <cjk>
    0x745E, 0x9090, // <cjk>
    0x745F, 0xE0EC, // <cjk>
    0x7460, 0x97DA, // <cjk>
    0x7463, 0xE0F2, // <cjk>
    0x7464, 0xEAA2, // <cjk>
    0x7469, 0xE0F0, // <cjk>
    0x746A, 0xE0F3, // <cjk>
    0x746F, 0xE0E5, // <cjk>
    0x7470, 0xE0F1, // <cjk>
    0x7473, 0x8DBA, // <cjk>
    0x7476, 0xE0F4, // <cjk>
    0x747E, 0xE0F5, // <cjk>
    0x7483, 0x979E, // <cjk>
    0x748B, 0xE0F6, // <cjk>
    0x749E, 0xE0F7, // <cjk>
    0x74A2, 0xE0E3, // <cjk>
    0x74A7, 0xE0F8, // <cjk>
    0x74B0, 0x8AC2, // <cjk>
    0x74BD, 0x8EA3, // <cjk>
    0x74CA, 0xE0F9, // <cjk>
    0x74CF, 0xE0FA, // <cjk>
    0x74D4, 0xE0FB, // <cjk>
    0x74DC, 0x895A, // <cjk>
    0x74E0, 0xE140, // <cjk>
    0x74E2, 0x955A, // <cjk>
    0x74E3, 0xE141, // <cjk>
    0x74E6, 0x8AA2, // <cjk>
    0x74E7, 0xE142, // <cjk>
    0x74E9, 0xE143, // <cjk>
    0x74EE, 0xE144, // <cjk>
    0x74F0, 0xE146, // <cjk>
    0x74F1, 0xE147, // <cjk>
    0x74F2, 0xE145, // <cjk>
    0x74F6, 0x9572, // <cjk>
    0x74F7, 0xE149, // <cjk>
    0x74F8, 0xE148, // <cjk>
    0x7503, 0xE14B, // <cjk>
    0x7504, 0xE14A, // <cjk>
    0x7505, 0xE14C, // <cjk>
    0x750C, 0xE14D, // <cjk>
    0x750D, 0xE14F, // <cjk>
    0x750E, 0xE14E, // <cjk>
    0x7511, 0x8D99, // <cjk>
    0x7513, 0xE151, // <cjk>
    0x7515, 0xE150, // <cjk>
    0x7518, 0x8AC3, // <cjk>
    0x751A, 0x9072, // <cjk>
    0x751E, 0xE152, // <cjk>
    0x751F, 0x90B6, // <cjk>
    0x7523, 0x8E59, // <cjk>
    0x7525, 0x8999, // <cjk>
    0x7526, 0xE153, // <cjk>
    0x7528, 0x9770, // <cjk>
    0x752B, 0x95E1, // <cjk>
    0x752C, 0xE154, // <cjk>
    0x7530, 0x9363, // <cjk>
    0x7531, 0x9752, // <cjk>
    0x7532, 0x8D62, // <cjk>
    0x7533, 0x905C, // <cjk>
    0x7537, 0x926A, // <cjk>
    0x7538, 0x99B2, // <cjk>
    0x753A, 0x92AC, // <cjk>
    0x753B, 0x89E6, // <cjk>
    0x753C, 0xE155, // <cjk>
    0x7544, 0xE156, // <cjk>
    0x7549, 0xE159, // <cjk>
    0x754A, 0xE158, // <cjk>
    0x754B, 0x9DC0, // <cjk>
    0x754C, 0x8A45, // <cjk>
    0x754D, 0xE157, // <cjk>
    0x754F, 0x88D8, // <cjk>
    0x7551, 0x94A8, // <cjk>
    0x7554, 0x94C8, // <cjk>
    0x7559, 0x97AF, // <cjk>
    0x755A, 0xE15C, // <cjk>
    0x755B, 0xE15A, // <cjk>
    0x755C, 0x927B, // <cjk>
    0x755D, 0x90A4, // <cjk>
    0x7560, 0x94A9, // <cjk>
    0x7562, 0x954C, // <cjk>
    0x7564, 0xE15E, // <cjk>
    0x7565, 0x97AA, // <cjk>
    0x7566, 0x8C6C, // <cjk>
    0x7567, 0xE15F, // <cjk>
    0x7569, 0xE15D, // <cjk>
    0x756A, 0x94D4, // <cjk>
    0x756B, 0xE160, // <cjk>
    0x756D, 0xE161, // <cjk>
    0x7570, 0x88D9, // <cjk>
    0x7573, 0x8FF4, // <cjk>
    0x7574, 0xE166, // <cjk>
    0x7576, 0xE163, // <cjk>
    0x7577, 0x93EB, // <cjk>
    0x7578, 0xE162, // <cjk>
    0x757F, 0x8B45, // <cjk>
    0x7582, 0xE169, // <cjk>
    0x7586, 0xE164, // <cjk>
    0x7587, 0xE165, // <cjk>
    0x7589, 0xE168, // <cjk>
    0x758A, 0xE167, // <cjk>
    0x758B, 0x9544, // <cjk>
    0x758E, 0x9161, // <cjk>
    0x758F, 0x9160, // <cjk>
    0x7591, 0x8B5E, // <cjk>
    0x7594, 0xE16A, // <cjk>
    0x759A, 0xE16B, // <cjk>
    0x759D, 0xE16C, // <cjk>
    0x75A3, 0xE16E, // <cjk>
    0x75A5, 0xE16D, // <cjk>
    0x75AB, 0x8975, // <cjk>
    0x75B1, 0xE176, // <cjk>
    0x75B2, 0x94E6, // <cjk>
    0x75B3, 0xE170, // <cjk>
    0x75B5, 0xE172, // <cjk>
    0x75B8, 0xE174, // <cjk>
    0x75B9, 0x905D, // <cjk>
    0x75BC, 0xE175, // <cjk>
    0x75BD, 0xE173, // <cjk>
    0x75BE, 0x8EBE, // <cjk>
    0x75C2, 0xE16F, // <cjk>
    0x75C3, 0xE171, // <cjk>
    0x75C5, 0x9561, // <cjk>
    0x75C7, 0x8FC7, // <cjk>
    0x75CA, 0xE178, // <cjk>
    0x75CD, 0xE177, // <cjk>
    0x75D2, 0xE179, // <cjk>
    0x75D4, 0x8EA4, // <cjk>
    0x75D5, 0x8DAD, // <cjk>
    0x75D8, 0x9397, // <cjk>
    0x75D9, 0xE17A, // <cjk>
    0x75DB, 0x92C9, // <cjk>
    0x75DE, 0xE17C, // <cjk>
    0x75E2, 0x979F, // <cjk>
    0x75E3, 0xE17B, // <cjk>
    0x75E9, 0x9189, // <cjk>
    0x75F0, 0xE182, // <cjk>
    0x75F2, 0xE184, // <cjk>
    0x75F3, 0xE185, // <cjk>
    0x75F4, 0x9273, // <cjk>
    0x75FA, 0xE183, // <cjk>
    0x75FC, 0xE180, // <cjk>
    0x75FE, 0xE17D, // <cjk>
    0x75FF, 0xE17E, // <cjk>
    0x7601, 0xE181, // <cjk>
    0x7609, 0xE188, // <cjk>
    0x760B, 0xE186, // <cjk>
    0x760D, 0xE187, // <cjk>
    0x761F, 0xE189, // <cjk>
    0x7620, 0xE18B, // <cjk>
    0x7621, 0xE18C, // <cjk>
    0x7622, 0xE18D, // <cjk>
    0x7624, 0xE18E, // <cjk>
    0x7627, 0xE18A, // <cjk>
    0x7630, 0xE190, // <cjk>
    0x7634, 0xE18F, // <cjk>
    0x763B, 0xE191, // <cjk>
    0x7642, 0x97C3, // <cjk>
    0x7646, 0xE194, // <cjk>
    0x7647, 0xE192, // <cjk>
    0x7648, 0xE193, // <cjk>
    0x764C, 0x8AE0, // <cjk>
    0x7652, 0x96FC, // <cjk>
    0x7656, 0x95C8, // <cjk>
    0x7658, 0xE196, // <cjk>
    0x765C, 0xE195, // <cjk>
    0x7661, 0xE197, // <cjk>
    0x7662, 0xE198, // <cjk>
    0x7667, 0xE19C, // <cjk>
    0x7668, 0xE199, // <cjk>
    0x7669, 0xE19A, // <cjk>
    0x766A, 0xE19B, // <cjk>
    0x766C, 0xE19D, // <cjk>
    0x7670, 0xE19E, // <cjk>
    0x7672, 0xE19F, // <cjk>
    0x7676, 0xE1A0, // <cjk>
    0x7678, 0xE1A1, // <cjk>
    0x767A, 0x94AD, // <cjk>
    0x767B, 0x936F, // <cjk>
    0x767C, 0xE1A2, // <cjk>
    0x767D, 0x9492, // <cjk>
    0x767E, 0x9553, // <cjk>
    0x7680, 0xE1A3, // <cjk>
    0x7683, 0xE1A4, // <cjk>
    0x7684, 0x9349, // <cjk>
    0x7686, 0x8A46, // <cjk>
    0x7687, 0x8D63, // <cjk>
    0x7688, 0xE1A5, // <cjk>
    0x768B, 0xE1A6, // <cjk>
    0x768E, 0xE1A7, // <cjk>
    0x7690, 0x8E48, // <cjk>
    0x7693, 0xE1A9, // <cjk>
    0x7696, 0xE1A8, // <cjk>
    0x7699, 0xE1AA, // <cjk>
    0x769A, 0xE1AB, // <cjk>
    0x76AE, 0x94E7, // <cjk>
    0x76B0, 0xE1AC, // <cjk>
    0x76B4, 0xE1AD, // <cjk>
    0x76B7, 0xEA89, // <cjk>
    0x76B8, 0xE1AE, // <cjk>
    0x76B9, 0xE1AF, // <cjk>
    0x76BA, 0xE1B0, // <cjk>
    0x76BF, 0x8E4D, // <cjk>
    0x76C2, 0xE1B1, // <cjk>
    0x76C3, 0x9475, // <cjk>
    0x76C6, 0x967E, // <cjk>
    0x76C8, 0x896D, // <cjk>
    0x76CA, 0x8976, // <cjk>
    0x76CD, 0xE1B2, // <cjk>
    0x76D2, 0xE1B4, // <cjk>
    0x76D6, 0xE1B3, // <cjk>
    0x76D7, 0x9390, // <cjk>
    0x76DB, 0x90B7, // <cjk>
    0x76DC, 0x9F58, // <cjk>
    0x76DE, 0xE1B5, // <cjk>
    0x76DF, 0x96BF, // <cjk>
    0x76E1, 0xE1B6, // <cjk>
    0x76E3, 0x8AC4, // <cjk>
    0x76E4, 0x94D5, // <cjk>
    0x76E5, 0xE1B7, // <cjk>
    0x76E7, 0xE1B8, // <cjk>
    0x76EA, 0xE1B9, // <cjk>
    0x76EE, 0x96DA, // <cjk>
    0x76F2, 0x96D3, // <cjk>
    0x76F4, 0x92BC, // <cjk>
    0x76F8, 0x918A, // <cjk>
    0x76FB, 0xE1BB, // <cjk>
    0x76FE, 0x8F82, // <cjk>
    0x7701, 0x8FC8, // <cjk>
    0x7704, 0xE1BE, // <cjk>
    0x7707, 0xE1BD, // <cjk>
    0x7708, 0xE1BC, // <cjk>
    0x7709, 0x94FB, // <cjk>
    0x770B, 0x8AC5, // <cjk>
    0x770C, 0x8CA7, // <cjk>
    0x771B, 0xE1C4, // <cjk>
    0x771E, 0xE1C1, // <cjk>
    0x771F, 0x905E, // <cjk>
    0x7720, 0x96B0, // <cjk>
    0x7724, 0xE1C0, // <cjk>
    0x7725, 0xE1C2, // <cjk>
    0x7726, 0xE1C3, // <cjk>
    0x7729, 0xE1BF, // <cjk>
    0x7737, 0xE1C5, // <cjk>
    0x7738, 0xE1C6, // <cjk>
    0x773A, 0x92AD, // <cjk>
    0x773C, 0x8AE1, // <cjk>
    0x7740, 0x9285, // <cjk>
    0x7747, 0xE1C7, // <cjk>
    0x775A, 0xE1C8, // <cjk>
    0x775B, 0xE1CB, // <cjk>
    0x7761, 0x9087, // <cjk>
    0x7763, 0x93C2, // <cjk>
    0x7765, 0xE1CC, // <cjk>
    0x7766, 0x9672, // <cjk>
    0x7768, 0xE1C9, // <cjk>
    0x776B, 0xE1CA, // <cjk>
    0x7779, 0xE1CF, // <cjk>
    0x777E, 0xE1CE, // <cjk>
    0x777F, 0xE1CD, // <cjk>
    0x778B, 0xE1D1, // <cjk>
    0x778E, 0xE1D0, // <cjk>
    0x7791, 0xE1D2, // <cjk>
    0x779E, 0xE1D4, // <cjk>
    0x77A0, 0xE1D3, // <cjk>
    0x77A5, 0x95CB, // <cjk>
    0x77AC, 0x8F75, // <cjk>
    0x77AD, 0x97C4, // <cjk>
    0x77B0, 0xE1D5, // <cjk>
    0x77B3, 0x93B5, // <cjk>
    0x77B6, 0xE1D6, // <cjk>
    0x77B9, 0xE1D7, // <cjk>
    0x77BB, 0xE1DB, // <cjk>
    0x77BC, 0xE1D9, // <cjk>
    0x77BD, 0xE1DA, // <cjk>
    0x77BF, 0xE1D8, // <cjk>
    0x77C7, 0xE1DC, // <cjk>
    0x77CD, 0xE1DD, // <cjk>
    0x77D7, 0xE1DE, // <cjk>
    0x77DA, 0xE1DF, // <cjk>
    0x77DB, 0x96B5, // <cjk>
    0x77DC, 0xE1E0, // <cjk>
    0x77E2, 0x96EE, // <cjk>
    0x77E3, 0xE1E1, // <cjk>
    0x77E5, 0x926D, // <cjk>
    0x77E7, 0x948A, // <cjk>
    0x77E9, 0x8BE9, // <cjk>
    0x77ED, 0x925A, // <cjk>
    0x77EE, 0xE1E2, // <cjk>
    0x77EF, 0x8BB8, // <cjk>
    0x77F3, 0x90CE, // <cjk>
    0x77FC, 0xE1E3, // <cjk>
    0x7802, 0x8DBB, // <cjk>
    0x780C, 0xE1E4, // <cjk>
    0x7812, 0xE1E5, // <cjk>
    0x7814, 0x8CA4, // <cjk>
    0x7815, 0x8DD3, // <cjk>
    0x7820, 0xE1E7, // <cjk>
    0x7825, 0x9375, // <cjk>
    0x7826, 0x8DD4, // <cjk>
    0x7827, 0x8B6D, // <cjk>
    0x7832, 0x9643, // <cjk>
    0x7834, 0x946A, // <cjk>
    0x783A, 0x9376, // <cjk>
    0x783F, 0x8D7B, // <cjk>
    0x7845, 0xE1E9, // <cjk>
    0x785D, 0x8FC9, // <cjk>
    0x786B, 0x97B0, // <cjk>
    0x786C, 0x8D64, // <cjk>
    0x786F, 0x8CA5, // <cjk>
    0x7872, 0x94A1, // <cjk>
    0x7874, 0xE1EB, // <cjk>
    0x787C, 0xE1ED, // <cjk>
    0x7881, 0x8CE9, // <cjk>
    0x7886, 0xE1EC, // <cjk>
    0x7887, 0x92F4, // <cjk>
    0x788C, 0xE1EF, // <cjk>
    0x788D, 0x8A56, // <cjk>
    0x788E, 0xE1EA, // <cjk>
    0x7891, 0x94E8, // <cjk>
    0x7893, 0x894F, // <cjk>
    0x7895, 0x8DEA, // <cjk>
    0x7897, 0x9871, // <cjk>
    0x789A, 0xE1EE, // <cjk>
    0x78A3, 0xE1F0, // <cjk>
    0x78A7, 0x95C9, // <cjk>
    0x78A9, 0x90D7, // <cjk>
    0x78AA, 0xE1F2, // <cjk>
    0x78AF, 0xE1F3, // <cjk>
    0x78B5, 0xE1F1, // <cjk>
    0x78BA, 0x8A6D, // <cjk>
    0x78BC, 0xE1F9, // <cjk>
    0x78BE, 0xE1F8, // <cjk>
    0x78C1, 0x8EA5, // <cjk>
    0x78C5, 0xE1FA, // <cjk>
    0x78C6, 0xE1F5, // <cjk>
    0x78CA, 0xE1FB, // <cjk>
    0x78CB, 0xE1F6, // <cjk>
    0x78D0, 0x94D6, // <cjk>
    0x78D1, 0xE1F4, // <cjk>
    0x78D4, 0xE1F7, // <cjk>
    0x78DA, 0xE241, // <cjk>
    0x78E7, 0xE240, // <cjk>
    0x78E8, 0x9681, // <cjk>
    0x78EC, 0xE1FC, // <cjk>
    0x78EF, 0x88E9, // <cjk>
    0x78F4, 0xE243, // <cjk>
    0x78FD, 0xE242, // <cjk>
    0x7901, 0x8FCA, // <cjk>
    0x7907, 0xE244, // <cjk>
    0x790E, 0x9162, // <cjk>
    0x7911, 0xE246, // <cjk>
    0x7912, 0xE245, // <cjk>
    0x7919, 0xE247, // <cjk>
    0x7926, 0xE1E6, // <cjk>
    0x792A, 0xE1E8, // <cjk>
    0x792B, 0xE249, // <cjk>
    0x792C, 0xE248, // <cjk>
    0x793A, 0x8EA6, // <cjk>
    0x793C, 0x97E7, // <cjk>
    0x793E, 0x8ED0, // <cjk>
    0x7940, 0xE24A, // <cjk>
    0x7941, 0x8C56, // <cjk>
    0x7947, 0x8B5F, // <cjk>
    0x7948, 0x8B46, // <cjk>
    0x7949, 0x8E83, // <cjk>
    0x7950, 0x9753, // <cjk>
    0x7953, 0xE250, // <cjk>
    0x7955, 0xE24F, // <cjk>
    0x7956, 0x9163, // <cjk>
    0x7957, 0xE24C, // <cjk>
    0x795A, 0xE24E, // <cjk>
    0x795D, 0x8F6A, // <cjk>
    0x795E, 0x905F, // <cjk>
    0x795F, 0xE24D, // <cjk>
    0x7960, 0xE24B, // <cjk>
    0x7962, 0x9449, // <cjk>
    0x7965, 0x8FCB, // <cjk>
    0x796D, 0x8DD5, // <cjk>
    0x7977, 0x9398, // <cjk>
    0x797A, 0xE251, // <cjk>
    0x797F, 0xE252, // <cjk>
    0x7980, 0xE268, // <cjk>
    0x7981, 0x8BD6, // <cjk>
    0x7984, 0x985C, // <cjk>
    0x7985, 0x9154, // <cjk>
    0x798A, 0xE253, // <cjk>
    0x798D, 0x89D0, // <cjk>
    0x798E, 0x92F5, // <cjk>
    0x798F, 0x959F, // <cjk>
    0x799D, 0xE254, // <cjk>
    0x79A6, 0x8B9A, // <cjk>
    0x79A7, 0xE255, // <cjk>
    0x79AA, 0xE257, // <cjk>
    0x79AE, 0xE258, // <cjk>
    0x79B0, 0x9448, // <cjk>
    0x79B3, 0xE259, // <cjk>
    0x79B9, 0xE25A, // <cjk>
    0x79BD, 0x8BD7, // <cjk>
    0x79BE, 0x89D1, // <cjk>
    0x79BF, 0x93C3, // <cjk>
    0x79C0, 0x8F47, // <cjk>
    0x79C1, 0x8E84, // <cjk>
    0x79C9, 0xE25C, // <cjk>
    0x79CB, 0x8F48, // <cjk>
    0x79D1, 0x89C8, // <cjk>
    0x79D2, 0x9562, // <cjk>
    0x79D5, 0xE25D, // <cjk>
    0x79D8, 0x94E9, // <cjk>
    0x79DF, 0x9164, // <cjk>
    0x79E1, 0xE260, // <cjk>
    0x79E3, 0xE261, // <cjk>
    0x79E4, 0x9489, // <cjk>
    0x79E6, 0x9060, // <cjk>
    0x79E7, 0xE25E, // <cjk>
    0x79E9, 0x9281, // <cjk>
    0x79EC, 0xE25F, // <cjk>
    0x79F0, 0x8FCC, // <cjk>
    0x79FB, 0x88DA, // <cjk>
    0x7A00, 0x8B48, // <cjk>
    0x7A08, 0xE262, // <cjk>
    0x7A0B, 0x92F6, // <cjk>
    0x7A0D, 0xE263, // <cjk>
    0x7A0E, 0x90C5, // <cjk>
    0x7A14, 0x96AB, // <cjk>
    0x7A17, 0x9542, // <cjk>
    0x7A18, 0xE264, // <cjk>
    0x7A19, 0xE265, // <cjk>
    0x7A1A, 0x9274, // <cjk>
    0x7A1C, 0x97C5, // <cjk>
    0x7A1F, 0xE267, // <cjk>
    0x7A20, 0xE266, // <cjk>
    0x7A2E, 0x8EED, // <cjk>
    0x7A31, 0xE269, // <cjk>
    0x7A32, 0x88EE, // <cjk>
    0x7A37, 0xE26C, // <cjk>
    0x7A3B, 0xE26A, // <cjk>
    0x7A3C, 0x89D2, // <cjk>
    0x7A3D, 0x8C6D, // <cjk>
    0x7A3E, 0xE26B, // <cjk>
    0x7A3F, 0x8D65, // <cjk>
    0x7A40, 0x8D92, // <cjk>
    0x7A42, 0x95E4, // <cjk>
    0x7A43, 0xE26D, // <cjk>
    0x7A46, 0x9673, // <cjk>
    0x7A49, 0xE26F, // <cjk>
    0x7A4D, 0x90CF, // <cjk>
    0x7A4E, 0x896E, // <cjk>
    0x7A4F, 0x89B8, // <cjk>
    0x7A50, 0x88AA, // <cjk>
    0x7A57, 0xE26E, // <cjk>
    0x7A61, 0xE270, // <cjk>
    0x7A62, 0xE271, // <cjk>
    0x7A63, 0x8FF5, // <cjk>
    0x7A69, 0xE272, // <cjk>
    0x7A6B, 0x8A6E, // <cjk>
    0x7A70, 0xE274, // <cjk>
    0x7A74, 0x8C8A, // <cjk>
    0x7A76, 0x8B86, // <cjk>
    0x7A79, 0xE275, // <cjk>
    0x7A7A, 0x8BF3, // <cjk>
    0x7A7D, 0xE276, // <cjk>
    0x7A7F, 0x90FA, // <cjk>
    0x7A81, 0x93CB, // <cjk>
    0x7A83, 0x90DE, // <cjk>
    0x7A84, 0x8DF3, // <cjk>
    0x7A88, 0xE277, // <cjk>
    0x7A92, 0x9282, // <cjk>
    0x7A93, 0x918B, // <cjk>
    0x7A95, 0xE279, // <cjk>
    0x7A96, 0xE27B, // <cjk>
    0x7A97, 0xE278, // <cjk>
    0x7A98, 0xE27A, // <cjk>
    0x7A9F, 0x8C41, // <cjk>
    0x7AA9, 0xE27C, // <cjk>
    0x7AAA, 0x8C45, // <cjk>
    0x7AAE, 0x8B87, // <cjk>
    0x7AAF, 0x9771, // <cjk>
    0x7AB0, 0xE27E, // <cjk>
    0x7AB6, 0xE280, // <cjk>
    0x7ABA, 0x894D, // <cjk>
    0x7ABF, 0xE283, // <cjk>
    0x7AC3, 0x8A96, // <cjk>
    0x7AC4, 0xE282, // <cjk>
    0x7AC5, 0xE281, // <cjk>
    0x7AC7, 0xE285, // <cjk>
    0x7AC8, 0xE27D, // <cjk>
    0x7ACA, 0xE286, // <cjk>
    0x7ACB, 0x97A7, // <cjk>
    0x7ACD, 0xE287, // <cjk>
    0x7ACF, 0xE288, // <cjk>
    0x7AD2, 0x9AF2, // <cjk>
    0x7AD3, 0xE28A, // <cjk>
    0x7AD5, 0xE289, // <cjk>
    0x7AD9, 0xE28B, // <cjk>
    0x7ADA, 0xE28C, // <cjk>
    0x7ADC, 0x97B3, // <cjk>
    0x7ADD, 0xE28D, // <cjk>
    0x7ADF, 0xE8ED, // <cjk>
    0x7AE0, 0x8FCD, // <cjk>
    0x7AE1, 0xE28E, // <cjk>
    0x7AE2, 0xE28F, // <cjk>
    0x7AE3, 0x8F76, // <cjk>
    0x7AE5, 0x93B6, // <cjk>
    0x7AE6, 0xE290, // <cjk>
    0x7AEA, 0x9247, // <cjk>
    0x7AED, 0xE291, // <cjk>
    0x7AF0, 0xE292, // <cjk>
    0x7AF6, 0x8BA3, // <cjk>
    0x7AF8, 0x995E, // <cjk>
    0x7AF9, 0x927C, // <cjk>
    0x7AFA, 0x8EB1, // <cjk>
    0x7AFF, 0x8AC6, // <cjk>
    0x7B02, 0xE293, // <cjk>
    0x7B04, 0xE2A0, // <cjk>
    0x7B06, 0xE296, // <cjk>
    0x7B08, 0x8B88, // <cjk>
    0x7B0A, 0xE295, // <cjk>
    0x7B0B, 0xE2A2, // <cjk>
    0x7B0F, 0xE294, // <cjk>
    0x7B11, 0x8FCE, // <cjk>
    0x7B18, 0xE298, // <cjk>
    0x7B19, 0xE299, // <cjk>
    0x7B1B, 0x934A, // <cjk>
    0x7B1E, 0xE29A, // <cjk>
    0x7B20, 0x8A7D, // <cjk>
    0x7B25, 0x9079, // <cjk>
    0x7B26, 0x9584, // <cjk>
    0x7B28, 0xE29C, // <cjk>
    0x7B2C, 0x91E6, // <cjk>
    0x7B33, 0xE297, // <cjk>
    0x7B35, 0xE29B, // <cjk>
    0x7B36, 0xE29D, // <cjk>
    0x7B39, 0x8DF9, // <cjk>
    0x7B45, 0xE2A4, // <cjk>
    0x7B46, 0x954D, // <cjk>
    0x7B48, 0x94A4, // <cjk>
    0x7B49, 0x9399, // <cjk>
    0x7B4B, 0x8BD8, // <cjk>
    0x7B4C, 0xE2A3, // <cjk>
    0x7B4D, 0xE2A1, // <cjk>
    0x7B4F, 0x94B3, // <cjk>
    0x7B50, 0xE29E, // <cjk>
    0x7B51, 0x927D, // <cjk>
    0x7B52, 0x939B, // <cjk>
    0x7B54, 0x939A, // <cjk>
    0x7B56, 0x8DF4, // <cjk>
    0x7B5D, 0xE2B6, // <cjk>
    0x7B65, 0xE2A6, // <cjk>
    0x7B67, 0xE2A8, // <cjk>
    0x7B6C, 0xE2AB, // <cjk>
    0x7B6E, 0xE2AC, // <cjk>
    0x7B70, 0xE2A9, // <cjk>
    0x7B71, 0xE2AA, // <cjk>
    0x7B74, 0xE2A7, // <cjk>
    0x7B75, 0xE2A5, // <cjk>
    0x7B7A, 0xE29F, // <cjk>
    0x7B86, 0x95CD, // <cjk>
    0x7B87, 0x89D3, // <cjk>
    0x7B8B, 0xE2B3, // <cjk>
    0x7B8D, 0xE2B0, // <cjk>
    0x7B8F, 0xE2B5, // <cjk>
    0x7B92, 0xE2B4, // <cjk>
    0x7B94, 0x9493, // <cjk>
    0x7B95, 0x96A5, // <cjk>
    0x7B97, 0x8E5A, // <cjk>
    0x7B98, 0xE2AE, // <cjk>
    0x7B99, 0xE2B7, // <cjk>
    0x7B9A, 0xE2B2, // <cjk>
    0x7B9C, 0xE2B1, // <cjk>
    0x7B9D, 0xE2AD, // <cjk>
    0x7B9F, 0xE2AF, // <cjk>
    0x7BA1, 0x8AC7, // <cjk>
    0x7BAA, 0x925C, // <cjk>
    0x7BAD, 0x90FB, // <cjk>
    0x7BB1, 0x94A0, // <cjk>
    0x7BB4, 0xE2BC, // <cjk>
    0x7BB8, 0x94A2, // <cjk>
    0x7BC0, 0x90DF, // <cjk>
    0x7BC1, 0xE2B9, // <cjk>
    0x7BC4, 0x94CD, // <cjk>
    0x7BC6, 0xE2BD, // <cjk>
    0x7BC7, 0x95D1, // <cjk>
    0x7BC9, 0x927A, // <cjk>
    0x7BCB, 0xE2B8, // <cjk>
    0x7BCC, 0xE2BA, // <cjk>
    0x7BCF, 0xE2BB, // <cjk>
    0x7BDD, 0xE2BE, // <cjk>
    0x7BE0, 0x8EC2, // <cjk>
    0x7BE4, 0x93C4, // <cjk>
    0x7BE5, 0xE2C3, // <cjk>
    0x7BE6, 0xE2C2, // <cjk>
    0x7BE9, 0xE2BF, // <cjk>
    0x7BED, 0x9855, // <cjk>
    0x7BF3, 0xE2C8, // <cjk>
    0x7BF6, 0xE2CC, // <cjk>
    0x7BF7, 0xE2C9, // <cjk>
    0x7C00, 0xE2C5, // <cjk>
    0x7C07, 0xE2C6, // <cjk>
    0x7C0D, 0xE2CB, // <cjk>
    0x7C11, 0xE2C0, // <cjk>
    0x7C12, 0x99D3, // <cjk>
    0x7C13, 0xE2C7, // <cjk>
    0x7C14, 0xE2C1, // <cjk>
    0x7C17, 0xE2CA, // <cjk>
    0x7C1F, 0xE2D0, // <cjk>
    0x7C21, 0x8AC8, // <cjk>
    0x7C23, 0xE2CD, // <cjk>
    0x7C27, 0xE2CE, // <cjk>
    0x7C2A, 0xE2CF, // <cjk>
    0x7C2B, 0xE2D2, // <cjk>
    0x7C37, 0xE2D1, // <cjk>
    0x7C38, 0x94F4, // <cjk>
    0x7C3D, 0xE2D3, // <cjk>
    0x7C3E, 0x97FA, // <cjk>
    0x7C3F, 0x95EB, // <cjk>
    0x7C40, 0xE2D8, // <cjk>
    0x7C43, 0xE2D5, // <cjk>
    0x7C4C, 0xE2D4, // <cjk>
    0x7C4D, 0x90D0, // <cjk>
    0x7C4F, 0xE2D7, // <cjk>
    0x7C50, 0xE2D9, // <cjk>
    0x7C54, 0xE2D6, // <cjk>
    0x7C56, 0xE2DD, // <cjk>
    0x7C58, 0xE2DA, // <cjk>
    0x7C5F, 0xE2DB, // <cjk>
    0x7C60, 0xE2C4, // <cjk>
    0x7C64, 0xE2DC, // <cjk>
    0x7C65, 0xE2DE, // <cjk>
    0x7C6C, 0xE2DF, // <cjk>
    0x7C73, 0x95C4, // <cjk>
    0x7C75, 0xE2E0, // <cjk>
    0x7C7E, 0x96E0, // <cjk>
    0x7C81, 0x8BCC, // <cjk>
    0x7C82, 0x8C48, // <cjk>
    0x7C83, 0xE2E1, // <cjk>
    0x7C89, 0x95B2, // <cjk>
    0x7C8B, 0x9088, // <cjk>
    0x7C8D, 0x96AE, // <cjk>
    0x7C90, 0xE2E2, // <cjk>
    0x7C92, 0x97B1, // <cjk>
    0x7C95, 0x9494, // <cjk>
    0x7C97, 0x9165, // <cjk>
    0x7C98, 0x9453, // <cjk>
    0x7C9B, 0x8F6C, // <cjk>
    0x7C9F, 0x88BE, // <cjk>
    0x7CA1, 0xE2E7, // <cjk>
    0x7CA2, 0xE2E5, // <cjk>
    0x7CA4, 0xE2E3, // <cjk>
    0x7CA5, 0x8A9F, // <cjk>
    0x7CA7, 0x8FCF, // <cjk>
    0x7CA8, 0xE2E8, // <cjk>
    0x7CAB, 0xE2E6, // <cjk>
    0x7CAD, 0xE2E4, // <cjk>
    0x7CAE, 0xE2EC, // <cjk>
    0x7CB1, 0xE2EB, // <cjk>
    0x7CB2, 0xE2EA, // <cjk>
    0x7CB3, 0xE2E9, // <cjk>
    0x7CB9, 0xE2ED, // <cjk>
    0x7CBD, 0xE2EE, // <cjk>
    0x7CBE, 0x90B8, // <cjk>
    0x7CC0, 0xE2EF, // <cjk>
    0x7CC2, 0xE2F1, // <cjk>
    0x7CC5, 0xE2F0, // <cjk>
    0x7CCA, 0x8CD0, // <cjk>
    0x7CCE, 0x9157, // <cjk>
    0x7CD2, 0xE2F3, // <cjk>
    0x7CD6, 0x939C, // <cjk>
    0x7CD8, 0xE2F2, // <cjk>
    0x7CDC, 0xE2F4, // <cjk>
    0x7CDE, 0x95B3, // <cjk>
    0x7CDF, 0x918C, // <cjk>
    0x7CE0, 0x8D66, // <cjk>
    0x7CE2, 0xE2F5, // <cjk>
    0x7CE7, 0x97C6, // <cjk>
    0x7CEF, 0xE2F7, // <cjk>
    0x7CF2, 0xE2F8, // <cjk>
    0x7CF4, 0xE2F9, // <cjk>
    0x7CF6, 0xE2FA, // <cjk>
    0x7CF8, 0x8E85, // <cjk>
    0x7CFA, 0xE2FB, // <cjk>
    0x7CFB, 0x8C6E, // <cjk>
    0x7CFE, 0x8B8A, // <cjk>
    0x7D00, 0x8B49, // <cjk>
    0x7D02, 0xE340, // <cjk>
    0x7D04, 0x96F1, // <cjk>
    0x7D05, 0x8D67, // <cjk>
    0x7D06, 0xE2FC, // <cjk>
    0x7D0A, 0xE343, // <cjk>
    0x7D0B, 0x96E4, // <cjk>
    0x7D10, 0x9552, // <cjk>
    0x7D14, 0x8F83, // <cjk>
    0x7D15, 0xE342, // <cjk>
    0x7D17, 0x8ED1, // <cjk>
    0x7D18, 0x8D68, // <cjk>
    0x7D19, 0x8E86, // <cjk>
    0x7D1A, 0x8B89, // <cjk>
    0x7D1B, 0x95B4, // <cjk>
    0x7D1C, 0xE341, // <cjk>
    0x7D20, 0x9166, // <cjk>
    0x7D21, 0x9661, // <cjk>
    0x7D22, 0x8DF5, // <cjk>
    0x7D2B, 0x8E87, // <cjk>
    0x7D2C, 0x92DB, // <cjk>
    0x7D2E, 0xE346, // <cjk>
    0x7D2F, 0x97DD, // <cjk>
    0x7D30, 0x8DD7, // <cjk>
    0x7D32, 0xE347, // <cjk>
    0x7D33, 0x9061, // <cjk>
    0x7D35, 0xE349, // <cjk>
    0x7D39, 0x8FD0, // <cjk>
    0x7D3A, 0x8DAE, // <cjk>
    0x7D3F, 0xE348, // <cjk>
    0x7D42, 0x8F49, // <cjk>
    0x7D43, 0x8CBC, // <cjk>
    0x7D44, 0x9167, // <cjk>
    0x7D45, 0xE344, // <cjk>
    0x7D46, 0xE34A, // <cjk>
    0x7D4B, 0xE345, // <cjk>
    0x7D4C, 0x8C6F, // <cjk>
    0x7D4E, 0xE34D, // <cjk>
    0x7D4F, 0xE351, // <cjk>
    0x7D50, 0x8C8B, // <cjk>
    0x7D56, 0xE34C, // <cjk>
    0x7D5B, 0xE355, // <cjk>
    0x7D5E, 0x8D69, // <cjk>
    0x7D61, 0x978D, // <cjk>
    0x7D62, 0x88BA, // <cjk>
    0x7D63, 0xE352, // <cjk>
    0x7D66, 0x8B8B, // <cjk>
    0x7D68, 0xE34F, // <cjk>
    0x7D6E, 0xE350, // <cjk>
    0x7D71, 0x939D, // <cjk>
    0x7D72, 0xE34E, // <cjk>
    0x7D73, 0xE34B, // <cjk>
    0x7D75, 0x8A47, // <cjk>
    0x7D76, 0x90E2, // <cjk>
    0x7D79, 0x8CA6, // <cjk>
    0x7D7D, 0xE357, // <cjk>
    0x7D89, 0xE354, // <cjk>
    0x7D8F, 0xE356, // <cjk>
    0x7D93, 0xE353, // <cjk>
    0x7D99, 0x8C70, // <cjk>
    0x7D9A, 0x91B1, // <cjk>
    0x7D9B, 0xE358, // <cjk>
    0x7D9C, 0x918E, // <cjk>
    0x7D9F, 0xE365, // <cjk>
    0x7DA2, 0xE361, // <cjk>
    0x7DAB, 0xE35F, // <cjk>
    0x7DAC, 0x8EF8, // <cjk>
    0x7DAD, 0x88DB, // <cjk>
    0x7DAE, 0xE35A, // <cjk>
    0x7DAF, 0xE362, // <cjk>
    0x7DB0, 0xE366, // <cjk>
    0x7DB1, 0x8D6A, // <cjk>
    0x7DB2, 0x96D4, // <cjk>
    0x7DB4, 0x92D4, // <cjk>
    0x7DB5, 0xE35C, // <cjk>
    0x7DB8, 0xE364, // <cjk>
    0x7DBA, 0xE359, // <cjk>
    0x7DBB, 0x925D, // <cjk>
    0x7DBD, 0xE35E, // <cjk>
    0x7DBE, 0x88BB, // <cjk>
    0x7DBF, 0x96C8, // <cjk>
    0x7DC7, 0xE35D, // <cjk>
    0x7DCA, 0x8BD9, // <cjk>
    0x7DCB, 0x94EA, // <cjk>
    0x7DCF, 0x918D, // <cjk>
    0x7DD1, 0x97CE, // <cjk>
    0x7DD2, 0x8F8F, // <cjk>
    0x7DD5, 0xE38E, // <cjk>
    0x7DD8, 0xE367, // <cjk>
    0x7DDA, 0x90FC, // <cjk>
    0x7DDC, 0xE363, // <cjk>
    0x7DDD, 0xE368, // <cjk>
    0x7DDE, 0xE36A, // <cjk>
    0x7DE0, 0x92F7, // <cjk>
    0x7DE1, 0xE36D, // <cjk>
    0x7DE4, 0xE369, // <cjk>
    0x7DE8, 0x95D2, // <cjk>
    0x7DE9, 0x8AC9, // <cjk>
    0x7DEC, 0x96C9, // <cjk>
    0x7DEF, 0x88DC, // <cjk>
    0x7DF2, 0xE36C, // <cjk>
    0x7DF4, 0x97FB, // <cjk>
    0x7DFB, 0xE36B, // <cjk>
    0x7E01, 0x898F, // <cjk>
    0x7E04, 0x93EA, // <cjk>
    0x7E05, 0xE36E, // <cjk>
    0x7E09, 0xE375, // <cjk>
    0x7E0A, 0xE36F, // <cjk>
    0x7E0B, 0xE376, // <cjk>
    0x7E12, 0xE372, // <cjk>
    0x7E1B, 0x949B, // <cjk>
    0x7E1E, 0x8EC8, // <cjk>
    0x7E1F, 0xE374, // <cjk>
    0x7E21, 0xE371, // <cjk>
    0x7E22, 0xE377, // <cjk>
    0x7E23, 0xE370, // <cjk>
    0x7E26, 0x8F63, // <cjk>
    0x7E2B, 0x9644, // <cjk>
    0x7E2E, 0x8F6B, // <cjk>
    0x7E31, 0xE373, // <cjk>
    0x7E32, 0xE380, // <cjk>
    0x7E35, 0xE37B, // <cjk>
    0x7E37, 0xE37E, // <cjk>
    0x7E39, 0xE37C, // <cjk>
    0x7E3A, 0xE381, // <cjk>
    0x7E3B, 0xE37A, // <cjk>
    0x7E3D, 0xE360, // <cjk>
    0x7E3E, 0x90D1, // <cjk>
    0x7E41, 0x94C9, // <cjk>
    0x7E43, 0xE37D, // <cjk>
    0x7E46, 0xE378, // <cjk>
    0x7E4A, 0x9140, // <cjk>
    0x7E4B, 0x8C71, // <cjk>
    0x7E4D, 0x8F4A, // <cjk>
    0x7E54, 0x9044, // <cjk>
    0x7E55, 0x9155, // <cjk>
    0x7E56, 0xE384, // <cjk>
    0x7E59, 0xE386, // <cjk>
    0x7E5A, 0xE387, // <cjk>
    0x7E5D, 0xE383, // <cjk>
    0x7E5E, 0xE385, // <cjk>
    0x7E66, 0xE379, // <cjk>
    0x7E67, 0xE382, // <cjk>
    0x7E69, 0xE38A, // <cjk>
    0x7E6A, 0xE389, // <cjk>
    0x7E6D, 0x969A, // <cjk>
    0x7E70, 0x8C4A, // <cjk>
    0x7E79, 0xE388, // <cjk>
    0x7E7B, 0xE38C, // <cjk>
    0x7E7C, 0xE38B, // <cjk>
    0x7E7D, 0xE38F, // <cjk>
    0x7E7F, 0xE391, // <cjk>
    0x7E83, 0xE38D, // <cjk>
    0x7E88, 0xE392, // <cjk>
    0x7E89, 0xE393, // <cjk>
    0x7E8C, 0xE394, // <cjk>
    0x7E8E, 0xE39A, // <cjk>
    0x7E8F, 0x935A, // <cjk>
    0x7E90, 0xE396, // <cjk>
    0x7E92, 0xE395, // <cjk>
    0x7E93, 0xE397, // <cjk>
    0x7E94, 0xE398, // <cjk>
    0x7E96, 0xE399, // <cjk>
    0x7E9B, 0xE39B, // <cjk>
    0x7E9C, 0xE39C, // <cjk>
    0x7F36, 0x8ACA, // <cjk>
    0x7F38, 0xE39D, // <cjk>
    0x7F3A, 0xE39E, // <cjk>
    0x7F45, 0xE39F, // <cjk>
    0x7F4C, 0xE3A0, // <cjk>
    0x7F4D, 0xE3A1, // <cjk>
    0x7F4E, 0xE3A2, // <cjk>
    0x7F50, 0xE3A3, // <cjk>
    0x7F51, 0xE3A4, // <cjk>
    0x7F54, 0xE3A6, // <cjk>
    0x7F55, 0xE3A5, // <cjk>
    0x7F58, 0xE3A7, // <cjk>
    0x7F5F, 0xE3A8, // <cjk>
    0x7F60, 0xE3A9, // <cjk>
    0x7F67, 0xE3AC, // <cjk>
    0x7F68, 0xE3AA, // <cjk>
    0x7F69, 0xE3AB, // <cjk>
    0x7F6A, 0x8DDF, // <cjk>
    0x7F6B, 0x8C72, // <cjk>
    0x7F6E, 0x9275, // <cjk>
    0x7F70, 0x94B1, // <cjk>
    0x7F72, 0x8F90, // <cjk>
    0x7F75, 0x946C, // <cjk>
    0x7F77, 0x94EB, // <cjk>
    0x7F78, 0xE3AD, // <cjk>
    0x7F79, 0x9CEB, // <cjk>
    0x7F82, 0xE3AE, // <cjk>
    0x7F83, 0xE3B0, // <cjk>
    0x7F85, 0x9785, // <cjk>
    0x7F86, 0xE3AF, // <cjk>
    0x7F87, 0xE3B2, // <cjk>
    0x7F88, 0xE3B1, // <cjk>
    0x7F8A, 0x9772, // <cjk>
    0x7F8C, 0xE3B3, // <cjk>
    0x7F8E, 0x94FC, // <cjk>
    0x7F94, 0xE3B4, // <cjk>
    0x7F9A, 0xE3B7, // <cjk>
    0x7F9D, 0xE3B6, // <cjk>
    0x7F9E, 0xE3B5, // <cjk>
    0x7FA3, 0xE3B8, // <cjk>
    0x7FA4, 0x8C51, // <cjk>
    0x7FA8, 0x9141, // <cjk>
    0x7FA9, 0x8B60, // <cjk>
    0x7FAE, 0xE3BC, // <cjk>
    0x7FAF, 0xE3B9, // <cjk>
    0x7FB2, 0xE3BA, // <cjk>
    0x7FB6, 0xE3BD, // <cjk>
    0x7FB8, 0xE3BE, // <cjk>
    0x7FB9, 0xE3BB, // <cjk>
    0x7FBD, 0x8948, // <cjk>
    0x7FC1, 0x89A5, // <cjk>
    0x7FC5, 0xE3C0, // <cjk>
    0x7FC6, 0xE3C1, // <cjk>
    0x7FCA, 0xE3C2, // <cjk>
    0x7FCC, 0x9782, // <cjk>
    0x7FD2, 0x8F4B, // <cjk>
    0x7FD4, 0xE3C4, // <cjk>
    0x7FD5, 0xE3C3, // <cjk>
    0x7FE0, 0x9089, // <cjk>
    0x7FE1, 0xE3C5, // <cjk>
    0x7FE6, 0xE3C6, // <cjk>
    0x7FE9, 0xE3C7, // <cjk>
    0x7FEB, 0x8AE3, // <cjk>
    0x7FF0, 0x8ACB, // <cjk>
    0x7FF3, 0xE3C8, // <cjk>
    0x7FF9, 0xE3C9, // <cjk>
    0x7FFB, 0x967C, // <cjk>
    0x7FFC, 0x9783, // <cjk>
    0x8000, 0x9773, // <cjk>
    0x8001, 0x9856, // <cjk>
    0x8003, 0x8D6C, // <cjk>
    0x8004, 0xE3CC, // <cjk>
    0x8005, 0x8ED2, // <cjk>
    0x8006, 0xE3CB, // <cjk>
    0x800B, 0xE3CD, // <cjk>
    0x800C, 0x8EA7, // <cjk>
    0x8010, 0x91CF, // <cjk>
    0x8012, 0xE3CE, // <cjk>
    0x8015, 0x8D6B, // <cjk>
    0x8017, 0x96D5, // <cjk>
    0x8018, 0xE3CF, // <cjk>
    0x8019, 0xE3D0, // <cjk>
    0x801C, 0xE3D1, // <cjk>
    0x8021, 0xE3D2, // <cjk>
    0x8028, 0xE3D3, // <cjk>
    0x8033, 0x8EA8, // <cjk>
    0x8036, 0x96EB, // <cjk>
    0x803B, 0xE3D5, // <cjk>
    0x803D, 0x925E, // <cjk>
    0x803F, 0xE3D4, // <cjk>
    0x8046, 0xE3D7, // <cjk>
    0x804A, 0xE3D6, // <cjk>
    0x8052, 0xE3D8, // <cjk>
    0x8056, 0x90B9, // <cjk>
    0x8058, 0xE3D9, // <cjk>
    0x805A, 0xE3DA, // <cjk>
    0x805E, 0x95B7, // <cjk>
    0x805F, 0xE3DB, // <cjk>
    0x8061, 0x918F, // <cjk>
    0x8062, 0xE3DC, // <cjk>
    0x8068, 0xE3DD, // <cjk>
    0x806F, 0x97FC, // <cjk>
    0x8070, 0xE3E0, // <cjk>
    0x8072, 0xE3DF, // <cjk>
    0x8073, 0xE3DE, // <cjk>
    0x8074, 0x92AE, // <cjk>
    0x8076, 0xE3E1, // <cjk>
    0x8077, 0x9045, // <cjk>
    0x8079, 0xE3E2, // <cjk>
    0x807D, 0xE3E3, // <cjk>
    0x807E, 0x9857, // <cjk>
    0x807F, 0xE3E4, // <cjk>
    0x8084, 0xE3E5, // <cjk>
    0x8085, 0xE3E7, // <cjk>
    0x8086, 0xE3E6, // <cjk>
    0x8087, 0x94A3, // <cjk>
    0x8089, 0x93F7, // <cjk>
    0x808B, 0x985D, // <cjk>
    0x808C, 0x94A7, // <cjk>
    0x8093, 0xE3E9, // <cjk>
    0x8096, 0x8FD1, // <cjk>
    0x8098, 0x9549, // <cjk>
    0x809A, 0xE3EA, // <cjk>
    0x809B, 0xE3E8, // <cjk>
    0x809D, 0x8ACC, // <cjk>
    0x80A1, 0x8CD2, // <cjk>
    0x80A2, 0x8E88, // <cjk>
    0x80A5, 0x94EC, // <cjk>
    0x80A9, 0x8CA8, // <cjk>
    0x80AA, 0x9662, // <cjk>
    0x80AC, 0xE3ED, // <cjk>
    0x80AD, 0xE3EB, // <cjk>
    0x80AF, 0x8D6D, // <cjk>
    0x80B1, 0x8D6E, // <cjk>
    0x80B2, 0x88E7, // <cjk>
    0x80B4, 0x8DE6, // <cjk>
    0x80BA, 0x9478, // <cjk>
    0x80C3, 0x88DD, // <cjk>
    0x80C4, 0xE3F2, // <cjk>
    0x80C6, 0x925F, // <cjk>
    0x80CC, 0x9477, // <cjk>
    0x80CE, 0x91D9, // <cjk>
    0x80D6, 0xE3F4, // <cjk>
    0x80D9, 0xE3F0, // <cjk>
    0x80DA, 0xE3F3, // <cjk>
    0x80DB, 0xE3EE, // <cjk>
    0x80DD, 0xE3F1, // <cjk>
    0x80DE, 0x9645, // <cjk>
    0x80E1, 0x8CD3, // <cjk>
    0x80E4, 0x88FB, // <cjk>
    0x80E5, 0xE3EF, // <cjk>
    0x80EF, 0xE3F6, // <cjk>
    0x80F1, 0xE3F7, // <cjk>
    0x80F4, 0x93B7, // <cjk>
    0x80F8, 0x8BB9, // <cjk>
    0x80FC, 0xE445, // <cjk>
    0x80FD, 0x945C, // <cjk>
    0x8102, 0x8E89, // <cjk>
    0x8105, 0x8BBA, // <cjk>
    0x8106, 0x90C6, // <cjk>
    0x8107, 0x9865, // <cjk>
    0x8108, 0x96AC, // <cjk>
    0x8109, 0xE3F5, // <cjk>
    0x810A, 0x90D2, // <cjk>
    0x811A, 0x8B72, // <cjk>
    0x811B, 0xE3F8, // <cjk>
    0x8123, 0xE3FA, // <cjk>
    0x8129, 0xE3F9, // <cjk>
    0x812F, 0xE3FB, // <cjk>
    0x8131, 0x9245, // <cjk>
    0x8133, 0x945D, // <cjk>
    0x8139, 0x92AF, // <cjk>
    0x813E, 0xE442, // <cjk>
    0x8146, 0xE441, // <cjk>
    0x814B, 0xE3FC, // <cjk>
    0x814E, 0x9074, // <cjk>
    0x8150, 0x9585, // <cjk>
    0x8151, 0xE444, // <cjk>
    0x8153, 0xE443, // <cjk>
    0x8154, 0x8D6F, // <cjk>
    0x8155, 0x9872, // <cjk>
    0x815F, 0xE454, // <cjk>
    0x8165, 0xE448, // <cjk>
    0x8166, 0xE449, // <cjk>
    0x816B, 0x8EEE, // <cjk>
    0x816E, 0xE447, // <cjk>
    0x8170, 0x8D98, // <cjk>
    0x8171, 0xE446, // <cjk>
    0x8174, 0xE44A, // <cjk>
    0x8178, 0x92B0, // <cjk>
    0x8179, 0x95A0, // <cjk>
    0x817A, 0x9142, // <cjk>
    0x817F, 0x91DA, // <cjk>
    0x8180, 0xE44E, // <cjk>
    0x8182, 0xE44F, // <cjk>
    0x8183, 0xE44B, // <cjk>
    0x8188, 0xE44C, // <cjk>
    0x818A, 0xE44D, // <cjk>
    0x818F, 0x8D70, // <cjk>
    0x8193, 0xE455, // <cjk>
    0x8195, 0xE451, // <cjk>
    0x819A, 0x9586, // <cjk>
    0x819C, 0x968C, // <cjk>
    0x819D, 0x9547, // <cjk>
    0x81A0, 0xE450, // <cjk>
    0x81A3, 0xE453, // <cjk>
    0x81A4, 0xE452, // <cjk>
    0x81A8, 0x9663, // <cjk>
    0x81A9, 0xE456, // <cjk>
    0x81B0, 0xE457, // <cjk>
    0x81B3, 0x9156, // <cjk>
    0x81B5, 0xE458, // <cjk>
    0x81B8, 0xE45A, // <cjk>
    0x81BA, 0xE45E, // <cjk>
    0x81BE, 0xE459, // <cjk>
    0x81BF, 0x945E, // <cjk>
    0x81C0, 0xE45C, // <cjk>
    0x81C2, 0xE45D, // <cjk>
    0x81C6, 0x89B0, // <cjk>
    0x81C8, 0xE464, // <cjk>
    0x81C9, 0xE45F, // <cjk>
    0x81CD, 0xE460, // <cjk>
    0x81D1, 0xE461, // <cjk>
    0x81D3, 0x919F, // <cjk>
    0x81D8, 0xE463, // <cjk>
    0x81D9, 0xE462, // <cjk>
    0x81DA, 0xE465, // <cjk>
    0x81DF, 0xE466, // <cjk>
    0x81E0, 0xE467, // <cjk>
    0x81E3, 0x9062, // <cjk>
    0x81E5, 0x89E7, // <cjk>
    0x81E7, 0xE468, // <cjk>
    0x81E8, 0x97D5, // <cjk>
    0x81EA, 0x8EA9, // <cjk>
    0x81ED, 0x8F4C, // <cjk>
    0x81F3, 0x8E8A, // <cjk>
    0x81F4, 0x9276, // <cjk>
    0x81FA, 0xE469, // <cjk>
    0x81FB, 0xE46A, // <cjk>
    0x81FC, 0x8950, // <cjk>
    0x81FE, 0xE46B, // <cjk>
    0x8201, 0xE46C, // <cjk>
    0x8202, 0xE46D, // <cjk>
    0x8205, 0xE46E, // <cjk>
    0x8207, 0xE46F, // <cjk>
    0x8208, 0x8BBB, // <cjk>
    0x8209, 0x9DA8, // <cjk>
    0x820A, 0xE470, // <cjk>
    0x820C, 0x90E3, // <cjk>
    0x820D, 0xE471, // <cjk>
    0x820E, 0x8EC9, // <cjk>
    0x8210, 0xE472, // <cjk>
    0x8212, 0x98AE, // <cjk>
    0x8216, 0xE473, // <cjk>
    0x8217, 0x95DC, // <cjk>
    0x8218, 0x8ADA, // <cjk>
    0x821B, 0x9143, // <cjk>
    0x821C, 0x8F77, // <cjk>
    0x821E, 0x9591, // <cjk>
    0x821F, 0x8F4D, // <cjk>
    0x8229, 0xE474, // <cjk>
    0x822A, 0x8D71, // <cjk>
    0x822B, 0xE475, // <cjk>
    0x822C, 0x94CA, // <cjk>
    0x822E, 0xE484, // <cjk>
    0x8233, 0xE477, // <cjk>
    0x8235, 0x91C7, // <cjk>
    0x8236, 0x9495, // <cjk>
    0x8237, 0x8CBD, // <cjk>
    0x8238, 0xE476, // <cjk>
    0x8239, 0x9144, // <cjk>
    0x8240, 0xE478, // <cjk>
    0x8247, 0x92F8, // <cjk>
    0x8258, 0xE47A, // <cjk>
    0x8259, 0xE479, // <cjk>
    0x825A, 0xE47C, // <cjk>
    0x825D, 0xE47B, // <cjk>
    0x825F, 0xE47D, // <cjk>
    0x8262, 0xE480, // <cjk>
    0x8264, 0xE47E, // <cjk>
    0x8266, 0x8ACD, // <cjk>
    0x8268, 0xE481, // <cjk>
    0x826A, 0xE482, // <cjk>
    0x826B, 0xE483, // <cjk>
    0x826E, 0x8DAF, // <cjk>
    0x826F, 0x97C7, // <cjk>
    0x8271, 0xE485, // <cjk>
    0x8272, 0x9046, // <cjk>
    0x8276, 0x8990, // <cjk>
    0x8277, 0xE486, // <cjk>
    0x8278, 0xE487, // <cjk>
    0x827E, 0xE488, // <cjk>
    0x828B, 0x88F0, // <cjk>
    0x828D, 0xE489, // <cjk>
    0x8292, 0xE48A, // <cjk>
    0x8299, 0x9587, // <cjk>
    0x829D, 0x8EC5, // <cjk>
    0x829F, 0xE48C, // <cjk>
    0x82A5, 0x8A48, // <cjk>
    0x82A6, 0x88B0, // <cjk>
    0x82AB, 0xE48B, // <cjk>
    0x82AC, 0xE48E, // <cjk>
    0x82AD, 0x946D, // <cjk>
    0x82AF, 0x9063, // <cjk>
    0x82B1, 0x89D4, // <cjk>
    0x82B3, 0x9646, // <cjk>
    0x82B8, 0x8C7C, // <cjk>
    0x82B9, 0x8BDA, // <cjk>
    0x82BB, 0xE48D, // <cjk>
    0x82BD, 0x89E8, // <cjk>
    0x82C5, 0x8AA1, // <cjk>
    0x82D1, 0x8991, // <cjk>
    0x82D2, 0xE492, // <cjk>
    0x82D3, 0x97E8, // <cjk>
    0x82D4, 0x91DB, // <cjk>
    0x82D7, 0x9563, // <cjk>
    0x82D9, 0xE49E, // <cjk>
    0x82DB, 0x89D5, // <cjk>
    0x82DC, 0xE49C, // <cjk>
    0x82DE, 0xE49A, // <cjk>
    0x82DF, 0xE491, // <cjk>
    0x82E1, 0xE48F, // <cjk>
    0x82E3, 0xE490, // <cjk>
    0x82E5, 0x8EE1, // <cjk>
    0x82E6, 0x8BEA, // <cjk>
    0x82E7, 0x9297, // <cjk>
    0x82EB, 0x93CF, // <cjk>
    0x82F1, 0x8970, // <cjk>
    0x82F3, 0xE494, // <cjk>
    0x82F4, 0xE493, // <cjk>
    0x82F9, 0xE499, // <cjk>
    0x82FA, 0xE495, // <cjk>
    0x82FB, 0xE498, // <cjk>
    0x8302, 0x96CE, // <cjk>
    0x8303, 0xE497, // <cjk>
    0x8304, 0x89D6, // <cjk>
    0x8305, 0x8A9D, // <cjk>
    0x8306, 0xE49B, // <cjk>
    0x8309, 0xE49D, // <cjk>
    0x830E, 0x8C73, // <cjk>
    0x8316, 0xE4A1, // <cjk>
    0x8317, 0xE4AA, // <cjk>
    0x8318, 0xE4AB, // <cjk>
    0x831C, 0x88A9, // <cjk>
    0x8323, 0xE4B2, // <cjk>
    0x8328, 0x88EF, // <cjk>
    0x832B, 0xE4A9, // <cjk>
    0x832F, 0xE4A8, // <cjk>
    0x8331, 0xE4A3, // <cjk>
    0x8332, 0xE4A2, // <cjk>
    0x8334, 0xE4A0, // <cjk>
    0x8335, 0xE49F, // <cjk>
    0x8336, 0x9283, // <cjk>
    0x8338, 0x91F9, // <cjk>
    0x8339, 0xE4A5, // <cjk>
    0x8340, 0xE4A4, // <cjk>
    0x8345, 0xE4A7, // <cjk>
    0x8349, 0x9190, // <cjk>
    0x834A, 0x8C74, // <cjk>
    0x834F, 0x8960, // <cjk>
    0x8350, 0xE4A6, // <cjk>
    0x8352, 0x8D72, // <cjk>
    0x8358, 0x9191, // <cjk>
    0x8373, 0xE4B8, // <cjk>
    0x8375, 0xE4B9, // <cjk>
    0x8377, 0x89D7, // <cjk>
    0x837B, 0x89AC, // <cjk>
    0x837C, 0xE4B6, // <cjk>
    0x8385, 0xE4AC, // <cjk>
    0x8387, 0xE4B4, // <cjk>
    0x8389, 0xE4BB, // <cjk>
    0x838A, 0xE4B5, // <cjk>
    0x838E, 0xE4B3, // <cjk>
    0x8393, 0xE496, // <cjk>
    0x8396, 0xE4B1, // <cjk>
    0x839A, 0xE4AD, // <cjk>
    0x839E, 0x8ACE, // <cjk>
    0x839F, 0xE4AF, // <cjk>
    0x83A0, 0xE4BA, // <cjk>
    0x83A2, 0xE4B0, // <cjk>
    0x83A8, 0xE4BC, // <cjk>
    0x83AA, 0xE4AE, // <cjk>
    0x83AB, 0x949C, // <cjk>
    0x83B1, 0x9789, // <cjk>
    0x83B5, 0xE4B7, // <cjk>
    0x83BD, 0xE4CD, // <cjk>
    0x83C1, 0xE4C5, // <cjk>
    0x83C5, 0x909B, // <cjk>
    0x83CA, 0x8B65, // <cjk>
    0x83CC, 0x8BDB, // <cjk>
    0x83CE, 0xE4C0, // <cjk>
    0x83D3, 0x89D9, // <cjk>
    0x83D6, 0x8FD2, // <cjk>
    0x83D8, 0xE4C3, // <cjk>
    0x83DC, 0x8DD8, // <cjk>
    0x83DF, 0x9370, // <cjk>
    0x83E0, 0xE4C8, // <cjk>
    0x83E9, 0x95EC, // <cjk>
    0x83EB, 0xE4BF, // <cjk>
    0x83EF, 0x89D8, // <cjk>
    0x83F0, 0x8CD4, // <cjk>
    0x83F1, 0x9548, // <cjk>
    0x83F2, 0xE4C9, // <cjk>
    0x83F4, 0xE4BD, // <cjk>
    0x83F7, 0xE4C6, // <cjk>
    0x83FB, 0xE4D0, // <cjk>
    0x83FD, 0xE4C1, // <cjk>
    0x8403, 0xE4C2, // <cjk>
    0x8404, 0x93B8, // <cjk>
    0x8407, 0xE4C7, // <cjk>
    0x840B, 0xE4C4, // <cjk>
    0x840C, 0x9647, // <cjk>
    0x840D, 0xE4CA, // <cjk>
    0x840E, 0x88DE, // <cjk>
    0x8413, 0xE4BE, // <cjk>
    0x8420, 0xE4CC, // <cjk>
    0x8422, 0xE4CB, // <cjk>
    0x8429, 0x948B, // <cjk>
    0x842A, 0xE4D2, // <cjk>
    0x842C, 0xE4DD, // <cjk>
    0x8431, 0x8A9E, // <cjk>
    0x8435, 0xE4E0, // <cjk>
    0x8438, 0xE4CE, // <cjk>
    0x843C, 0xE4D3, // <cjk>
    0x843D, 0x978E, // <cjk>
    0x8446, 0xE4DC, // <cjk>
    0x8449, 0x9774, // <cjk>
    0x844E, 0x97A8, // <cjk>
    0x8457, 0x9298, // <cjk>
    0x845B, 0x8A8B, // <cjk>
    0x8461, 0x9592, // <cjk>
    0x8462, 0xE4E2, // <cjk>
    0x8463, 0x939F, // <cjk>
    0x8466, 0x88AF, // <cjk>
    0x8469, 0xE4DB, // <cjk>
    0x846B, 0xE4D7, // <cjk>
    0x846C, 0x9192, // <cjk>
    0x846D, 0xE4D1, // <cjk>
    0x846E, 0xE4D9, // <cjk>
    0x846F, 0xE4DE, // <cjk>
    0x8471, 0x944B, // <cjk>
    0x8475, 0x88A8, // <cjk>
    0x8477, 0xE4D6, // <cjk>
    0x8479, 0xE4DF, // <cjk>
    0x847A, 0x9598, // <cjk>
    0x8482, 0xE4DA, // <cjk>
    0x8484, 0xE4D5, // <cjk>
    0x848B, 0x8FD3, // <cjk>
    0x8490, 0x8F4E, // <cjk>
    0x8494, 0x8EAA, // <cjk>
    0x8499, 0x96D6, // <cjk>
    0x849C, 0x9566, // <cjk>
    0x849F, 0xE4E5, // <cjk>
    0x84A1, 0xE4EE, // <cjk>
    0x84AD, 0xE4D8, // <cjk>
    0x84B2, 0x8A97, // <cjk>
    0x84B8, 0x8FF6, // <cjk>
    0x84B9, 0xE4E3, // <cjk>
    0x84BB, 0xE4E8, // <cjk>
    0x84BC, 0x9193, // <cjk>
    0x84BF, 0xE4E4, // <cjk>
    0x84C1, 0xE4EB, // <cjk>
    0x84C4, 0x927E, // <cjk>
    0x84C6, 0xE4EC, // <cjk>
    0x84C9, 0x9775, // <cjk>
    0x84CA, 0xE4E1, // <cjk>
    0x84CB, 0x8A57, // <cjk>
    0x84CD, 0xE4E7, // <cjk>
    0x84D0, 0xE4EA, // <cjk>
    0x84D1, 0x96AA, // <cjk>
    0x84D6, 0xE4ED, // <cjk>
    0x84D9, 0xE4E6, // <cjk>
    0x84DA, 0xE4E9, // <cjk>
    0x84EC, 0x9648, // <cjk>
    0x84EE, 0x9840, // <cjk>
    0x84F4, 0xE4F1, // <cjk>
    0x84FC, 0xE4F8, // <cjk>
    0x84FF, 0xE4F0, // <cjk>
    0x8500, 0x8EC1, // <cjk>
    0x8506, 0xE4CF, // <cjk>
    0x8511, 0x95CC, // <cjk>
    0x8513, 0x96A0, // <cjk>
    0x8514, 0xE4F7, // <cjk>
    0x8515, 0xE4F6, // <cjk>
    0x8517, 0xE4F2, // <cjk>
    0x8518, 0xE4F3, // <cjk>
    0x851A, 0x8955, // <cjk>
    0x851F, 0xE4F5, // <cjk>
    0x8521, 0xE4EF, // <cjk>
    0x8526, 0x92D3, // <cjk>
    0x852C, 0xE4F4, // <cjk>
    0x852D, 0x88FC, // <cjk>
    0x8535, 0x91A0, // <cjk>
    0x853D, 0x95C1, // <cjk>
    0x8540, 0xE4F9, // <cjk>
    0x8541, 0xE540, // <cjk>
    0x8543, 0x94D7, // <cjk>
    0x8548, 0xE4FC, // <cjk>
    0x8549, 0x8FD4, // <cjk>
    0x854A, 0x8EC7, // <cjk>
    0x854B, 0xE542, // <cjk>
    0x854E, 0x8BBC, // <cjk>
    0x8555, 0xE543, // <cjk>
    0x8557, 0x9599, // <cjk>
    0x8558, 0xE4FB, // <cjk>
    0x855A, 0xE4D4, // <cjk>
    0x8563, 0xE4FA, // <cjk>
    0x8568, 0x986E, // <cjk>
    0x8569, 0x93A0, // <cjk>
    0x856A, 0x9593, // <cjk>
    0x856D, 0xE54A, // <cjk>
    0x8577, 0xE550, // <cjk>
    0x857E, 0xE551, // <cjk>
    0x8580, 0xE544, // <cjk>
    0x8584, 0x9496, // <cjk>
    0x8587, 0xE54E, // <cjk>
    0x8588, 0xE546, // <cjk>
    0x858A, 0xE548, // <cjk>
    0x8590, 0xE552, // <cjk>
    0x8591, 0xE547, // <cjk>
    0x8594, 0xE54B, // <cjk>
    0x8597, 0x8992, // <cjk>
    0x8599, 0x93E3, // <cjk>
    0x859B, 0xE54C, // <cjk>
    0x859C, 0xE54F, // <cjk>
    0x85A4, 0xE545, // <cjk>
    0x85A6, 0x9145, // <cjk>
    0x85A8, 0xE549, // <cjk>
    0x85A9, 0x8E46, // <cjk>
    0x85AA, 0x9064, // <cjk>
    0x85AB, 0x8C4F, // <cjk>
    0x85AC, 0x96F2, // <cjk>
    0x85AE, 0x96F7, // <cjk>
    0x85AF, 0x8F92, // <cjk>
    0x85B9, 0xE556, // <cjk>
    0x85BA, 0xE554, // <cjk>
    0x85C1, 0x986D, // <cjk>
    0x85C9, 0xE553, // <cjk>
    0x85CD, 0x9795, // <cjk>
    0x85CF, 0xE555, // <cjk>
    0x85D0, 0xE557, // <cjk>
    0x85D5, 0xE558, // <cjk>
    0x85DD, 0xE559, // <cjk>
    0x85E4, 0x93A1, // <cjk>
    0x85E5, 0xE55A, // <cjk>
    0x85E9, 0x94CB, // <cjk>
    0x85EA, 0xE54D, // <cjk>
    0x85F7, 0x8F93, // <cjk>
    0x85F9, 0xE55C, // <cjk>
    0x85FA, 0xE561, // <cjk>
    0x85FB, 0x9194, // <cjk>
    0x85FE, 0xE560, // <cjk>
    0x8602, 0xE541, // <cjk>
    0x8606, 0xE562, // <cjk>
    0x8607, 0x9168, // <cjk>
    0x860A, 0xE55D, // <cjk>
    0x860B, 0xE55F, // <cjk>
    0x8613, 0xE55E, // <cjk>
    0x8616, 0x9F50, // <cjk>
    0x8617, 0x9F41, // <cjk>
    0x861A, 0xE564, // <cjk>
    0x8622, 0xE563, // <cjk>
    0x862D, 0x9796, // <cjk>
    0x862F, 0xE1BA, // <cjk>
    0x8630, 0xE565, // <cjk>
    0x863F, 0xE566, // <cjk>
    0x864D, 0xE567, // <cjk>
    0x864E, 0x8CD5, // <cjk>
    0x8650, 0x8B73, // <cjk>
    0x8654, 0xE569, // <cjk>
    0x8655, 0x997C, // <cjk>
    0x865A, 0x8B95, // <cjk>
    0x865C, 0x97B8, // <cjk>
    0x865E, 0x8BF1, // <cjk>
    0x865F, 0xE56A, // <cjk>
    0x8667, 0xE56B, // <cjk>
    0x866B, 0x928E, // <cjk>
    0x8671, 0xE56C, // <cjk>
    0x8679, 0x93F8, // <cjk>
    0x867B, 0x88B8, // <cjk>
    0x868A, 0x89E1, // <cjk>
    0x868B, 0xE571, // <cjk>
    0x868C, 0xE572, // <cjk>
    0x8693, 0xE56D, // <cjk>
    0x8695, 0x8E5C, // <cjk>
    0x86A3, 0xE56E, // <cjk>
    0x86A4, 0x9461, // <cjk>
    0x86A9, 0xE56F, // <cjk>
    0x86AA, 0xE570, // <cjk>
    0x86AB, 0xE57A, // <cjk>
    0x86AF, 0xE574, // <cjk>
    0x86B0, 0xE577, // <cjk>
    0x86B6, 0xE573, // <cjk>
    0x86C4, 0xE575, // <cjk>
    0x86C6, 0xE576, // <cjk>
    0x86C7, 0x8ED6, // <cjk>
    0x86C9, 0xE578, // <cjk>
    0x86CB, 0x9260, // <cjk>
    0x86CD, 0x8C75, // <cjk>
    0x86CE, 0x8A61, // <cjk>
    0x86D4, 0xE57B, // <cjk>
    0x86D9, 0x8A5E, // <cjk>
    0x86DB, 0xE581, // <cjk>
    0x86DE, 0xE57C, // <cjk>
    0x86DF, 0xE580, // <cjk>
    0x86E4, 0x94B8, // <cjk>
    0x86E9, 0xE57D, // <cjk>
    0x86EC, 0xE57E, // <cjk>
    0x86ED, 0x9567, // <cjk>
    0x86EE, 0x94D8, // <cjk>
    0x86EF, 0xE582, // <cjk>
    0x86F8, 0x91FB, // <cjk>
    0x86F9, 0xE58C, // <cjk>
    0x86FB, 0xE588, // <cjk>
    0x86FE, 0x89E9, // <cjk>
    0x8700, 0xE586, // <cjk>
    0x8702, 0x9649, // <cjk>
    0x8703, 0xE587, // <cjk>
    0x8706, 0xE584, // <cjk>
    0x8708, 0xE585, // <cjk>
    0x8709, 0xE58A, // <cjk>
    0x870A, 0xE58D, // <cjk>
    0x870D, 0xE58B, // <cjk>
    0x8711, 0xE589, // <cjk>
    0x8712, 0xE583, // <cjk>
    0x8718, 0x9277, // <cjk>
    0x871A, 0xE594, // <cjk>
    0x871C, 0x96A8, // <cjk>
    0x8725, 0xE592, // <cjk>
    0x8729, 0xE593, // <cjk>
    0x8734, 0xE58E, // <cjk>
    0x8737, 0xE590, // <cjk>
    0x873B, 0xE591, // <cjk>
    0x873F, 0xE58F, // <cjk>
    0x8749, 0x90E4, // <cjk>
    0x874B, 0x9858, // <cjk>
    0x874C, 0xE598, // <cjk>
    0x874E, 0xE599, // <cjk>
    0x8753, 0xE59F, // <cjk>
    0x8755, 0x9049, // <cjk>
    0x8757, 0xE59B, // <cjk>
    0x8759, 0xE59E, // <cjk>
    0x875F, 0xE596, // <cjk>
    0x8760, 0xE595, // <cjk>
    0x8763, 0xE5A0, // <cjk>
    0x8766, 0x89DA, // <cjk>
    0x8768, 0xE59C, // <cjk>
    0x876A, 0xE5A1, // <cjk>
    0x876E, 0xE59D, // <cjk>
    0x8774, 0xE59A, // <cjk>
    0x8776, 0x92B1, // <cjk>
    0x8778, 0xE597, // <cjk>
    0x877F, 0x9488, // <cjk>
    0x8782, 0xE5A5, // <cjk>
    0x878D, 0x975A, // <cjk>
    0x879F, 0xE5A4, // <cjk>
    0x87A2, 0xE5A3, // <cjk>
    0x87AB, 0xE5AC, // <cjk>
    0x87AF, 0xE5A6, // <cjk>
    0x87B3, 0xE5AE, // <cjk>
    0x87BA, 0x9786, // <cjk>
    0x87BB, 0xE5B1, // <cjk>
    0x87BD, 0xE5A8, // <cjk>
    0x87C0, 0xE5A9, // <cjk>
    0x87C4, 0xE5AD, // <cjk>
    0x87C6, 0xE5B0, // <cjk>
    0x87C7, 0xE5AF, // <cjk>
    0x87CB, 0xE5A7, // <cjk>
    0x87D0, 0xE5AA, // <cjk>
    0x87D2, 0xE5BB, // <cjk>
    0x87E0, 0xE5B4, // <cjk>
    0x87EF, 0xE5B2, // <cjk>
    0x87F2, 0xE5B3, // <cjk>
    0x87F6, 0xE5B8, // <cjk>
    0x87F7, 0xE5B9, // <cjk>
    0x87F9, 0x8A49, // <cjk>
    0x87FB, 0x8B61, // <cjk>
    0x87FE, 0xE5B7, // <cjk>
    0x8805, 0xE5A2, // <cjk>
    0x880D, 0xE5B6, // <cjk>
    0x880E, 0xE5BA, // <cjk>
    0x880F, 0xE5B5, // <cjk>
    0x8811, 0xE5BC, // <cjk>
    0x8815, 0xE5BE, // <cjk>
    0x8816, 0xE5BD, // <cjk>
    0x8821, 0xE5C0, // <cjk>
    0x8822, 0xE5BF, // <cjk>
    0x8823, 0xE579, // <cjk>
    0x8827, 0xE5C4, // <cjk>
    0x8831, 0xE5C1, // <cjk>
    0x8836, 0xE5C2, // <cjk>
    0x8839, 0xE5C3, // <cjk>
    0x883B, 0xE5C5, // <cjk>
    0x8840, 0x8C8C, // <cjk>
    0x8842, 0xE5C7, // <cjk>
    0x8844, 0xE5C6, // <cjk>
    0x8846, 0x8F4F, // <cjk>
    0x884C, 0x8D73, // <cjk>
    0x884D, 0x9FA5, // <cjk>
    0x8852, 0xE5C8, // <cjk>
    0x8853, 0x8F70, // <cjk>
    0x8857, 0x8A58, // <cjk>
    0x8859, 0xE5C9, // <cjk>
    0x885B, 0x8971, // <cjk>
    0x885D, 0x8FD5, // <cjk>
    0x885E, 0xE5CA, // <cjk>
    0x8861, 0x8D74, // <cjk>
    0x8862, 0xE5CB, // <cjk>
    0x8863, 0x88DF, // <cjk>
    0x8868, 0x955C, // <cjk>
    0x886B, 0xE5CC, // <cjk>
    0x8870, 0x908A, // <cjk>
    0x8872, 0xE5D3, // <cjk>
    0x8875, 0xE5D0, // <cjk>
    0x8877, 0x928F, // <cjk>
    0x887D, 0xE5D1, // <cjk>
    0x887E, 0xE5CE, // <cjk>
    0x887F, 0x8BDC, // <cjk>
    0x8881, 0xE5CD, // <cjk>
    0x8882, 0xE5D4, // <cjk>
    0x8888, 0x8C55, // <cjk>
    0x888B, 0x91DC, // <cjk>
    0x888D, 0xE5DA, // <cjk>
    0x8892, 0xE5D6, // <cjk>
    0x8896, 0x91B3, // <cjk>
    0x8897, 0xE5D5, // <cjk>
    0x8899, 0xE5D8, // <cjk>
    0x889E, 0xE5CF, // <cjk>
    0x88A2, 0xE5D9, // <cjk>
    0x88A4, 0xE5DB, // <cjk>
    0x88AB, 0x94ED, // <cjk>
    0x88AE, 0xE5D7, // <cjk>
    0x88B0, 0xE5DC, // <cjk>
    0x88B1, 0xE5DE, // <cjk>
    0x88B4, 0x8CD1, // <cjk>
    0x88B5, 0xE5D2, // <cjk>
    0x88B7, 0x88BF, // <cjk>
    0x88BF, 0xE5DD, // <cjk>
    0x88C1, 0x8DD9, // <cjk>
    0x88C2, 0x97F4, // <cjk>
    0x88C3, 0xE5DF, // <cjk>
    0x88C4, 0xE5E0, // <cjk>
    0x88C5, 0x9195, // <cjk>
    0x88CF, 0x97A0, // <cjk>
    0x88D4, 0xE5E1, // <cjk>
    0x88D5, 0x9754, // <cjk>
    0x88D8, 0xE5E2, // <cjk>
    0x88D9, 0xE5E3, // <cjk>
    0x88DC, 0x95E2, // <cjk>
    0x88DD, 0xE5E4, // <cjk>
    0x88DF, 0x8DBE, // <cjk>
    0x88E1, 0x97A1, // <cjk>
    0x88E8, 0xE5E9, // <cjk>
    0x88F2, 0xE5EA, // <cjk>
    0x88F3, 0x8FD6, // <cjk>
    0x88F4, 0xE5E8, // <cjk>
    0x88F8, 0x9787, // <cjk>
    0x88F9, 0xE5E5, // <cjk>
    0x88FC, 0xE5E7, // <cjk>
    0x88FD, 0x90BB, // <cjk>
    0x88FE, 0x909E, // <cjk>
    0x8902, 0xE5E6, // <cjk>
    0x8904, 0xE5EB, // <cjk>
    0x8907, 0x95A1, // <cjk>
    0x890A, 0xE5ED, // <cjk>
    0x890C, 0xE5EC, // <cjk>
    0x8910, 0x8A8C, // <cjk>
    0x8912, 0x964A, // <cjk>
    0x8913, 0xE5EE, // <cjk>
    0x891D, 0xE5FA, // <cjk>
    0x891E, 0xE5F0, // <cjk>
    0x8925, 0xE5F1, // <cjk>
    0x892A, 0xE5F2, // <cjk>
    0x892B, 0xE5F3, // <cjk>
    0x8936, 0xE5F7, // <cjk>
    0x8938, 0xE5F8, // <cjk>
    0x893B, 0xE5F6, // <cjk>
    0x8941, 0xE5F4, // <cjk>
    0x8943, 0xE5EF, // <cjk>
    0x8944, 0xE5F5, // <cjk>
    0x894C, 0xE5F9, // <cjk>
    0x894D, 0xE8B5, // <cjk>
    0x8956, 0x89A6, // <cjk>
    0x895E, 0xE5FC, // <cjk>
    0x895F, 0x8BDD, // <cjk>
    0x8960, 0xE5FB, // <cjk>
    0x8964, 0xE641, // <cjk>
    0x8966, 0xE640, // <cjk>
    0x896A, 0xE643, // <cjk>
    0x896D, 0xE642, // <cjk>
    0x896F, 0xE644, // <cjk>
    0x8972, 0x8F50, // <cjk>
    0x8974, 0xE645, // <cjk>
    0x8977, 0xE646, // <cjk>
    0x897E, 0xE647, // <cjk>
    0x897F, 0x90BC, // <cjk>
    0x8981, 0x9776, // <cjk>
    0x8983, 0xE648, // <cjk>
    0x8986, 0x95A2, // <cjk>
    0x8987, 0x9465, // <cjk>
    0x8988, 0xE649, // <cjk>
    0x898A, 0xE64A, // <cjk>
    0x898B, 0x8CA9, // <cjk>
    0x898F, 0x8B4B, // <cjk>
    0x8993, 0xE64B, // <cjk>
    0x8996, 0x8E8B, // <cjk>
    0x8997, 0x9460, // <cjk>
    0x8998, 0xE64C, // <cjk>
    0x899A, 0x8A6F, // <cjk>
    0x89A1, 0xE64D, // <cjk>
    0x89A6, 0xE64F, // <cjk>
    0x89A7, 0x9797, // <cjk>
    0x89A9, 0xE64E, // <cjk>
    0x89AA, 0x9065, // <cjk>
    0x89AC, 0xE650, // <cjk>
    0x89AF, 0xE651, // <cjk>
    0x89B2, 0xE652, // <cjk>
    0x89B3, 0x8ACF, // <cjk>
    0x89BA, 0xE653, // <cjk>
    0x89BD, 0xE654, // <cjk>
    0x89BF, 0xE655, // <cjk>
    0x89C0, 0xE656, // <cjk>
    0x89D2, 0x8A70, // <cjk>
    0x89DA, 0xE657, // <cjk>
    0x89DC, 0xE658, // <cjk>
    0x89DD, 0xE659, // <cjk>
    0x89E3, 0x89F0, // <cjk>
    0x89E6, 0x9047, // <cjk>
    0x89E7, 0xE65A, // <cjk>
    0x89F8, 0xE65C, // <cjk>
    0x8A00, 0x8CBE, // <cjk>
    0x8A02, 0x92F9, // <cjk>
    0x8A03, 0xE65D, // <cjk>
    0x8A08, 0x8C76, // <cjk>
    0x8A0A, 0x9075, // <cjk>
    0x8A0C, 0xE660, // <cjk>
    0x8A0E, 0x93A2, // <cjk>
    0x8A10, 0xE65F, // <cjk>
    0x8A13, 0x8C50, // <cjk>
    0x8A16, 0xE65E, // <cjk>
    0x8A17, 0x91F5, // <cjk>
    0x8A18, 0x8B4C, // <cjk>
    0x8A1B, 0xE661, // <cjk>
    0x8A1D, 0xE662, // <cjk>
    0x8A1F, 0x8FD7, // <cjk>
    0x8A23, 0x8C8D, // <cjk>
    0x8A25, 0xE663, // <cjk>
    0x8A2A, 0x964B, // <cjk>
    0x8A2D, 0x90DD, // <cjk>
    0x8A31, 0x8B96, // <cjk>
    0x8A33, 0x96F3, // <cjk>
    0x8A34, 0x9169, // <cjk>
    0x8A36, 0xE664, // <cjk>
    0x8A3A, 0x9066, // <cjk>
    0x8A3B, 0x9290, // <cjk>
    0x8A3C, 0x8FD8, // <cjk>
    0x8A41, 0xE665, // <cjk>
    0x8A46, 0xE668, // <cjk>
    0x8A48, 0xE669, // <cjk>
    0x8A50, 0x8DBC, // <cjk>
    0x8A51, 0x91C0, // <cjk>
    0x8A52, 0xE667, // <cjk>
    0x8A54, 0x8FD9, // <cjk>
    0x8A55, 0x955D, // <cjk>
    0x8A5B, 0xE666, // <cjk>
    0x8A5E, 0x8E8C, // <cjk>
    0x8A60, 0x8972, // <cjk>
    0x8A62, 0xE66D, // <cjk>
    0x8A63, 0x8C77, // <cjk>
    0x8A66, 0x8E8E, // <cjk>
    0x8A69, 0x8E8D, // <cjk>
    0x8A6B, 0x986C, // <cjk>
    0x8A6C, 0xE66C, // <cjk>
    0x8A6D, 0xE66B, // <cjk>
    0x8A6E, 0x9146, // <cjk>
    0x8A70, 0x8B6C, // <cjk>
    0x8A71, 0x9862, // <cjk>
    0x8A72, 0x8A59, // <cjk>
    0x8A73, 0x8FDA, // <cjk>
    0x8A7C, 0xE66A, // <cjk>
    0x8A82, 0xE66F, // <cjk>
    0x8A84, 0xE670, // <cjk>
    0x8A85, 0xE66E, // <cjk>
    0x8A87, 0x8CD6, // <cjk>
    0x8A89, 0x975F, // <cjk>
    0x8A8C, 0x8E8F, // <cjk>
    0x8A8D, 0x9446, // <cjk>
    0x8A91, 0xE673, // <cjk>
    0x8A93, 0x90BE, // <cjk>
    0x8A95, 0x9261, // <cjk>
    0x8A98, 0x9755, // <cjk>
    0x8A9A, 0xE676, // <cjk>
    0x8A9E, 0x8CEA, // <cjk>
    0x8AA0, 0x90BD, // <cjk>
    0x8AA1, 0xE672, // <cjk>
    0x8AA3, 0xE677, // <cjk>
    0x8AA4, 0x8CEB, // <cjk>
    0x8AA5, 0xE674, // <cjk>
    0x8AA6, 0xE675, // <cjk>
    0x8AA8, 0xE671, // <cjk>
    0x8AAC, 0x90E0, // <cjk>
    0x8AAD, 0x93C7, // <cjk>
    0x8AB0, 0x924E, // <cjk>
    0x8AB2, 0x89DB, // <cjk>
    0x8AB9, 0x94EE, // <cjk>
    0x8ABC, 0x8B62, // <cjk>
    0x8ABF, 0x92B2, // <cjk>
    0x8AC2, 0xE67A, // <cjk>
    0x8AC4, 0xE678, // <cjk>
    0x8AC7, 0x926B, // <cjk>
    0x8ACB, 0x90BF, // <cjk>
    0x8ACC, 0x8AD0, // <cjk>
    0x8ACD, 0xE679, // <cjk>
    0x8ACF, 0x907A, // <cjk>
    0x8AD2, 0x97C8, // <cjk>
    0x8AD6, 0x985F, // <cjk>
    0x8ADA, 0xE67B, // <cjk>
    0x8ADB, 0xE687, // <cjk>
    0x8ADC, 0x92B3, // <cjk>
    0x8ADE, 0xE686, // <cjk>
    0x8AE0, 0xE683, // <cjk>
    0x8AE1, 0xE68B, // <cjk>
    0x8AE2, 0xE684, // <cjk>
    0x8AE4, 0xE680, // <cjk>
    0x8AE6, 0x92FA, // <cjk>
    0x8AE7, 0xE67E, // <cjk>
    0x8AEB, 0xE67C, // <cjk>
    0x8AED, 0x9740, // <cjk>
    0x8AEE, 0x8E90, // <cjk>
    0x8AF1, 0xE681, // <cjk>
    0x8AF3, 0xE67D, // <cjk>
    0x8AF7, 0xE685, // <cjk>
    0x8AF8, 0x8F94, // <cjk>
    0x8AFA, 0x8CBF, // <cjk>
    0x8AFE, 0x91F8, // <cjk>
    0x8B00, 0x9664, // <cjk>
    0x8B01, 0x8979, // <cjk>
    0x8B02, 0x88E0, // <cjk>
    0x8B04, 0x93A3, // <cjk>
    0x8B07, 0xE689, // <cjk>
    0x8B0C, 0xE688, // <cjk>
    0x8B0E, 0x93E4, // <cjk>
    0x8B10, 0xE68D, // <cjk>
    0x8B14, 0xE682, // <cjk>
    0x8B16, 0xE68C, // <cjk>
    0x8B17, 0xE68E, // <cjk>
    0x8B19, 0x8CAA, // <cjk>
    0x8B1A, 0xE68A, // <cjk>
    0x8B1B, 0x8D75, // <cjk>
    0x8B1D, 0x8ED3, // <cjk>
    0x8B20, 0xE68F, // <cjk>
    0x8B21, 0x9777, // <cjk>
    0x8B26, 0xE692, // <cjk>
    0x8B28, 0xE695, // <cjk>
    0x8B2B, 0xE693, // <cjk>
    0x8B2C, 0x9554, // <cjk>
    0x8B33, 0xE690, // <cjk>
    0x8B39, 0x8BDE, // <cjk>
    0x8B3E, 0xE694, // <cjk>
    0x8B41, 0xE696, // <cjk>
    0x8B49, 0xE69A, // <cjk>
    0x8B4C, 0xE697, // <cjk>
    0x8B4E, 0xE699, // <cjk>
    0x8B4F, 0xE698, // <cjk>
    0x8B56, 0xE69B, // <cjk>
    0x8B58, 0x8EAF, // <cjk>
    0x8B5A, 0xE69D, // <cjk>
    0x8B5B, 0xE69C, // <cjk>
    0x8B5C, 0x9588, // <cjk>
    0x8B5F, 0xE69F, // <cjk>
    0x8B66, 0x8C78, // <cjk>
    0x8B6B, 0xE69E, // <cjk>
    0x8B6C, 0xE6A0, // <cjk>
    0x8B6F, 0xE6A1, // <cjk>
    0x8B70, 0x8B63, // <cjk>
    0x8B71, 0xE3BF, // <cjk>
    0x8B72, 0x8FF7, // <cjk>
    0x8B74, 0xE6A2, // <cjk>
    0x8B77, 0x8CEC, // <cjk>
    0x8B7D, 0xE6A3, // <cjk>
    0x8B80, 0xE6A4, // <cjk>
    0x8B83, 0x8E5D, // <cjk>
    0x8B8A, 0x9DCC, // <cjk>
    0x8B8C, 0xE6A5, // <cjk>
    0x8B8E, 0xE6A6, // <cjk>
    0x8B90, 0x8F51, // <cjk>
    0x8B92, 0xE6A7, // <cjk>
    0x8B93, 0xE6A8, // <cjk>
    0x8B96, 0xE6A9, // <cjk>
    0x8B99, 0xE6AA, // <cjk>
    0x8B9A, 0xE6AB, // <cjk>
    0x8C37, 0x924A, // <cjk>
    0x8C3A, 0xE6AC, // <cjk>
    0x8C3F, 0xE6AE, // <cjk>
    0x8C41, 0xE6AD, // <cjk>
    0x8C46, 0x93A4, // <cjk>
    0x8C48, 0xE6AF, // <cjk>
    0x8C4A, 0x964C, // <cjk>
    0x8C4C, 0xE6B0, // <cjk>
    0x8C4E, 0xE6B1, // <cjk>
    0x8C50, 0xE6B2, // <cjk>
    0x8C55, 0xE6B3, // <cjk>
    0x8C5A, 0x93D8, // <cjk>
    0x8C61, 0x8FDB, // <cjk>
    0x8C62, 0xE6B4, // <cjk>
    0x8C6A, 0x8D8B, // <cjk>
    0x8C6B, 0x98AC, // <cjk>
    0x8C6C, 0xE6B5, // <cjk>
    0x8C78, 0xE6B6, // <cjk>
    0x8C79, 0x955E, // <cjk>
    0x8C7A, 0xE6B7, // <cjk>
    0x8C7C, 0xE6BF, // <cjk>
    0x8C82, 0xE6B8, // <cjk>
    0x8C85, 0xE6BA, // <cjk>
    0x8C89, 0xE6B9, // <cjk>
    0x8C8A, 0xE6BB, // <cjk>
    0x8C8C, 0x9665, // <cjk>
    0x8C8D, 0xE6BC, // <cjk>
    0x8C8E, 0xE6BD, // <cjk>
    0x8C94, 0xE6BE, // <cjk>
    0x8C98, 0xE6C0, // <cjk>
    0x8C9D, 0x8A4C, // <cjk>
    0x8C9E, 0x92E5, // <cjk>
    0x8CA0, 0x9589, // <cjk>
    0x8CA1, 0x8DE0, // <cjk>
    0x8CA2, 0x8D76, // <cjk>
    0x8CA7, 0x956E, // <cjk>
    0x8CA8, 0x89DD, // <cjk>
    0x8CA9, 0x94CC, // <cjk>
    0x8CAA, 0xE6C3, // <cjk>
    0x8CAB, 0x8AD1, // <cjk>
    0x8CAC, 0x90D3, // <cjk>
    0x8CAD, 0xE6C2, // <cjk>
    0x8CAE, 0xE6C7, // <cjk>
    0x8CAF, 0x9299, // <cjk>
    0x8CB0, 0x96E1, // <cjk>
    0x8CB2, 0xE6C5, // <cjk>
    0x8CB3, 0xE6C6, // <cjk>
    0x8CB4, 0x8B4D, // <cjk>
    0x8CB6, 0xE6C8, // <cjk>
    0x8CB7, 0x9483, // <cjk>
    0x8CB8, 0x91DD, // <cjk>
    0x8CBB, 0x94EF, // <cjk>
    0x8CBC, 0x935C, // <cjk>
    0x8CBD, 0xE6C4, // <cjk>
    0x8CBF, 0x9666, // <cjk>
    0x8CC0, 0x89EA, // <cjk>
    0x8CC1, 0xE6CA, // <cjk>
    0x8CC2, 0x9847, // <cjk>
    0x8CC3, 0x92C0, // <cjk>
    0x8CC4, 0x9864, // <cjk>
    0x8CC7, 0x8E91, // <cjk>
    0x8CC8, 0xE6C9, // <cjk>
    0x8CCA, 0x91AF, // <cjk>
    0x8CCD, 0xE6DA, // <cjk>
    0x8CCE, 0x9147, // <cjk>
    0x8CD1, 0x93F6, // <cjk>
    0x8CD3, 0x956F, // <cjk>
    0x8CDA, 0xE6CD, // <cjk>
    0x8CDB, 0x8E5E, // <cjk>
    0x8CDC, 0x8E92, // <cjk>
    0x8CDE, 0x8FDC, // <cjk>
    0x8CE0, 0x9485, // <cjk>
    0x8CE2, 0x8CAB, // <cjk>
    0x8CE3, 0xE6CC, // <cjk>
    0x8CE4, 0xE6CB, // <cjk>
    0x8CE6, 0x958A, // <cjk>
    0x8CEA, 0x8EBF, // <cjk>
    0x8CED, 0x9371, // <cjk>
    0x8CFA, 0xE6CF, // <cjk>
    0x8CFB, 0xE6D0, // <cjk>
    0x8CFC, 0x8D77, // <cjk>
    0x8CFD, 0xE6CE, // <cjk>
    0x8D04, 0xE6D1, // <cjk>
    0x8D05, 0xE6D2, // <cjk>
    0x8D07, 0xE6D4, // <cjk>
    0x8D08, 0x91A1, // <cjk>
    0x8D0A, 0xE6D3, // <cjk>
    0x8D0B, 0x8AE4, // <cjk>
    0x8D0D, 0xE6D6, // <cjk>
    0x8D0F, 0xE6D5, // <cjk>
    0x8D10, 0xE6D7, // <cjk>
    0x8D13, 0xE6D9, // <cjk>
    0x8D14, 0xE6DB, // <cjk>
    0x8D16, 0xE6DC, // <cjk>
    0x8D64, 0x90D4, // <cjk>
    0x8D66, 0x8ECD, // <cjk>
    0x8D67, 0xE6DD, // <cjk>
    0x8D6B, 0x8A71, // <cjk>
    0x8D6D, 0xE6DE, // <cjk>
    0x8D70, 0x9196, // <cjk>
    0x8D71, 0xE6DF, // <cjk>
    0x8D73, 0xE6E0, // <cjk>
    0x8D74, 0x958B, // <cjk>
    0x8D77, 0x8B4E, // <cjk>
    0x8D81, 0xE6E1, // <cjk>
    0x8D85, 0x92B4, // <cjk>
    0x8D8A, 0x897A, // <cjk>
    0x8D99, 0xE6E2, // <cjk>
    0x8DA3, 0x8EEF, // <cjk>
    0x8DA8, 0x9096, // <cjk>
    0x8DB3, 0x91AB, // <cjk>
    0x8DBA, 0xE6E5, // <cjk>
    0x8DBE, 0xE6E4, // <cjk>
    0x8DC2, 0xE6E3, // <cjk>
    0x8DCB, 0xE6EB, // <cjk>
    0x8DCC, 0xE6E9, // <cjk>
    0x8DCF, 0xE6E6, // <cjk>
    0x8DD6, 0xE6E8, // <cjk>
    0x8DDA, 0xE6E7, // <cjk>
    0x8DDB, 0xE6EA, // <cjk>
    0x8DDD, 0x8B97, // <cjk>
    0x8DDF, 0xE6EE, // <cjk>
    0x8DE1, 0x90D5, // <cjk>
    0x8DE3, 0xE6EF, // <cjk>
    0x8DE8, 0x8CD7, // <cjk>
    0x8DEA, 0xE6EC, // <cjk>
    0x8DEB, 0xE6ED, // <cjk>
    0x8DEF, 0x9848, // <cjk>
    0x8DF3, 0x92B5, // <cjk>
    0x8DF5, 0x9148, // <cjk>
    0x8DFC, 0xE6F0, // <cjk>
    0x8DFF, 0xE6F3, // <cjk>
    0x8E08, 0xE6F1, // <cjk>
    0x8E09, 0xE6F2, // <cjk>
    0x8E0A, 0x9778, // <cjk>
    0x8E0F, 0x93A5, // <cjk>
    0x8E10, 0xE6F6, // <cjk>
    0x8E1D, 0xE6F4, // <cjk>
    0x8E1E, 0xE6F5, // <cjk>
    0x8E1F, 0xE6F7, // <cjk>
    0x8E2A, 0xE748, // <cjk>
    0x8E30, 0xE6FA, // <cjk>
    0x8E34, 0xE6FB, // <cjk>
    0x8E35, 0xE6F9, // <cjk>
    0x8E42, 0xE6F8, // <cjk>
    0x8E44, 0x92FB, // <cjk>
    0x8E47, 0xE740, // <cjk>
    0x8E48, 0xE744, // <cjk>
    0x8E49, 0xE741, // <cjk>
    0x8E4A, 0xE6FC, // <cjk>
    0x8E4C, 0xE742, // <cjk>
    0x8E50, 0xE743, // <cjk>
    0x8E55, 0xE74A, // <cjk>
    0x8E59, 0xE745, // <cjk>
    0x8E5F, 0x90D6, // <cjk>
    0x8E60, 0xE747, // <cjk>
    0x8E63, 0xE749, // <cjk>
    0x8E64, 0xE746, // <cjk>
    0x8E72, 0xE74C, // <cjk>
    0x8E74, 0x8F52, // <cjk>
    0x8E76, 0xE74B, // <cjk>
    0x8E7C, 0xE74D, // <cjk>
    0x8E81, 0xE74E, // <cjk>
    0x8E84, 0xE751, // <cjk>
    0x8E85, 0xE750, // <cjk>
    0x8E87, 0xE74F, // <cjk>
    0x8E8A, 0xE753, // <cjk>
    0x8E8B, 0xE752, // <cjk>
    0x8E8D, 0x96F4, // <cjk>
    0x8E91, 0xE755, // <cjk>
    0x8E93, 0xE754, // <cjk>
    0x8E94, 0xE756, // <cjk>
    0x8E99, 0xE757, // <cjk>
    0x8EA1, 0xE759, // <cjk>
    0x8EAA, 0xE758, // <cjk>
    0x8EAB, 0x9067, // <cjk>
    0x8EAC, 0xE75A, // <cjk>
    0x8EAF, 0x8BEB, // <cjk>
    0x8EB1, 0xE75D, // <cjk>
    0x8EBE, 0xE75E, // <cjk>
    0x8EC5, 0xE75F, // <cjk>
    0x8EC6, 0xE75C, // <cjk>
    0x8EC8, 0xE760, // <cjk>
    0x8ECA, 0x8ED4, // <cjk>
    0x8ECB, 0xE761, // <cjk>
    0x8ECC, 0x8B4F, // <cjk>
    0x8ECD, 0x8C52, // <cjk>
    0x8ED2, 0x8CAC, // <cjk>
    0x8EDB, 0xE762, // <cjk>
    0x8EDF, 0x93EE, // <cjk>
    0x8EE2, 0x935D, // <cjk>
    0x8EE3, 0xE763, // <cjk>
    0x8EEB, 0xE766, // <cjk>
    0x8EF8, 0x8EB2, // <cjk>
    0x8EFB, 0xE765, // <cjk>
    0x8EFC, 0xE764, // <cjk>
    0x8EFD, 0x8C79, // <cjk>
    0x8EFE, 0xE767, // <cjk>
    0x8F03, 0x8A72, // <cjk>
    0x8F05, 0xE769, // <cjk>
    0x8F09, 0x8DDA, // <cjk>
    0x8F0A, 0xE768, // <cjk>
    0x8F0C, 0xE771, // <cjk>
    0x8F12, 0xE76B, // <cjk>
    0x8F13, 0xE76D, // <cjk>
    0x8F14, 0x95E3, // <cjk>
    0x8F15, 0xE76A, // <cjk>
    0x8F19, 0xE76C, // <cjk>
    0x8F1B, 0xE770, // <cjk>
    0x8F1C, 0xE76E, // <cjk>
    0x8F1D, 0x8B50, // <cjk>
    0x8F1F, 0xE76F, // <cjk>
    0x8F26, 0xE772, // <cjk>
    0x8F29, 0x9479, // <cjk>
    0x8F2A, 0x97D6, // <cjk>
    0x8F2F, 0x8F53, // <cjk>
    0x8F33, 0xE773, // <cjk>
    0x8F38, 0x9741, // <cjk>
    0x8F39, 0xE775, // <cjk>
    0x8F3B, 0xE774, // <cjk>
    0x8F3E, 0xE778, // <cjk>
    0x8F3F, 0x9760, // <cjk>
    0x8F42, 0xE777, // <cjk>
    0x8F44, 0x8A8D, // <cjk>
    0x8F45, 0xE776, // <cjk>
    0x8F46, 0xE77B, // <cjk>
    0x8F49, 0xE77A, // <cjk>
    0x8F4C, 0xE779, // <cjk>
    0x8F4D, 0x9351, // <cjk>
    0x8F4E, 0xE77C, // <cjk>
    0x8F57, 0xE77D, // <cjk>
    0x8F5C, 0xE77E, // <cjk>
    0x8F5F, 0x8D8C, // <cjk>
    0x8F61, 0x8C44, // <cjk>
    0x8F62, 0xE780, // <cjk>
    0x8F63, 0xE781, // <cjk>
    0x8F64, 0xE782, // <cjk>
    0x8F9B, 0x9068, // <cjk>
    0x8F9C, 0xE783, // <cjk>
    0x8F9E, 0x8EAB, // <cjk>
    0x8F9F, 0xE784, // <cjk>
    0x8FA3, 0xE785, // <cjk>
    0x8FA7, 0x999F, // <cjk>
    0x8FA8, 0x999E, // <cjk>
    0x8FAD, 0xE786, // <cjk>
    0x8FAE, 0xE390, // <cjk>
    0x8FAF, 0xE787, // <cjk>
    0x8FB0, 0x9243, // <cjk>
    0x8FB1, 0x904A, // <cjk>
    0x8FB2, 0x945F, // <cjk>
    0x8FB7, 0xE788, // <cjk>
    0x8FBA, 0x95D3, // <cjk>
    0x8FBB, 0x92D2, // <cjk>
    0x8FBC, 0x8D9E, // <cjk>
    0x8FBF, 0x9248, // <cjk>
    0x8FC2, 0x8949, // <cjk>
    0x8FC4, 0x9698, // <cjk>
    0x8FC5, 0x9076, // <cjk>
    0x8FCE, 0x8C7D, // <cjk>
    0x8FD1, 0x8BDF, // <cjk>
    0x8FD4, 0x95D4, // <cjk>
    0x8FDA, 0xE789, // <cjk>
    0x8FE2, 0xE78B, // <cjk>
    0x8FE5, 0xE78A, // <cjk>
    0x8FE6, 0x89DE, // <cjk>
    0x8FE9, 0x93F4, // <cjk>
    0x8FEA, 0xE78C, // <cjk>
    0x8FEB, 0x9497, // <cjk>
    0x8FED, 0x9352, // <cjk>
    0x8FEF, 0xE78D, // <cjk>
    0x8FF0, 0x8F71, // <cjk>
    0x8FF4, 0xE78F, // <cjk>

    0x8FF7, 0x96C0, // <cjk>
    0x8FF8, 0xE79E, // <cjk>
    0x8FF9, 0xE791, // <cjk>
    0x8FFA, 0xE792, // <cjk>
    0x8FFD, 0x92C7, // <cjk>
    0x9000, 0x91DE, // <cjk>
    0x9001, 0x9197, // <cjk>
    0x9003, 0x93A6, // <cjk>
    0x9005, 0xE790, // <cjk>
    0x9006, 0x8B74, // <cjk>
    0x900B, 0xE799, // <cjk>
    0x900D, 0xE796, // <cjk>
    0x900E, 0xE7A3, // <cjk>
    0x900F, 0x93A7, // <cjk>
    0x9010, 0x9280, // <cjk>
    0x9011, 0xE793, // <cjk>
    0x9013, 0x92FC, // <cjk>
    0x9014, 0x9372, // <cjk>
    0x9015, 0xE794, // <cjk>
    0x9016, 0xE798, // <cjk>
    0x9017, 0x9080, // <cjk>
    0x9019, 0x9487, // <cjk>
    0x901A, 0x92CA, // <cjk>
    0x901D, 0x90C0, // <cjk>
    0x901E, 0xE797, // <cjk>
    0x901F, 0x91AC, // <cjk>
    0x9020, 0x91A2, // <cjk>
    0x9021, 0xE795, // <cjk>
    0x9022, 0x88A7, // <cjk>
    0x9023, 0x9841, // <cjk>
    0x9027, 0xE79A, // <cjk>
    0x902E, 0x91DF, // <cjk>
    0x9031, 0x8F54, // <cjk>
    0x9032, 0x9069, // <cjk>
    0x9035, 0xE79C, // <cjk>
    0x9036, 0xE79B, // <cjk>
    0x9038, 0x88ED, // <cjk>
    0x9039, 0xE79D, // <cjk>
    0x903C, 0x954E, // <cjk>
    0x903E, 0xE7A5, // <cjk>
    0x9041, 0x93D9, // <cjk>
    0x9042, 0x908B, // <cjk>
    0x9045, 0x9278, // <cjk>
    0x9047, 0x8BF6, // <cjk>
    0x9049, 0xE7A4, // <cjk>
    0x904A, 0x9756, // <cjk>
    0x904B, 0x895E, // <cjk>
    0x904D, 0x95D5, // <cjk>
    0x904E, 0x89DF, // <cjk>
    0x904F, 0xE79F, // <cjk>
    0x9050, 0xE7A0, // <cjk>
    0x9051, 0xE7A1, // <cjk>
    0x9052, 0xE7A2, // <cjk>
    0x9053, 0x93B9, // <cjk>
    0x9054, 0x9242, // <cjk>
    0x9055, 0x88E1, // <cjk>
    0x9056, 0xE7A6, // <cjk>
    0x9058, 0xE7A7, // <cjk>
    0x9059, 0xEAA1, // <cjk>
    0x905C, 0x91BB, // <cjk>
    0x905E, 0xE7A8, // <cjk>
    0x9060, 0x8993, // <cjk>
    0x9061, 0x916B, // <cjk>
    0x9063, 0x8CAD, // <cjk>
    0x9065, 0x9779, // <cjk>
    0x9068, 0xE7A9, // <cjk>
    0x9069, 0x934B, // <cjk>
    0x906D, 0x9198, // <cjk>
    0x906E, 0x8ED5, // <cjk>
    0x906F, 0xE7AA, // <cjk>
    0x9072, 0xE7AD, // <cjk>
    0x9075, 0x8F85, // <cjk>
    0x9076, 0xE7AB, // <cjk>
    0x9077, 0x914A, // <cjk>
    0x9078, 0x9149, // <cjk>
    0x907A, 0x88E2, // <cjk>
    0x907C, 0x97C9, // <cjk>
    0x907D, 0xE7AF, // <cjk>
    0x907F, 0x94F0, // <cjk>
    0x9080, 0xE7B1, // <cjk>
    0x9081, 0xE7B0, // <cjk>
    0x9082, 0xE7AE, // <cjk>
    0x9083, 0xE284, // <cjk>
    0x9084, 0x8AD2, // <cjk>
    0x9087, 0xE78E, // <cjk>
    0x9089, 0xE7B3, // <cjk>
    0x908A, 0xE7B2, // <cjk>
    0x908F, 0xE7B4, // <cjk>
    0x9091, 0x9757, // <cjk>
    0x90A3, 0x93DF, // <cjk>
    0x90A6, 0x964D, // <cjk>
    0x90A8, 0xE7B5, // <cjk>
    0x90AA, 0x8ED7, // <cjk>
    0x90AF, 0xE7B6, // <cjk>
    0x90B1, 0xE7B7, // <cjk>
    0x90B5, 0xE7B8, // <cjk>
    0x90B8, 0x9340, // <cjk>
    0x90C1, 0x88E8, // <cjk>
    0x90CA, 0x8D78, // <cjk>
    0x90CE, 0x9859, // <cjk>
    0x90DB, 0xE7BC, // <cjk>
    0x90E1, 0x8C53, // <cjk>
    0x90E2, 0xE7B9, // <cjk>
    0x90E4, 0xE7BA, // <cjk>
    0x90E8, 0x9594, // <cjk>
    0x90ED, 0x8A73, // <cjk>
    0x90F5, 0x9758, // <cjk>
    0x90F7, 0x8BBD, // <cjk>
    0x90FD, 0x9373, // <cjk>
    0x9102, 0xE7BD, // <cjk>
    0x9112, 0xE7BE, // <cjk>
    0x9119, 0xE7BF, // <cjk>
    0x912D, 0x9341, // <cjk>
    0x9130, 0xE7C1, // <cjk>
    0x9132, 0xE7C0, // <cjk>
    0x9149, 0x93D1, // <cjk>
    0x914A, 0xE7C2, // <cjk>
    0x914B, 0x8F55, // <cjk>
    0x914C, 0x8EDE, // <cjk>
    0x914D, 0x947A, // <cjk>
    0x914E, 0x9291, // <cjk>
    0x9152, 0x8EF0, // <cjk>
    0x9154, 0x908C, // <cjk>
    0x9156, 0xE7C3, // <cjk>
    0x9158, 0xE7C4, // <cjk>
    0x9162, 0x907C, // <cjk>
    0x9163, 0xE7C5, // <cjk>
    0x9165, 0xE7C6, // <cjk>
    0x9169, 0xE7C7, // <cjk>
    0x916A, 0x978F, // <cjk>
    0x916C, 0x8F56, // <cjk>
    0x9172, 0xE7C9, // <cjk>
    0x9173, 0xE7C8, // <cjk>
    0x9175, 0x8D79, // <cjk>
    0x9177, 0x8D93, // <cjk>
    0x9178, 0x8E5F, // <cjk>
    0x9182, 0xE7CC, // <cjk>
    0x9187, 0x8F86, // <cjk>
    0x9189, 0xE7CB, // <cjk>
    0x918B, 0xE7CA, // <cjk>
    0x918D, 0x91E7, // <cjk>
    0x9190, 0x8CED, // <cjk>
    0x9192, 0x90C1, // <cjk>
    0x9197, 0x94AE, // <cjk>
    0x919C, 0x8F58, // <cjk>
    0x91A2, 0xE7CD, // <cjk>
    0x91A4, 0x8FDD, // <cjk>
    0x91AA, 0xE7D0, // <cjk>
    0x91AB, 0xE7CE, // <cjk>
    0x91AF, 0xE7CF, // <cjk>
    0x91B4, 0xE7D2, // <cjk>
    0x91B5, 0xE7D1, // <cjk>
    0x91B8, 0x8FF8, // <cjk>
    0x91BA, 0xE7D3, // <cjk>
    0x91C0, 0xE7D4, // <cjk>
    0x91C1, 0xE7D5, // <cjk>
    0x91C6, 0x94CE, // <cjk>
    0x91C7, 0x8DD1, // <cjk>
    0x91C8, 0x8EDF, // <cjk>
    0x91C9, 0xE7D6, // <cjk>
    0x91CB, 0xE7D7, // <cjk>
    0x91CC, 0x97A2, // <cjk>
    0x91CD, 0x8F64, // <cjk>
    0x91CE, 0x96EC, // <cjk>
    0x91CF, 0x97CA, // <cjk>
    0x91D0, 0xE7D8, // <cjk>
    0x91D1, 0x8BE0, // <cjk>
    0x91D6, 0xE7D9, // <cjk>
    0x91D8, 0x9342, // <cjk>
    0x91DB, 0xE7DC, // <cjk>
    0x91DC, 0x8A98, // <cjk>
    0x91DD, 0x906A, // <cjk>
    0x91DF, 0xE7DA, // <cjk>
    0x91E1, 0xE7DB, // <cjk>
    0x91E3, 0x92DE, // <cjk>
    0x91E6, 0x9674, // <cjk>
    0x91E7, 0x8BFA, // <cjk>
    0x91F5, 0xE7DE, // <cjk>
    0x91F6, 0xE7DF, // <cjk>
    0x91FC, 0xE7DD, // <cjk>
    0x91FF, 0xE7E1, // <cjk>
    0x920D, 0x93DD, // <cjk>
    0x920E, 0x8A62, // <cjk>
    0x9211, 0xE7E5, // <cjk>
    0x9214, 0xE7E2, // <cjk>
    0x9215, 0xE7E4, // <cjk>
    0x921E, 0xE7E0, // <cjk>
    0x9229, 0xE86E, // <cjk>
    0x922C, 0xE7E3, // <cjk>
    0x9234, 0x97E9, // <cjk>
    0x9237, 0x8CD8, // <cjk>
    0x923F, 0xE7ED, // <cjk>
    0x9244, 0x9353, // <cjk>
    0x9245, 0xE7E8, // <cjk>
    0x9248, 0xE7EB, // <cjk>
    0x9249, 0xE7E9, // <cjk>
    0x924B, 0xE7EE, // <cjk>
    0x9250, 0xE7EF, // <cjk>
    0x9257, 0xE7E7, // <cjk>
    0x925A, 0xE7F4, // <cjk>
    0x925B, 0x8994, // <cjk>
    0x925E, 0xE7E6, // <cjk>
    0x9262, 0x94AB, // <cjk>
    0x9264, 0xE7EA, // <cjk>
    0x9266, 0x8FDE, // <cjk>
    0x9271, 0x8D7A, // <cjk>
    0x927E, 0x9667, // <cjk>
    0x9280, 0x8BE2, // <cjk>
    0x9283, 0x8F65, // <cjk>
    0x9285, 0x93BA, // <cjk>
    0x9291, 0x914C, // <cjk>
    0x9293, 0xE7F2, // <cjk>
    0x9295, 0xE7EC, // <cjk>
    0x9296, 0xE7F1, // <cjk>
    0x9298, 0x96C1, // <cjk>
    0x929A, 0x92B6, // <cjk>
    0x929B, 0xE7F3, // <cjk>
    0x929C, 0xE7F0, // <cjk>
    0x92AD, 0x914B, // <cjk>
    0x92B7, 0xE7F7, // <cjk>
    0x92B9, 0xE7F6, // <cjk>
    0x92CF, 0xE7F5, // <cjk>
    0x92D2, 0x964E, // <cjk>
    0x92E4, 0x8F9B, // <cjk>
    0x92E9, 0xE7F8, // <cjk>
    0x92EA, 0x95DD, // <cjk>
    0x92ED, 0x8973, // <cjk>
    0x92F2, 0x9565, // <cjk>
    0x92F3, 0x9292, // <cjk>
    0x92F8, 0x8B98, // <cjk>
    0x92FA, 0xE7FA, // <cjk>
    0x92FC, 0x8D7C, // <cjk>
    0x9306, 0x8E4B, // <cjk>
    0x930F, 0xE7F9, // <cjk>
    0x9310, 0x908D, // <cjk>
    0x9318, 0x908E, // <cjk>
    0x9319, 0xE840, // <cjk>
    0x931A, 0xE842, // <cjk>
    0x9320, 0x8FF9, // <cjk>
    0x9322, 0xE841, // <cjk>
    0x9323, 0xE843, // <cjk>
    0x9326, 0x8BD1, // <cjk>
    0x9328, 0x9564, // <cjk>
    0x932B, 0x8EE0, // <cjk>
    0x932C, 0x9842, // <cjk>
    0x932E, 0xE7FC, // <cjk>
    0x932F, 0x8DF6, // <cjk>
    0x9332, 0x985E, // <cjk>
    0x9335, 0xE845, // <cjk>
    0x933A, 0xE844, // <cjk>
    0x933B, 0xE846, // <cjk>
    0x9344, 0xE7FB, // <cjk>
    0x934B, 0x93E7, // <cjk>
    0x934D, 0x9374, // <cjk>
    0x9354, 0x92D5, // <cjk>
    0x9356, 0xE84B, // <cjk>
    0x935B, 0x9262, // <cjk>
    0x935C, 0xE847, // <cjk>
    0x9360, 0xE848, // <cjk>
    0x936C, 0x8C4C, // <cjk>
    0x936E, 0xE84A, // <cjk>
    0x9375, 0x8CAE, // <cjk>
    0x937C, 0xE849, // <cjk>
    0x937E, 0x8FDF, // <cjk>
    0x938C, 0x8A99, // <cjk>
    0x9394, 0xE84F, // <cjk>
    0x9396, 0x8DBD, // <cjk>
    0x9397, 0x9199, // <cjk>
    0x939A, 0x92C8, // <cjk>
    0x93A7, 0x8A5A, // <cjk>
    0x93AC, 0xE84D, // <cjk>
    0x93AD, 0xE84E, // <cjk>
    0x93AE, 0x92C1, // <cjk>
    0x93B0, 0xE84C, // <cjk>
    0x93B9, 0xE850, // <cjk>
    0x93C3, 0xE856, // <cjk>
    0x93C8, 0xE859, // <cjk>
    0x93D0, 0xE858, // <cjk>
    0x93D1, 0x934C, // <cjk>
    0x93D6, 0xE851, // <cjk>
    0x93D7, 0xE852, // <cjk>
    0x93D8, 0xE855, // <cjk>
    0x93DD, 0xE857, // <cjk>
    0x93E1, 0x8BBE, // <cjk>
    0x93E4, 0xE85A, // <cjk>
    0x93E5, 0xE854, // <cjk>
    0x93E8, 0xE853, // <cjk>
    0x9403, 0xE85E, // <cjk>
    0x9407, 0xE85F, // <cjk>
    0x9410, 0xE860, // <cjk>
    0x9413, 0xE85D, // <cjk>
    0x9414, 0xE85C, // <cjk>
    0x9418, 0x8FE0, // <cjk>
    0x9419, 0x93A8, // <cjk>
    0x9421, 0xE864, // <cjk>
    0x942B, 0xE862, // <cjk>
    0x9435, 0xE863, // <cjk>
    0x9436, 0xE861, // <cjk>
    0x9438, 0x91F6, // <cjk>
    0x943A, 0xE865, // <cjk>
    0x9441, 0xE866, // <cjk>
    0x9444, 0xE868, // <cjk>
    0x9451, 0x8AD3, // <cjk>
    0x9452, 0xE867, // <cjk>
    0x9453, 0x96F8, // <cjk>
    0x945A, 0xE873, // <cjk>
    0x945B, 0xE869, // <cjk>
    0x945E, 0xE86C, // <cjk>
    0x9460, 0xE86A, // <cjk>
    0x9462, 0xE86B, // <cjk>
    0x946A, 0xE86D, // <cjk>
    0x9470, 0xE86F, // <cjk>
    0x9475, 0xE870, // <cjk>
    0x9477, 0xE871, // <cjk>
    0x947C, 0xE874, // <cjk>
    0x947D, 0xE872, // <cjk>
    0x947E, 0xE875, // <cjk>
    0x947F, 0xE877, // <cjk>
    0x9481, 0xE876, // <cjk>
    0x9577, 0x92B7, // <cjk>
    0x9580, 0x96E5, // <cjk>
    0x9582, 0xE878, // <cjk>
    0x9583, 0x914D, // <cjk>
    0x9587, 0xE879, // <cjk>
    0x9589, 0x95C2, // <cjk>
    0x958A, 0xE87A, // <cjk>
    0x958B, 0x8A4A, // <cjk>
    0x9591, 0x8AD5, // <cjk>
    0x9593, 0x8AD4, // <cjk>
    0x9594, 0xE87B, // <cjk>
    0x9596, 0xE87C, // <cjk>
    0x9598, 0xE87D, // <cjk>
    0x9599, 0xE87E, // <cjk>
    0x95A0, 0xE880, // <cjk>
    0x95A2, 0x8AD6, // <cjk>
    0x95A3, 0x8A74, // <cjk>
    0x95A4, 0x8D7D, // <cjk>
    0x95A5, 0x94B4, // <cjk>
    0x95A7, 0xE882, // <cjk>
    0x95A8, 0xE881, // <cjk>
    0x95AD, 0xE883, // <cjk>
    0x95B2, 0x897B, // <cjk>
    0x95B9, 0xE886, // <cjk>
    0x95BB, 0xE885, // <cjk>
    0x95BC, 0xE884, // <cjk>
    0x95BE, 0xE887, // <cjk>
    0x95C3, 0xE88A, // <cjk>
    0x95C7, 0x88C5, // <cjk>
    0x95CA, 0xE888, // <cjk>
    0x95CC, 0xE88C, // <cjk>
    0x95CD, 0xE88B, // <cjk>
    0x95D4, 0xE88E, // <cjk>
    0x95D5, 0xE88D, // <cjk>
    0x95D6, 0xE88F, // <cjk>
    0x95D8, 0x93AC, // <cjk>
    0x95DC, 0xE890, // <cjk>
    0x95E1, 0xE891, // <cjk>
    0x95E2, 0xE893, // <cjk>
    0x95E5, 0xE892, // <cjk>
    0x961C, 0x958C, // <cjk>
    0x9621, 0xE894, // <cjk>
    0x9628, 0xE895, // <cjk>
    0x962A, 0x8DE3, // <cjk>
    0x962E, 0xE896, // <cjk>
    0x962F, 0xE897, // <cjk>
    0x9632, 0x9668, // <cjk>
    0x963B, 0x916A, // <cjk>
    0x963F, 0x88A2, // <cjk>
    0x9640, 0x91C9, // <cjk>
    0x9642, 0xE898, // <cjk>
    0x9644, 0x958D, // <cjk>
    0x964B, 0xE89B, // <cjk>
    0x964C, 0xE899, // <cjk>
    0x964D, 0x8D7E, // <cjk>
    0x964F, 0xE89A, // <cjk>
    0x9650, 0x8CC0, // <cjk>
    0x965B, 0x95C3, // <cjk>
    0x965C, 0xE89D, // <cjk>
    0x965D, 0xE89F, // <cjk>
    0x965E, 0xE89E, // <cjk>
    0x965F, 0xE8A0, // <cjk>
    0x9662, 0x8940, // <cjk>
    0x9663, 0x9077, // <cjk>
    0x9664, 0x8F9C, // <cjk>
    0x9665, 0x8AD7, // <cjk>
    0x9666, 0xE8A1, // <cjk>
    0x966A, 0x9486, // <cjk>
    0x966C, 0xE8A3, // <cjk>
    0x9670, 0x8941, // <cjk>
    0x9672, 0xE8A2, // <cjk>
    0x9673, 0x92C2, // <cjk>
    0x9675, 0x97CB, // <cjk>
    0x9676, 0x93A9, // <cjk>
    0x9677, 0xE89C, // <cjk>
    0x9678, 0x97A4, // <cjk>
    0x967A, 0x8CAF, // <cjk>
    0x967D, 0x977A, // <cjk>
    0x9685, 0x8BF7, // <cjk>
    0x9686, 0x97B2, // <cjk>
    0x9688, 0x8C47, // <cjk>
    0x968A, 0x91E0, // <cjk>
    0x968B, 0xE440, // <cjk>
    0x968D, 0xE8A4, // <cjk>
    0x968E, 0x8A4B, // <cjk>
    0x968F, 0x908F, // <cjk>
    0x9694, 0x8A75, // <cjk>
    0x9695, 0xE8A6, // <cjk>
    0x9697, 0xE8A7, // <cjk>
    0x9698, 0xE8A5, // <cjk>
    0x9699, 0x8C84, // <cjk>
    0x969B, 0x8DDB, // <cjk>
    0x969C, 0x8FE1, // <cjk>
    0x96A0, 0x8942, // <cjk>
    0x96A3, 0x97D7, // <cjk>
    0x96A7, 0xE8A9, // <cjk>
    0x96A8, 0xE7AC, // <cjk>
    0x96AA, 0xE8A8, // <cjk>
    0x96B0, 0xE8AC, // <cjk>
    0x96B1, 0xE8AA, // <cjk>
    0x96B2, 0xE8AB, // <cjk>
    0x96B4, 0xE8AD, // <cjk>
    0x96B6, 0xE8AE, // <cjk>
    0x96B7, 0x97EA, // <cjk>
    0x96B8, 0xE8AF, // <cjk>
    0x96B9, 0xE8B0, // <cjk>
    0x96BB, 0x90C7, // <cjk>
    0x96BC, 0x94B9, // <cjk>
    0x96C0, 0x909D, // <cjk>
    0x96C1, 0x8AE5, // <cjk>
    0x96C4, 0x9759, // <cjk>
    0x96C5, 0x89EB, // <cjk>
    0x96C6, 0x8F57, // <cjk>
    0x96C7, 0x8CD9, // <cjk>
    0x96C9, 0xE8B3, // <cjk>
    0x96CB, 0xE8B2, // <cjk>
    0x96CC, 0x8E93, // <cjk>
    0x96CD, 0xE8B4, // <cjk>
    0x96CE, 0xE8B1, // <cjk>
    0x96D1, 0x8E47, // <cjk>
    0x96D5, 0xE8B8, // <cjk>
    0x96D6, 0xE5AB, // <cjk>
    0x96D9, 0x99D4, // <cjk>
    0x96DB, 0x9097, // <cjk>
    0x96DC, 0xE8B6, // <cjk>
    0x96E2, 0x97A3, // <cjk>
    0x96E3, 0x93EF, // <cjk>
    0x96E8, 0x894A, // <cjk>
    0x96EA, 0x90E1, // <cjk>
    0x96EB, 0x8EB4, // <cjk>
    0x96F0, 0x95B5, // <cjk>
    0x96F2, 0x895F, // <cjk>
    0x96F6, 0x97EB, // <cjk>
    0x96F7, 0x978B, // <cjk>
    0x96F9, 0xE8B9, // <cjk>
    0x96FB, 0x9364, // <cjk>
    0x9700, 0x8EF9, // <cjk>
    0x9704, 0xE8BA, // <cjk>
    0x9706, 0xE8BB, // <cjk>
    0x9707, 0x906B, // <cjk>
    0x9708, 0xE8BC, // <cjk>
    0x970A, 0x97EC, // <cjk>
    0x970D, 0xE8B7, // <cjk>
    0x970E, 0xE8BE, // <cjk>
    0x970F, 0xE8C0, // <cjk>
    0x9711, 0xE8BF, // <cjk>
    0x9713, 0xE8BD, // <cjk>
    0x9716, 0xE8C1, // <cjk>
    0x9719, 0xE8C2, // <cjk>
    0x971C, 0x919A, // <cjk>
    0x971E, 0x89E0, // <cjk>
    0x9724, 0xE8C3, // <cjk>
    0x9727, 0x96B6, // <cjk>
    0x972A, 0xE8C4, // <cjk>
    0x9730, 0xE8C5, // <cjk>
    0x9732, 0x9849, // <cjk>
    0x9738, 0x9E50, // <cjk>
    0x9739, 0xE8C6, // <cjk>
    0x973D, 0xE8C7, // <cjk>
    0x973E, 0xE8C8, // <cjk>
    0x9742, 0xE8CC, // <cjk>
    0x9744, 0xE8C9, // <cjk>
    0x9746, 0xE8CA, // <cjk>
    0x9748, 0xE8CB, // <cjk>
    0x9749, 0xE8CD, // <cjk>
    0x9752, 0x90C2, // <cjk>
    0x9756, 0x96F5, // <cjk>
    0x9759, 0x90C3, // <cjk>
    0x975C, 0xE8CE, // <cjk>
    0x975E, 0x94F1, // <cjk>
    0x9760, 0xE8CF, // <cjk>
    0x9761, 0xEA72, // <cjk>
    0x9762, 0x96CA, // <cjk>
    0x9764, 0xE8D0, // <cjk>
    0x9766, 0xE8D1, // <cjk>
    0x9768, 0xE8D2, // <cjk>
    0x9769, 0x8A76, // <cjk>
    0x976B, 0xE8D4, // <cjk>
    0x976D, 0x9078, // <cjk>
    0x9771, 0xE8D5, // <cjk>
    0x9774, 0x8C43, // <cjk>
    0x9779, 0xE8D6, // <cjk>
    0x977A, 0xE8DA, // <cjk>
    0x977C, 0xE8D8, // <cjk>
    0x9781, 0xE8D9, // <cjk>
    0x9784, 0x8A93, // <cjk>
    0x9785, 0xE8D7, // <cjk>
    0x9786, 0xE8DB, // <cjk>
    0x978B, 0xE8DC, // <cjk>
    0x978D, 0x88C6, // <cjk>
    0x978F, 0xE8DD, // <cjk>
    0x9790, 0xE8DE, // <cjk>
    0x9798, 0x8FE2, // <cjk>
    0x979C, 0xE8DF, // <cjk>
    0x97A0, 0x8B66, // <cjk>
    0x97A3, 0xE8E2, // <cjk>
    0x97A6, 0xE8E1, // <cjk>
    0x97A8, 0xE8E0, // <cjk>
    0x97AB, 0xE691, // <cjk>
    0x97AD, 0x95DA, // <cjk>
    0x97B3, 0xE8E3, // <cjk>
    0x97B4, 0xE8E4, // <cjk>
    0x97C3, 0xE8E5, // <cjk>
    0x97C6, 0xE8E6, // <cjk>
    0x97C8, 0xE8E7, // <cjk>
    0x97CB, 0xE8E8, // <cjk>
    0x97D3, 0x8AD8, // <cjk>
    0x97DC, 0xE8E9, // <cjk>
    0x97ED, 0xE8EA, // <cjk>
    0x97EE, 0x9442, // <cjk>
    0x97F2, 0xE8EC, // <cjk>
    0x97F3, 0x89B9, // <cjk>
    0x97F5, 0xE8EF, // <cjk>
    0x97F6, 0xE8EE, // <cjk>
    0x97FB, 0x8943, // <cjk>
    0x97FF, 0x8BBF, // <cjk>
    0x9801, 0x95C5, // <cjk>
    0x9802, 0x92B8, // <cjk>
    0x9803, 0x8DA0, // <cjk>
    0x9805, 0x8D80, // <cjk>
    0x9806, 0x8F87, // <cjk>
    0x9808, 0x907B, // <cjk>
    0x980C, 0xE8F1, // <cjk>
    0x980F, 0xE8F0, // <cjk>
    0x9810, 0x9761, // <cjk>
    0x9811, 0x8AE6, // <cjk>
    0x9812, 0x94D0, // <cjk>
    0x9813, 0x93DA, // <cjk>
    0x9817, 0x909C, // <cjk>
    0x9818, 0x97CC, // <cjk>
    0x981A, 0x8C7A, // <cjk>
    0x9821, 0xE8F4, // <cjk>
    0x9824, 0xE8F3, // <cjk>
    0x982C, 0x966A, // <cjk>
    0x982D, 0x93AA, // <cjk>
    0x9834, 0x896F, // <cjk>
    0x9837, 0xE8F5, // <cjk>
    0x9838, 0xE8F2, // <cjk>
    0x983B, 0x9570, // <cjk>
    0x983C, 0x978A, // <cjk>
    0x983D, 0xE8F6, // <cjk>
    0x9846, 0xE8F7, // <cjk>
    0x984B, 0xE8F9, // <cjk>
    0x984C, 0x91E8, // <cjk>
    0x984D, 0x8A7A, // <cjk>
    0x984E, 0x8A7B, // <cjk>
    0x984F, 0xE8F8, // <cjk>
    0x9854, 0x8AE7, // <cjk>
    0x9855, 0x8CB0, // <cjk>
    0x9858, 0x8AE8, // <cjk>
    0x985B, 0x935E, // <cjk>
    0x985E, 0x97DE, // <cjk>
    0x9867, 0x8CDA, // <cjk>
    0x986B, 0xE8FA, // <cjk>
    0x986F, 0xE8FB, // <cjk>
    0x9870, 0xE8FC, // <cjk>
    0x9871, 0xE940, // <cjk>
    0x9873, 0xE942, // <cjk>
    0x9874, 0xE941, // <cjk>
    0x98A8, 0x9597, // <cjk>
    0x98AA, 0xE943, // <cjk>
    0x98AF, 0xE944, // <cjk>
    0x98B1, 0xE945, // <cjk>
    0x98B6, 0xE946, // <cjk>
    0x98C3, 0xE948, // <cjk>
    0x98C4, 0xE947, // <cjk>
    0x98C6, 0xE949, // <cjk>
    0x98DB, 0x94F2, // <cjk>
    0x98DC, 0xE3CA, // <cjk>
    0x98DF, 0x9048, // <cjk>
    0x98E2, 0x8B51, // <cjk>
    0x98E9, 0xE94A, // <cjk>
    0x98EB, 0xE94B, // <cjk>
    0x98ED, 0x99AA, // <cjk>
    0x98EE, 0x9F5A, // <cjk>
    0x98EF, 0x94D1, // <cjk>
    0x98F2, 0x88F9, // <cjk>
    0x98F4, 0x88B9, // <cjk>
    0x98FC, 0x8E94, // <cjk>
    0x98FD, 0x964F, // <cjk>
    0x98FE, 0x8FFC, // <cjk>
    0x9903, 0xE94C, // <cjk>
    0x9905, 0x96DD, // <cjk>
    0x9909, 0xE94D, // <cjk>
    0x990A, 0x977B, // <cjk>
    0x990C, 0x8961, // <cjk>
    0x9910, 0x8E60, // <cjk>
    0x9912, 0xE94E, // <cjk>
    0x9913, 0x89EC, // <cjk>
    0x9914, 0xE94F, // <cjk>
    0x9918, 0xE950, // <cjk>
    0x991D, 0xE952, // <cjk>
    0x991E, 0xE953, // <cjk>
    0x9920, 0xE955, // <cjk>
    0x9921, 0xE951, // <cjk>
    0x9924, 0xE954, // <cjk>
    0x9928, 0x8AD9, // <cjk>
    0x992C, 0xE956, // <cjk>
    0x992E, 0xE957, // <cjk>
    0x993D, 0xE958, // <cjk>
    0x993E, 0xE959, // <cjk>
    0x9942, 0xE95A, // <cjk>
    0x9945, 0xE95C, // <cjk>
    0x994B, 0xE95E, // <cjk>
    0x994C, 0xE961, // <cjk>
    0x9950, 0xE95D, // <cjk>
    0x9951, 0xE95F, // <cjk>
    0x9952, 0xE960, // <cjk>
    0x9955, 0xE962, // <cjk>
    0x9957, 0x8BC0, // <cjk>
    0x9996, 0x8EF1, // <cjk>
    0x9997, 0xE963, // <cjk>
    0x9998, 0xE964, // <cjk>
    0x9999, 0x8D81, // <cjk>
    0x99A5, 0xE965, // <cjk>
    0x99A8, 0x8A5D, // <cjk>
    0x99AC, 0x946E, // <cjk>
    0x99AD, 0xE966, // <cjk>
    0x99AE, 0xE967, // <cjk>
    0x99B3, 0x9279, // <cjk>
    0x99B4, 0x93E9, // <cjk>
    0x99BC, 0xE968, // <cjk>
    0x99C1, 0x949D, // <cjk>
    0x99C4, 0x91CA, // <cjk>
    0x99C5, 0x8977, // <cjk>
    0x99C6, 0x8BEC, // <cjk>
    0x99C8, 0x8BED, // <cjk>
    0x99D0, 0x9293, // <cjk>
    0x99D1, 0xE96D, // <cjk>
    0x99D2, 0x8BEE, // <cjk>
    0x99D5, 0x89ED, // <cjk>
    0x99D8, 0xE96C, // <cjk>
    0x99DB, 0xE96A, // <cjk>
    0x99DD, 0xE96B, // <cjk>
    0x99DF, 0xE969, // <cjk>
    0x99E2, 0xE977, // <cjk>
    0x99ED, 0xE96E, // <cjk>
    0x99EE, 0xE96F, // <cjk>
    0x99F1, 0xE970, // <cjk>
    0x99F2, 0xE971, // <cjk>
    0x99F8, 0xE973, // <cjk>
    0x99FB, 0xE972, // <cjk>
    0x99FF, 0x8F78, // <cjk>
    0x9A01, 0xE974, // <cjk>
    0x9A05, 0xE976, // <cjk>
    0x9A0E, 0x8B52, // <cjk>
    0x9A0F, 0xE975, // <cjk>
    0x9A12, 0x919B, // <cjk>
    0x9A13, 0x8CB1, // <cjk>
    0x9A19, 0xE978, // <cjk>
    0x9A28, 0x91CB, // <cjk>
    0x9A2B, 0xE979, // <cjk>
    0x9A30, 0x93AB, // <cjk>
    0x9A37, 0xE97A, // <cjk>
    0x9A3E, 0xE980, // <cjk>
    0x9A40, 0xE97D, // <cjk>
    0x9A42, 0xE97C, // <cjk>
    0x9A43, 0xE97E, // <cjk>
    0x9A45, 0xE97B, // <cjk>
    0x9A4D, 0xE982, // <cjk>
    0x9A55, 0xE981, // <cjk>
    0x9A57, 0xE984, // <cjk>
    0x9A5A, 0x8BC1, // <cjk>
    0x9A5B, 0xE983, // <cjk>
    0x9A5F, 0xE985, // <cjk>
    0x9A62, 0xE986, // <cjk>
    0x9A64, 0xE988, // <cjk>
    0x9A65, 0xE987, // <cjk>
    0x9A69, 0xE989, // <cjk>
    0x9A6A, 0xE98B, // <cjk>
    0x9A6B, 0xE98A, // <cjk>
    0x9AA8, 0x8D9C, // <cjk>
    0x9AAD, 0xE98C, // <cjk>
    0x9AB0, 0xE98D, // <cjk>
    0x9ABC, 0xE98E, // <cjk>
    0x9AC0, 0xE98F, // <cjk>
    0x9AC4, 0x9091, // <cjk>
    0x9ACF, 0xE990, // <cjk>
    0x9AD1, 0xE991, // <cjk>
    0x9AD3, 0xE992, // <cjk>
    0x9AD4, 0xE993, // <cjk>
    0x9AD8, 0x8D82, // <cjk>
    0x9ADE, 0xE994, // <cjk>
    0x9ADF, 0xE995, // <cjk>
    0x9AE2, 0xE996, // <cjk>
    0x9AE3, 0xE997, // <cjk>
    0x9AE6, 0xE998, // <cjk>
    0x9AEA, 0x94AF, // <cjk>
    0x9AEB, 0xE99A, // <cjk>
    0x9AED, 0x9545, // <cjk>
    0x9AEE, 0xE99B, // <cjk>
    0x9AEF, 0xE999, // <cjk>
    0x9AF1, 0xE99D, // <cjk>
    0x9AF4, 0xE99C, // <cjk>
    0x9AF7, 0xE99E, // <cjk>
    0x9AFB, 0xE99F, // <cjk>
    0x9B06, 0xE9A0, // <cjk>
    0x9B18, 0xE9A1, // <cjk>
    0x9B1A, 0xE9A2, // <cjk>
    0x9B1F, 0xE9A3, // <cjk>
    0x9B22, 0xE9A4, // <cjk>
    0x9B23, 0xE9A5, // <cjk>
    0x9B25, 0xE9A6, // <cjk>
    0x9B27, 0xE9A7, // <cjk>
    0x9B28, 0xE9A8, // <cjk>
    0x9B29, 0xE9A9, // <cjk>
    0x9B2A, 0xE9AA, // <cjk>
    0x9B2E, 0xE9AB, // <cjk>
    0x9B2F, 0xE9AC, // <cjk>
    0x9B31, 0x9F54, // <cjk>
    0x9B32, 0xE9AD, // <cjk>
    0x9B3B, 0xE2F6, // <cjk>
    0x9B3C, 0x8B53, // <cjk>
    0x9B41, 0x8A40, // <cjk>
    0x9B42, 0x8DB0, // <cjk>
    0x9B43, 0xE9AF, // <cjk>
    0x9B44, 0xE9AE, // <cjk>
    0x9B45, 0x96A3, // <cjk>
    0x9B4D, 0xE9B1, // <cjk>
    0x9B4E, 0xE9B2, // <cjk>
    0x9B4F, 0xE9B0, // <cjk>
    0x9B51, 0xE9B3, // <cjk>
    0x9B54, 0x9682, // <cjk>
    0x9B58, 0xE9B4, // <cjk>
    0x9B5A, 0x8B9B, // <cjk>
    0x9B6F, 0x9844, // <cjk>
    0x9B74, 0xE9B5, // <cjk>
    0x9B83, 0xE9B7, // <cjk>
    0x9B8E, 0x88BC, // <cjk>
    0x9B91, 0xE9B8, // <cjk>
    0x9B92, 0x95A9, // <cjk>
    0x9B93, 0xE9B6, // <cjk>
    0x9B96, 0xE9B9, // <cjk>
    0x9B97, 0xE9BA, // <cjk>
    0x9B9F, 0xE9BB, // <cjk>
    0x9BA0, 0xE9BC, // <cjk>
    0x9BA8, 0xE9BD, // <cjk>
    0x9BAA, 0x968E, // <cjk>
    0x9BAB, 0x8E4C, // <cjk>
    0x9BAD, 0x8DF8, // <cjk>
    0x9BAE, 0x914E, // <cjk>
    0x9BB4, 0xE9BE, // <cjk>
    0x9BB9, 0xE9C1, // <cjk>
    0x9BC0, 0xE9BF, // <cjk>
    0x9BC6, 0xE9C2, // <cjk>
    0x9BC9, 0x8CEF, // <cjk>
    0x9BCA, 0xE9C0, // <cjk>
    0x9BCF, 0xE9C3, // <cjk>
    0x9BD1, 0xE9C4, // <cjk>
    0x9BD2, 0xE9C5, // <cjk>
    0x9BD4, 0xE9C9, // <cjk>
    0x9BD6, 0x8E49, // <cjk>
    0x9BDB, 0x91E2, // <cjk>
    0x9BE1, 0xE9CA, // <cjk>
    0x9BE2, 0xE9C7, // <cjk>
    0x9BE3, 0xE9C6, // <cjk>
    0x9BE4, 0xE9C8, // <cjk>
    0x9BE8, 0x8C7E, // <cjk>
    0x9BF0, 0xE9CE, // <cjk>
    0x9BF1, 0xE9CD, // <cjk>
    0x9BF2, 0xE9CC, // <cjk>
    0x9BF5, 0x88B1, // <cjk>
    0x9C04, 0xE9D8, // <cjk>
    0x9C06, 0xE9D4, // <cjk>
    0x9C08, 0xE9D5, // <cjk>
    0x9C09, 0xE9D1, // <cjk>
    0x9C0A, 0xE9D7, // <cjk>
    0x9C0C, 0xE9D3, // <cjk>
    0x9C0D, 0x8A82, // <cjk>
    0x9C10, 0x986B, // <cjk>
    0x9C12, 0xE9D6, // <cjk>
    0x9C13, 0xE9D2, // <cjk>
    0x9C14, 0xE9D0, // <cjk>
    0x9C15, 0xE9CF, // <cjk>
    0x9C1B, 0xE9DA, // <cjk>
    0x9C21, 0xE9DD, // <cjk>
    0x9C24, 0xE9DC, // <cjk>
    0x9C25, 0xE9DB, // <cjk>
    0x9C2D, 0x9568, // <cjk>
    0x9C2E, 0xE9D9, // <cjk>
    0x9C2F, 0x88F1, // <cjk>
    0x9C30, 0xE9DE, // <cjk>
    0x9C32, 0xE9E0, // <cjk>
    0x9C39, 0x8A8F, // <cjk>
    0x9C3A, 0xE9CB, // <cjk>
    0x9C3B, 0x8956, // <cjk>
    0x9C3E, 0xE9E2, // <cjk>
    0x9C46, 0xE9E1, // <cjk>
    0x9C47, 0xE9DF, // <cjk>
    0x9C48, 0x924C, // <cjk>
    0x9C52, 0x9690, // <cjk>
    0x9C57, 0x97D8, // <cjk>
    0x9C5A, 0xE9E3, // <cjk>
    0x9C60, 0xE9E4, // <cjk>
    0x9C67, 0xE9E5, // <cjk>
    0x9C76, 0xE9E6, // <cjk>
    0x9C78, 0xE9E7, // <cjk>
    0x9CE5, 0x92B9, // <cjk>
    0x9CE7, 0xE9E8, // <cjk>
    0x9CE9, 0x94B5, // <cjk>
    0x9CEB, 0xE9ED, // <cjk>
    0x9CEC, 0xE9E9, // <cjk>
    0x9CF0, 0xE9EA, // <cjk>
    0x9CF3, 0x9650, // <cjk>
    0x9CF4, 0x96C2, // <cjk>
    0x9CF6, 0x93CE, // <cjk>
    0x9D03, 0xE9EE, // <cjk>
    0x9D06, 0xE9EF, // <cjk>
    0x9D07, 0x93BC, // <cjk>
    0x9D08, 0xE9EC, // <cjk>
    0x9D09, 0xE9EB, // <cjk>
    0x9D0E, 0x89A8, // <cjk>
    0x9D12, 0xE9F7, // <cjk>
    0x9D15, 0xE9F6, // <cjk>
    0x9D1B, 0x8995, // <cjk>
    0x9D1F, 0xE9F4, // <cjk>
    0x9D23, 0xE9F3, // <cjk>
    0x9D26, 0xE9F1, // <cjk>
    0x9D28, 0x8A9B, // <cjk>
    0x9D2A, 0xE9F0, // <cjk>
    0x9D2B, 0x8EB0, // <cjk>
    0x9D2C, 0x89A7, // <cjk>
    0x9D3B, 0x8D83, // <cjk>
    0x9D3E, 0xE9FA, // <cjk>
    0x9D3F, 0xE9F9, // <cjk>
    0x9D41, 0xE9F8, // <cjk>
    0x9D44, 0xE9F5, // <cjk>
    0x9D46, 0xE9FB, // <cjk>
    0x9D48, 0xE9FC, // <cjk>
    0x9D50, 0xEA44, // <cjk>
    0x9D51, 0xEA43, // <cjk>
    0x9D59, 0xEA45, // <cjk>
    0x9D5C, 0x894C, // <cjk>
    0x9D5D, 0xEA40, // <cjk>
    0x9D5E, 0xEA41, // <cjk>
    0x9D60, 0x8D94, // <cjk>
    0x9D61, 0x96B7, // <cjk>
    0x9D64, 0xEA42, // <cjk>
    0x9D6C, 0x9651, // <cjk>
    0x9D6F, 0xEA4A, // <cjk>
    0x9D72, 0xEA46, // <cjk>
    0x9D7A, 0xEA4B, // <cjk>
    0x9D87, 0xEA48, // <cjk>
    0x9D89, 0xEA47, // <cjk>
    0x9D8F, 0x8C7B, // <cjk>
    0x9D9A, 0xEA4C, // <cjk>
    0x9DA4, 0xEA4D, // <cjk>
    0x9DA9, 0xEA4E, // <cjk>
    0x9DAB, 0xEA49, // <cjk>
    0x9DAF, 0xE9F2, // <cjk>
    0x9DB2, 0xEA4F, // <cjk>
    0x9DB4, 0x92DF, // <cjk>
    0x9DB8, 0xEA53, // <cjk>
    0x9DBA, 0xEA54, // <cjk>
    0x9DBB, 0xEA52, // <cjk>
    0x9DC1, 0xEA51, // <cjk>
    0x9DC2, 0xEA57, // <cjk>
    0x9DC4, 0xEA50, // <cjk>
    0x9DC6, 0xEA55, // <cjk>
    0x9DCF, 0xEA56, // <cjk>
    0x9DD3, 0xEA59, // <cjk>
    0x9DD9, 0xEA58, // <cjk>
    0x9DED, 0xEA5C, // <cjk>
    0x9DEF, 0xEA5D, // <cjk>
    0x9DF2, 0x9868, // <cjk>
    0x9DF8, 0xEA5A, // <cjk>
    0x9DF9, 0x91E9, // <cjk>
    0x9DFA, 0x8DEB, // <cjk>
    0x9DFD, 0xEA5E, // <cjk>
    0x9E1A, 0xEA5F, // <cjk>
    0x9E1B, 0xEA60, // <cjk>
    0x9E1E, 0xEA61, // <cjk>
    0x9E75, 0xEA62, // <cjk>
    0x9E78, 0x8CB2, // <cjk>
    0x9E79, 0xEA63, // <cjk>
    0x9E7D, 0xEA64, // <cjk>
    0x9E7F, 0x8EAD, // <cjk>
    0x9E81, 0xEA65, // <cjk>
    0x9E88, 0xEA66, // <cjk>
    0x9E8B, 0xEA67, // <cjk>
    0x9E8C, 0xEA68, // <cjk>
    0x9E91, 0xEA6B, // <cjk>
    0x9E92, 0xEA69, // <cjk>
    0x9E95, 0xEA6A, // <cjk>
    0x9E97, 0x97ED, // <cjk>
    0x9E9D, 0xEA6C, // <cjk>
    0x9E9F, 0x97D9, // <cjk>
    0x9EA5, 0xEA6D, // <cjk>
    0x9EA6, 0x949E, // <cjk>
    0x9EA9, 0xEA6E, // <cjk>
    0x9EAA, 0xEA70, // <cjk>
    0x9EAD, 0xEA71, // <cjk>
    0x9EB8, 0xEA6F, // <cjk>
    0x9EB9, 0x8D8D, // <cjk>
    0x9EBA, 0x96CB, // <cjk>
    0x9EBB, 0x9683, // <cjk>
    0x9EBC, 0x9BF5, // <cjk>
    0x9EBE, 0x9F80, // <cjk>
    0x9EBF, 0x969B, // <cjk>
    0x9EC4, 0x89A9, // <cjk>
    0x9ECC, 0xEA73, // <cjk>
    0x9ECD, 0x8B6F, // <cjk>
    0x9ECE, 0xEA74, // <cjk>
    0x9ECF, 0xEA75, // <cjk>
    0x9ED0, 0xEA76, // <cjk>
    0x9ED2, 0x8D95, // <cjk>
    0x9ED4, 0xEA77, // <cjk>
    0x9ED8, 0xE0D2, // <cjk>
    0x9ED9, 0x96D9, // <cjk>
    0x9EDB, 0x91E1, // <cjk>
    0x9EDC, 0xEA78, // <cjk>
    0x9EDD, 0xEA7A, // <cjk>
    0x9EDE, 0xEA79, // <cjk>
    0x9EE0, 0xEA7B, // <cjk>
    0x9EE5, 0xEA7C, // <cjk>
    0x9EE8, 0xEA7D, // <cjk>
    0x9EEF, 0xEA7E, // <cjk>
    0x9EF4, 0xEA80, // <cjk>
    0x9EF6, 0xEA81, // <cjk>
    0x9EF7, 0xEA82, // <cjk>
    0x9EF9, 0xEA83, // <cjk>
    0x9EFB, 0xEA84, // <cjk>
    0x9EFC, 0xEA85, // <cjk>
    0x9EFD, 0xEA86, // <cjk>
    0x9F07, 0xEA87, // <cjk>
    0x9F08, 0xEA88, // <cjk>
    0x9F0E, 0x9343, // <cjk>
    0x9F13, 0x8CDB, // <cjk>
    0x9F15, 0xEA8A, // <cjk>
    0x9F20, 0x916C, // <cjk>
    0x9F21, 0xEA8B, // <cjk>
    0x9F2C, 0xEA8C, // <cjk>
    0x9F3B, 0x9540, // <cjk>
    0x9F3E, 0xEA8D, // <cjk>
    0x9F4A, 0xEA8E, // <cjk>
    0x9F4B, 0xE256, // <cjk>
    0x9F4E, 0xE6D8, // <cjk>
    0x9F4F, 0xE8EB, // <cjk>
    0x9F52, 0xEA8F, // <cjk>
    0x9F54, 0xEA90, // <cjk>
    0x9F5F, 0xEA92, // <cjk>
    0x9F60, 0xEA93, // <cjk>
    0x9F61, 0xEA94, // <cjk>
    0x9F62, 0x97EE, // <cjk>
    0x9F63, 0xEA91, // <cjk>
    0x9F66, 0xEA95, // <cjk>
    0x9F67, 0xEA96, // <cjk>
    0x9F6A, 0xEA98, // <cjk>
    0x9F6C, 0xEA97, // <cjk>
    0x9F72, 0xEA9A, // <cjk>
    0x9F76, 0xEA9B, // <cjk>
    0x9F77, 0xEA99, // <cjk>
    0x9F8D, 0x97B4, // <cjk>
    0x9F95, 0xEA9C, // <cjk>
    0x9F9C, 0xEA9D, // <cjk>
    0x9F9D, 0xE273, // <cjk>
    0x9FA0, 0xEA9E, // <cjk>
    0xFF01, 0x8149, // FULLWIDTH EXCLAMATION MARK
    0xFF03, 0x8194, // FULLWIDTH NUMBER SIGN
    0xFF04, 0x8190, // FULLWIDTH DOLLAR SIGN
    0xFF05, 0x8193, // FULLWIDTH PERCENT SIGN
    0xFF06, 0x8195, // FULLWIDTH AMPERSAND
    0xFF07, 0x81AD, // FULLWIDTH APOSTROPHE
    0xFF08, 0x8169, // FULLWIDTH LEFT PARENTHESIS
    0xFF09, 0x816A, // FULLWIDTH RIGHT PARENTHESIS
    0xFF0A, 0x8196, // FULLWIDTH ASTERISK
    0xFF0B, 0x817B, // FULLWIDTH PLUS SIGN
    0xFF0C, 0x8143, // FULLWIDTH COMMA
    0xFF0E, 0x8144, // FULLWIDTH FULL STOP
    0xFF0F, 0x815E, // FULLWIDTH SOLIDUS
    0xFF10, 0x824F, // FULLWIDTH DIGIT ZERO
    0xFF11, 0x8250, // FULLWIDTH DIGIT ONE
    0xFF12, 0x8251, // FULLWIDTH DIGIT TWO
    0xFF13, 0x8252, // FULLWIDTH DIGIT THREE
    0xFF14, 0x8253, // FULLWIDTH DIGIT FOUR
    0xFF15, 0x8254, // FULLWIDTH DIGIT FIVE
    0xFF16, 0x8255, // FULLWIDTH DIGIT SIX
    0xFF17, 0x8256, // FULLWIDTH DIGIT SEVEN
    0xFF18, 0x8257, // FULLWIDTH DIGIT EIGHT
    0xFF19, 0x8258, // FULLWIDTH DIGIT NINE
    0xFF1A, 0x8146, // FULLWIDTH COLON
    0xFF1B, 0x8147, // FULLWIDTH SEMICOLON
    0xFF1C, 0x8183, // FULLWIDTH LESS-THAN SIGN
    0xFF1D, 0x8181, // FULLWIDTH EQUALS SIGN
    0xFF1E, 0x8184, // FULLWIDTH GREATER-THAN SIGN
    0xFF1F, 0x8148, // FULLWIDTH QUESTION MARK
    0xFF20, 0x8197, // FULLWIDTH COMMERCIAL AT
    0xFF21, 0x8260, // FULLWIDTH LATIN CAPITAL LETTER A
    0xFF22, 0x8261, // FULLWIDTH LATIN CAPITAL LETTER B
    0xFF23, 0x8262, // FULLWIDTH LATIN CAPITAL LETTER C
    0xFF24, 0x8263, // FULLWIDTH LATIN CAPITAL LETTER D
    0xFF25, 0x8264, // FULLWIDTH LATIN CAPITAL LETTER E
    0xFF26, 0x8265, // FULLWIDTH LATIN CAPITAL LETTER F
    0xFF27, 0x8266, // FULLWIDTH LATIN CAPITAL LETTER G
    0xFF28, 0x8267, // FULLWIDTH LATIN CAPITAL LETTER H
    0xFF29, 0x8268, // FULLWIDTH LATIN CAPITAL LETTER I
    0xFF2A, 0x8269, // FULLWIDTH LATIN CAPITAL LETTER J
    0xFF2B, 0x826A, // FULLWIDTH LATIN CAPITAL LETTER K
    0xFF2C, 0x826B, // FULLWIDTH LATIN CAPITAL LETTER L
    0xFF2D, 0x826C, // FULLWIDTH LATIN CAPITAL LETTER M
    0xFF2E, 0x826D, // FULLWIDTH LATIN CAPITAL LETTER N
    0xFF2F, 0x826E, // FULLWIDTH LATIN CAPITAL LETTER O
    0xFF30, 0x826F, // FULLWIDTH LATIN CAPITAL LETTER P
    0xFF31, 0x8270, // FULLWIDTH LATIN CAPITAL LETTER Q
    0xFF32, 0x8271, // FULLWIDTH LATIN CAPITAL LETTER R
    0xFF33, 0x8272, // FULLWIDTH LATIN CAPITAL LETTER S
    0xFF34, 0x8273, // FULLWIDTH LATIN CAPITAL LETTER T
    0xFF35, 0x8274, // FULLWIDTH LATIN CAPITAL LETTER U
    0xFF36, 0x8275, // FULLWIDTH LATIN CAPITAL LETTER V
    0xFF37, 0x8276, // FULLWIDTH LATIN CAPITAL LETTER W
    0xFF38, 0x8277, // FULLWIDTH LATIN CAPITAL LETTER X
    0xFF39, 0x8278, // FULLWIDTH LATIN CAPITAL LETTER Y
    0xFF3A, 0x8279, // FULLWIDTH LATIN CAPITAL LETTER Z
    0xFF3B, 0x816D, // FULLWIDTH LEFT SQUARE BRACKET
    0xFF3D, 0x816E, // FULLWIDTH RIGHT SQUARE BRACKET
    0xFF3E, 0x814F, // FULLWIDTH CIRCUMFLEX ACCENT
    0xFF3F, 0x8151, // FULLWIDTH LOW LINE
    0xFF40, 0x814D, // FULLWIDTH GRAVE ACCENT
    0xFF41, 0x8281, // FULLWIDTH LATIN SMALL LETTER A
    0xFF42, 0x8282, // FULLWIDTH LATIN SMALL LETTER B
    0xFF43, 0x8283, // FULLWIDTH LATIN SMALL LETTER C
    0xFF44, 0x8284, // FULLWIDTH LATIN SMALL LETTER D
    0xFF45, 0x8285, // FULLWIDTH LATIN SMALL LETTER E
    0xFF46, 0x8286, // FULLWIDTH LATIN SMALL LETTER F
    0xFF47, 0x8287, // FULLWIDTH LATIN SMALL LETTER G
    0xFF48, 0x8288, // FULLWIDTH LATIN SMALL LETTER H
    0xFF49, 0x8289, // FULLWIDTH LATIN SMALL LETTER I
    0xFF4A, 0x828A, // FULLWIDTH LATIN SMALL LETTER J
    0xFF4B, 0x828B, // FULLWIDTH LATIN SMALL LETTER K
    0xFF4C, 0x828C, // FULLWIDTH LATIN SMALL LETTER L
    0xFF4D, 0x828D, // FULLWIDTH LATIN SMALL LETTER M
    0xFF4E, 0x828E, // FULLWIDTH LATIN SMALL LETTER N
    0xFF4F, 0x828F, // FULLWIDTH LATIN SMALL LETTER O
    0xFF50, 0x8290, // FULLWIDTH LATIN SMALL LETTER P
    0xFF51, 0x8291, // FULLWIDTH LATIN SMALL LETTER Q
    0xFF52, 0x8292, // FULLWIDTH LATIN SMALL LETTER R
    0xFF53, 0x8293, // FULLWIDTH LATIN SMALL LETTER S
    0xFF54, 0x8294, // FULLWIDTH LATIN SMALL LETTER T
    0xFF55, 0x8295, // FULLWIDTH LATIN SMALL LETTER U
    0xFF56, 0x8296, // FULLWIDTH LATIN SMALL LETTER V
    0xFF57, 0x8297, // FULLWIDTH LATIN SMALL LETTER W
    0xFF58, 0x8298, // FULLWIDTH LATIN SMALL LETTER X
    0xFF59, 0x8299, // FULLWIDTH LATIN SMALL LETTER Y
    0xFF5A, 0x829A, // FULLWIDTH LATIN SMALL LETTER Z
    0xFF5B, 0x816F, // FULLWIDTH LEFT CURLY BRACKET
    0xFF5C, 0x8162, // FULLWIDTH VERTICAL LINE
    0xFF5D, 0x8170, // FULLWIDTH RIGHT CURLY BRACKET
    0xFFE3, 0x8150, // FULLWIDTH MACRON
    0xFFE5, 0x818F // FULLWIDTH YEN SIGN
};







|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
>
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
24
25
26
27
28
29
30
31


























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































32
33
34















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































35
36
37
38














































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































39
40
41
42
43




















































































































































































































































































































































































































































































































































































































































































































































































































































































44
45

46
47































































































































































































































































































































































































































































































































































































































































48
49











































































































































































































































































































































































































































    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */



























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#ifndef SJIS_H
#define SJIS_H
















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































INTERNAL int sjis_wctomb_zint(unsigned int* r, unsigned int wc);
INTERNAL int sjis_utf8tomb(struct zint_symbol *symbol, const unsigned char source[], size_t* p_length, unsigned int* jisdata);
INTERNAL int sjis_utf8tosb(int eci, const unsigned char source[], size_t* p_length, unsigned int* jisdata);
INTERNAL void sjis_cpy(const unsigned char source[], size_t* p_length, unsigned int* jisdata);





















































































































































































































































































































































































































































































































































































































































































































































































































































































#ifdef __cplusplus

}
#endif /* __cplusplus */
































































































































































































































































































































































































































































































































































































































































#endif /* SJIS_H */











































































































































































































































































































































































































































Changes to jni/zint/backend/svg.c.
1
2
3
4
5
6
7
8
9
10
11
12
/* svg.c - Scalable Vector Graphics */

/*
    libzint - the open source barcode library
    Copyright (C) 2009-2018 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.




|







1
2
3
4
5
6
7
8
9
10
11
12
/* svg.c - Scalable Vector Graphics */

/*
    libzint - the open source barcode library
    Copyright (C) 2009-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43












































44
45
46
47
48
49

50
51
52
53
54
55





























56
57
58
59
60
61
62
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif

#include "common.h"













































int svg_plot(struct zint_symbol *symbol) {
    FILE *fsvg;
    int error_number = 0;
    const char *locale = NULL;
    float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy;
    float radius;

    
    struct zint_vector_rect *rect;
    struct zint_vector_hexagon *hex;
    struct zint_vector_circle *circle;
    struct zint_vector_string *string;






























    if (symbol->output_options & BARCODE_STDOUT) {
        fsvg = stdout;
    } else {
        fsvg = fopen(symbol->outfile, "w");
    }
    if (fsvg == NULL) {
        strcpy(symbol->errtxt, "660: Could not open output file");







>












>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|





>
|





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#ifdef _MSC_VER
#include <malloc.h>
#endif

#include "common.h"

static void make_html_friendly(unsigned char * string, char * html_version) {
    /* Converts text to use HTML entity codes */

    int i, html_pos;

    html_pos = 0;
    html_version[html_pos] = '\0';

    for (i = 0; i < ustrlen(string); i++) {
        switch(string[i]) {
            case '>':
                strcat(html_version, "&gt;");
                html_pos += 4;
                break;

            case '<':
                strcat(html_version, "&lt;");
                html_pos += 4;
                break;

            case '&':
                strcat(html_version, "&amp;");
                html_pos += 5;
                break;

            case '"':
                strcat(html_version, "&quot;");
                html_pos += 6;
                break;

            case '\'':
                strcat(html_version, "&apos;");
                html_pos += 6;
                break;

            default:
                html_version[html_pos] = string[i];
                html_pos++;
                html_version[html_pos] = '\0';
                break;
         }
    }
}

INTERNAL int svg_plot(struct zint_symbol *symbol) {
    FILE *fsvg;
    int error_number = 0;
    const char *locale = NULL;
    float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy;
    float radius;
    int i;

    struct zint_vector_rect *rect;
    struct zint_vector_hexagon *hex;
    struct zint_vector_circle *circle;
    struct zint_vector_string *string;

#ifdef _MSC_VER
    char* html_string;
#endif

    int html_len = strlen((char *)symbol->text) + 1;

    for (i = 0; i < strlen((char *)symbol->text); i++) {
        switch(symbol->text[i]) {
            case '>':
            case '<':
            case '"':
            case '&':
            case '\'':
                html_len += 6;
                break;
        }
    }

#ifndef _MSC_VER
    char html_string[html_len];
#else
    html_string = (char*) _alloca(html_len);
#endif

    /* Check for no created vector set */
    /* E-Mail Christian Schmitz 2019-09-10: reason unknown  Ticket #164*/
    if (symbol->vector == NULL) {
        return ZINT_ERROR_INVALID_DATA;
    }
    if (symbol->output_options & BARCODE_STDOUT) {
        fsvg = stdout;
    } else {
        fsvg = fopen(symbol->outfile, "w");
    }
    if (fsvg == NULL) {
        strcpy(symbol->errtxt, "660: Could not open output file");
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119

120
121
122
123
124
125
126
127
    fprintf(fsvg, "   xmlns=\"http://www.w3.org/2000/svg\">\n");
    fprintf(fsvg, "   <desc>Zint Generated Symbol\n");
    fprintf(fsvg, "   </desc>\n");
    fprintf(fsvg, "\n   <g id=\"barcode\" fill=\"#%s\">\n", symbol->fgcolour);

    fprintf(fsvg, "      <rect x=\"0\" y=\"0\" width=\"%d\" height=\"%d\" fill=\"#%s\" />\n", (int) ceil(symbol->vector->width), (int) ceil(symbol->vector->height), symbol->bgcolour);

    
    rect = symbol->vector->rectangles;
    while (rect) {
        fprintf(fsvg, "      <rect x=\"%.2f\" y=\"%.2f\" width=\"%.2f\" height=\"%.2f\" />\n", rect->x, rect->y, rect->width, rect->height);
        rect = rect->next;
    }
    
    hex = symbol->vector->hexagons;
    while (hex) {
        radius = hex->diameter / 2.0;
        ay = hex->y + (1.0 * radius);
        by = hex->y + (0.5 * radius);
        cy = hex->y - (0.5 * radius);
        dy = hex->y - (1.0 * radius);
        ey = hex->y - (0.5 * radius);
        fy = hex->y + (0.5 * radius);
        ax = hex->x;
        bx = hex->x + (0.86 * radius);
        cx = hex->x + (0.86 * radius);
        dx = hex->x;
        ex = hex->x - (0.86 * radius);
        fx = hex->x - (0.86 * radius);
        fprintf(fsvg, "      <path d=\"M %.2f %.2f L %.2f %.2f L %.2f %.2f L %.2f %.2f L %.2f %.2f L %.2f %.2f Z\" />\n", ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy);
        hex = hex->next;
    }
    
    circle = symbol->vector->circles;
    while (circle) {
        if (circle->colour) {
            fprintf(fsvg, "      <circle cx=\"%.2f\" cy=\"%.2f\" r=\"%.2f\" fill=\"#%s\" />\n", circle->x, circle->y, circle->diameter / 2.0, symbol->bgcolour);
        } else {
            fprintf(fsvg, "      <circle cx=\"%.2f\" cy=\"%.2f\" r=\"%.2f\" fill=\"#%s\" />\n", circle->x, circle->y, circle->diameter / 2.0, symbol->fgcolour);
        }
        circle = circle->next;
    }
    
    string = symbol->vector->strings;
    while (string) {
        fprintf(fsvg, "      <text x=\"%.2f\" y=\"%.2f\" text-anchor=\"middle\"\n", string->x, string->y);
        fprintf(fsvg, "         font-family=\"Helvetica\" font-size=\"%.1f\" fill=\"#%s\" >\n", string->fsize, symbol->fgcolour);

        fprintf(fsvg, "         %s\n", string->text);
        fprintf(fsvg, "      </text>\n");
        string = string->next;
    }

    fprintf(fsvg, "   </g>\n");
    fprintf(fsvg, "</svg>\n");








<





|


















|









|




>
|







148
149
150
151
152
153
154

155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
    fprintf(fsvg, "   xmlns=\"http://www.w3.org/2000/svg\">\n");
    fprintf(fsvg, "   <desc>Zint Generated Symbol\n");
    fprintf(fsvg, "   </desc>\n");
    fprintf(fsvg, "\n   <g id=\"barcode\" fill=\"#%s\">\n", symbol->fgcolour);

    fprintf(fsvg, "      <rect x=\"0\" y=\"0\" width=\"%d\" height=\"%d\" fill=\"#%s\" />\n", (int) ceil(symbol->vector->width), (int) ceil(symbol->vector->height), symbol->bgcolour);


    rect = symbol->vector->rectangles;
    while (rect) {
        fprintf(fsvg, "      <rect x=\"%.2f\" y=\"%.2f\" width=\"%.2f\" height=\"%.2f\" />\n", rect->x, rect->y, rect->width, rect->height);
        rect = rect->next;
    }

    hex = symbol->vector->hexagons;
    while (hex) {
        radius = hex->diameter / 2.0;
        ay = hex->y + (1.0 * radius);
        by = hex->y + (0.5 * radius);
        cy = hex->y - (0.5 * radius);
        dy = hex->y - (1.0 * radius);
        ey = hex->y - (0.5 * radius);
        fy = hex->y + (0.5 * radius);
        ax = hex->x;
        bx = hex->x + (0.86 * radius);
        cx = hex->x + (0.86 * radius);
        dx = hex->x;
        ex = hex->x - (0.86 * radius);
        fx = hex->x - (0.86 * radius);
        fprintf(fsvg, "      <path d=\"M %.2f %.2f L %.2f %.2f L %.2f %.2f L %.2f %.2f L %.2f %.2f L %.2f %.2f Z\" />\n", ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy);
        hex = hex->next;
    }

    circle = symbol->vector->circles;
    while (circle) {
        if (circle->colour) {
            fprintf(fsvg, "      <circle cx=\"%.2f\" cy=\"%.2f\" r=\"%.2f\" fill=\"#%s\" />\n", circle->x, circle->y, circle->diameter / 2.0, symbol->bgcolour);
        } else {
            fprintf(fsvg, "      <circle cx=\"%.2f\" cy=\"%.2f\" r=\"%.2f\" fill=\"#%s\" />\n", circle->x, circle->y, circle->diameter / 2.0, symbol->fgcolour);
        }
        circle = circle->next;
    }

    string = symbol->vector->strings;
    while (string) {
        fprintf(fsvg, "      <text x=\"%.2f\" y=\"%.2f\" text-anchor=\"middle\"\n", string->x, string->y);
        fprintf(fsvg, "         font-family=\"Helvetica\" font-size=\"%.1f\" fill=\"#%s\" >\n", string->fsize, symbol->fgcolour);
        make_html_friendly(string->text, html_string);
        fprintf(fsvg, "         %s\n", html_string);
        fprintf(fsvg, "      </text>\n");
        string = string->next;
    }

    fprintf(fsvg, "   </g>\n");
    fprintf(fsvg, "</svg>\n");

Changes to jni/zint/backend/telepen.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#define SODIUM	"0123456789X"

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#define SODIUM	"0123456789X"

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    "3113131111", "1131111133", "33111133", "111113131111", "3111111133", "111311131111", "131111131111", "111111111133",
    "31311313", "113131111111", "3331111111", "1111311313", "311131111111", "11331313", "13131313", "11111131111111",
    "3133111111", "1131111313", "33111313", "111133111111", "3111111313", "111313111111", "131113111111", "111111111313",
    "313111111111", "1131131113", "33131113", "11113111111111", "3111131113", "113311111111", "131311111111", "111111131113",
    "3113111113", "11311111111111", "331111111111", "111113111113", "31111111111111", "111311111113", "131111111113"
};

int telepen(struct zint_symbol *symbol, unsigned char source[], const size_t src_len) {
    unsigned int i, count, check_digit;
    int error_number;
    char dest[512]; /*14 + 30 * 14 + 14 + 14 + 1 ~ 512 */

    error_number = 0;

    count = 0;







|







53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
    "3113131111", "1131111133", "33111133", "111113131111", "3111111133", "111311131111", "131111131111", "111111111133",
    "31311313", "113131111111", "3331111111", "1111311313", "311131111111", "11331313", "13131313", "11111131111111",
    "3133111111", "1131111313", "33111313", "111133111111", "3111111313", "111313111111", "131113111111", "111111111313",
    "313111111111", "1131131113", "33131113", "11113111111111", "3111131113", "113311111111", "131311111111", "111111131113",
    "3113111113", "11311111111111", "331111111111", "111113111113", "31111111111111", "111311111113", "131111111113"
};

INTERNAL int telepen(struct zint_symbol *symbol, unsigned char source[], const size_t src_len) {
    unsigned int i, count, check_digit;
    int error_number;
    char dest[512]; /*14 + 30 * 14 + 14 + 14 + 1 ~ 512 */

    error_number = 0;

    count = 0;
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
            symbol->text[i] = source[i];
        }
    }
    symbol->text[src_len] = '\0';
    return error_number;
}

int telepen_num(struct zint_symbol *symbol, unsigned char source[], const size_t src_len) {
    unsigned int count, check_digit, glyph;
    int error_number;
    size_t i,temp_length = src_len;
    char dest[1024]; /* 14 + 60 * 14 + 14 + 14 + 1 ~ 1024 */
    unsigned char temp[64];

    count = 0;







|







100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
            symbol->text[i] = source[i];
        }
    }
    symbol->text[src_len] = '\0';
    return error_number;
}

INTERNAL int telepen_num(struct zint_symbol *symbol, unsigned char source[], const size_t src_len) {
    unsigned int count, check_digit, glyph;
    int error_number;
    size_t i,temp_length = src_len;
    char dest[1024]; /* 14 + 60 * 14 + 14 + 14 + 1 ~ 1024 */
    unsigned char temp[64];

    count = 0;
161
162
163
164
165
166
167
168
    /* Stop character */
    strcat(dest, TeleTable['z']);

    expand(symbol, dest);
    ustrcpy(symbol->text, temp);
    return error_number;
}








<
162
163
164
165
166
167
168

    /* Stop character */
    strcat(dest, TeleTable['z']);

    expand(symbol, dest);
    ustrcpy(symbol->text, temp);
    return error_number;
}

Added jni/zint/backend/tests/CMakeLists.txt.




















































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# Copyright (C) 2019 Robin Stuart <rstuart114@gmail.com>
# Adapted from qrencode/tests/CMakeLists.txt
# Copyright (C) 2006-2017 Kentaro Fukuchi <kentaro@fukuchi.org>

cmake_minimum_required (VERSION 3.9)

enable_testing()

set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

set(ZINT_DEBUG FALSE CACHE BOOL "Set debug compile flag")
set(ZINT_SANITIZE FALSE CACHE BOOL "Set sanitize compile/link flags")
set(ZINT_TEST FALSE CACHE BOOL "Set test compile flag")

find_package (LibZint 2.7.0 REQUIRED)
find_package(PNG)

if (PNG_FOUND)
    include_directories(${PNG_INCLUDES})
else (PNG_FOUND)
    add_definitions(-DNO_PNG)
endif (PNG_FOUND)

if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
    if (ZINT_DEBUG)
        add_compile_options("-g")
    endif (ZINT_DEBUG)
    if (ZINT_SANITIZE)
        add_compile_options("-fsanitize=undefined")
        add_compile_options("-fsanitize=address")
        set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fsanitize=address")
    endif (ZINT_SANITIZE)
    if (ZINT_TEST)
        add_definitions("-DZINT_TEST")
    endif (ZINT_TEST)
endif ()

add_library(testcommon
    testcommon.c testcommon.h)
if (PNG_FOUND)
    target_link_libraries(testcommon ZINT::ZINT ${PNG_LIBRARIES})
else (PNG_FOUND)
    target_link_libraries(testcommon ZINT::ZINT)
endif (PNG_FOUND)

macro(zint_add_test test_name test_command)
    set(ADDITIONAL_LIBS "${ARGN}" ${LIBRARY_FLAGS})
    add_executable(${test_command} ${test_command}.c)
    target_link_libraries(${test_command} testcommon ${ADDITIONAL_LIBS})
    add_test(${test_name} ${test_command})
endmacro(zint_add_test)

zint_add_test(channel, test_channel)
zint_add_test(common, test_common)
zint_add_test(composite, test_composite)
zint_add_test(dmatrix, test_dmatrix)
zint_add_test(eci, test_eci)
zint_add_test(gb18030, test_gb18030)
zint_add_test(gb2312, test_gb2312)
zint_add_test(gridmtx, test_gridmtx)
zint_add_test(gs1, test_gs1)
zint_add_test(hanxin, test_hanxin)
zint_add_test(imail, test_imail)
zint_add_test(library, test_library)
zint_add_test(mailmark, test_mailmark)
zint_add_test(maxicode, test_maxicode)
zint_add_test(pdf417, test_pdf417)
zint_add_test(postal, test_postal)
zint_add_test(qr, test_qr)
zint_add_test(raster, test_raster)
zint_add_test(rss, test_rss)
zint_add_test(sjis, test_sjis)
zint_add_test(upcean, test_upcean)
zint_add_test(vector, test_vector)
Added jni/zint/backend/tests/README.






































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Zint backend test suite
-----------------------

To make, first make libzint with ZINT_TEST defined:

  cd <project-dir>
  mkdir build
  cd build
  cmake -DZINT_TEST:BOOL:1 ..
  make

Then make the tests:

  cd <project-dir>
  cd backend/tests
  mkdir build
  cd build
  cmake -DZINT_TEST:BOOL:1 ..
  make

(ZINT_TEST is needed to export INTERNAL functions for use and testing.)

To run all tests:

  make test

To run individual tests, eg:

  ./test_common
  ./test_vector

To make with gcc sanitize, first set for libzint and make:

  cd <project-dir>
  cd build
  cmake -DZINT_SANITIZE:BOOL=1 ..
  make && sudo make install

Then set for tests and make:

  cd <project-dir>
  cd backend/tests/build
  cmake -DZINT_SANITIZE:BOOL=1 ..
  make

Similarly to make with gcc debug:

  cd <project-dir>
  cd build
  cmake -DZINT_DEBUG:BOOL=1 ..
  make && sudo make install

  cd <project-dir>
  cd backend/tests/build
  cmake -DZINT_DEBUG:BOOL=1 ..
  make

To undo sanitize/debug, remake each after setting:

  cmake -DZINT_SANITIZE:BOOL=0 ..
  cmake -DZINT_DEBUG:BOOL=0 ..

To get a clean libzint, set the above and also:

  cmake -DZINT_TEST:BOOL=0 ..

(The tests will now fail to link.)
Added jni/zint/backend/tests/cmake/Modules/FindLibZint.cmake.










































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# - Try to find the Zint barcode library
# Once done this will define
#
#  LIBZINT_FOUND - System has Zint barcode
#  LIBZINT_INCLUDE_DIRS - The Zint barcode include directory
#  LIBZINT_LIBRARIES - The libraries needed to use Zint barcode
#  LIBZINT_DEFINITIONS - Definitions needed to use Zint barcode
#  LIBZINT_VERSION_STRING - the version of Zint barcode found

set (LIBZINT_DEFINITIONS "")

find_path (LIBZINT_INCLUDE_DIR NAMES zint.h)

find_library (LIBZINT_LIBRARY NAMES zint )

if (LIBZINT_LIBRARY AND LIBZINT_INCLUDE_DIR)

  set (LIBZINT_INCLUDE_DIRS ${LIBZINT_INCLUDE_DIR})
  set (LIBZINT_LIBRARIES ${LIBZINT_LIBRARY})
  set (LIBZINT_DEFINITIONS "")

  if (NOT TARGET ZINT::ZINT)

    add_library (ZINT::ZINT UNKNOWN IMPORTED)
    set_target_properties (ZINT::ZINT PROPERTIES
      INTERFACE_COMPILE_DEFINITIONS     "${LIBZINT_DEFINITIONS}"
      INTERFACE_INCLUDE_DIRECTORIES     "${LIBZINT_INCLUDE_DIRS}"
      IMPORTED_LINK_INTERFACE_LANGUAGES "C"
      IMPORTED_LOCATION                 "${LIBZINT_LIBRARY}"
    )

  endif ()

endif ()

if (LIBZINT_INCLUDE_DIR AND EXISTS "${LIBZINT_INCLUDE_DIR}/zint.h")
  file (STRINGS "${LIBZINT_INCLUDE_DIR}/zint.h" ZINT_MAJOR_H REGEX "^#define ZINT_VERSION_MAJOR *[0-9]*")
  file (STRINGS "${LIBZINT_INCLUDE_DIR}/zint.h" ZINT_MINOR_H REGEX "^#define ZINT_VERSION_MINOR *[0-9]*")
  file (STRINGS "${LIBZINT_INCLUDE_DIR}/zint.h" ZINT_MICRO_H REGEX "^#define ZINT_VERSION_RELEASE *[0-9]*")
  string (REGEX REPLACE "^.*VERSION_MAJOR *([0-9]*)" "\\1" ZINT_MAJOR ${ZINT_MAJOR_H})
  string (REGEX REPLACE "^.*VERSION_MINOR *([0-9]*)" "\\1" ZINT_MINOR ${ZINT_MINOR_H})
  string (REGEX REPLACE "^.*VERSION_RELEASE *([0-9]*)" "\\1" ZINT_MICRO ${ZINT_MICRO_H})
  set (LIBZINT_VERSION_STRING ${ZINT_MAJOR}.${ZINT_MINOR}.${ZINT_MICRO})
endif()

# handle the QUIETLY and REQUIRED arguments and set LIBZINT_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LibZint
                                  REQUIRED_VARS LIBZINT_LIBRARY LIBZINT_INCLUDE_DIR
                                  VERSION_VAR LIBZINT_VERSION_STRING)

mark_as_advanced(LIBZINT_INCLUDE_DIR LIBZINT_LIBRARY)
Added jni/zint/backend/tests/data/imail/usps/uspsIMbEncoderTestCases.csv.

more than 10,000 changes

Added jni/zint/backend/tests/data/qr/okapi/version-01.png.

cannot compute difference between binary files

Added jni/zint/backend/tests/data/qr/okapi/version-02.png.

cannot compute difference between binary files

Added jni/zint/backend/tests/data/qr/okapi/version-10.png.

cannot compute difference between binary files

Added jni/zint/backend/tests/test_channel.c.




































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#include "testcommon.h"

static void test_encode(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int option_2;
        int ret_encode;
        float w;
        float h;
        int ret_vector;
    };
    // Vi} :s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { "0", 0, 0, 100, 30, 0 },
        /* 1*/ { "1", 1, 0, 100, 30, 0 },
        /* 2*/ { "26", 2, 0, 100, 30, 0 },
        /* 3*/ { "026", 3, 0, 100, 30, 0 },
        /* 4*/ { "0026", 3, 0, 100, 30, 0 },
        /* 5*/ { "1234", 3, ZINT_ERROR_INVALID_DATA, 100, 30, -1 },
        /* 6*/ { "1234", 4, ZINT_ERROR_INVALID_DATA, 100, 30, -1 },
        /* 7*/ { "292", 4, 0, 100, 30, 0 },
        /* 8*/ { "1234", 5, 0, 100, 30, 0 },
        /* 9*/ { "1234567", 0, 0, 100, 30, 0 },
        /*10*/ { "576688", 7, 0, 100, 30, 0 },
        /*11*/ { "576689", 7, ZINT_ERROR_INVALID_DATA, 100, 30, -1 },
        /*12*/ { "1234567", 0, 0, 100, 30, 0 },
        /*13*/ { "1234567", 8, 0, 100, 30, 0 },
        /*14*/ { "7742863", 8, ZINT_ERROR_INVALID_DATA, 100, 30, -1 },
        /*15*/ { "0000000", 2, 0, 100, 30, 0 },
        /*16*/ { "12345678", 8, ZINT_ERROR_TOO_LONG, 100, 30, -1 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_CHANNEL;
        symbol->option_2 = data[i].option_2;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret_encode);

        if (data[i].ret_vector != -1) {
            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_encode();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_common.c.












































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

static void test_utf8_to_unicode(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int length;
        int disallow_4byte;
        int ret;
        size_t ret_length;
        int expected_vals[20];
        char* comment;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "", -1, 1, 0, 0, {}, "" },
        /*  1*/ { "\000a\302\200\340\240\200", 7, 1, 0, 4, { 0, 'a', 0x80, 0x800 }, "NUL a C280 E0A080" },
        /*  2*/ { "\357\277\277", -1, 1, 0, 1, { 0xFFFF }, "EFBFBF" },
        /*  3*/ { "\360\220\200\200", -1, 1, ZINT_ERROR_INVALID_DATA, -1, {}, "Four-byte F0908080" },
        /*  4*/ { "a\200b", -1, 1, ZINT_ERROR_INVALID_DATA, -1, {}, "Orphan continuation 0x80" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    int vals[20];
    struct zint_symbol symbol;

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        ret = utf8_to_unicode(&symbol, data[i].data, vals, &ret_length, data[i].disallow_4byte);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
        if (ret == 0) {
            assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %ld != %ld\n", i, ret_length, data[i].ret_length);
            for (int j = 0; j < ret_length; j++) {
                assert_equal(vals[j], data[i].expected_vals[j], "i:%d vals[%d] %04X != %04X\n", i, j, vals[j], data[i].expected_vals[j]);
            }
        }
    }

    testFinish();
}

int main()
{
    test_utf8_to_unicode();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_composite.c.






















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

//#define TEST_EXAMPLES_GENERATE_EXPECTED 1
//#define TEST_ODD_NUMBERED_NUMERIC_GENERATE_EXPECTED 1
//#define TEST_EAN128_CC_SHIFT_GENERATE_EXPECTED 1
//#define TEST_EAN128_CC_WIDTH_GENERATE_EXPECTED 1
//#define TEST_ENCODATION_0_GENERATE_EXPECTED 1
//#define TEST_ENCODATION_10_GENERATE_EXPECTED 1
//#define TEST_ENCODATION_11_GENERATE_EXPECTED 1

static void test_eanx_leading_zeroes(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        unsigned char* composite;
        int ret;

        int expected_rows;
        int expected_width;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { BARCODE_EANX_CC, "1", "[21]A12345678", 0, 8, 72 }, // EAN-8
        /* 1*/ { BARCODE_EANX_CC, "12", "[21]A12345678", 0, 8, 72 },
        /* 2*/ { BARCODE_EANX_CC, "123", "[21]A12345678", 0, 8, 72 },
        /* 3*/ { BARCODE_EANX_CC, "1234", "[21]A12345678", 0, 8, 72 },
        /* 4*/ { BARCODE_EANX_CC, "12345", "[21]A12345678", 0, 8, 72 },
        /* 5*/ { BARCODE_EANX_CC, "123456", "[21]A12345678", 0, 8, 72 },
        /* 6*/ { BARCODE_EANX_CC, "1234567", "[21]A12345678", 0, 8, 72 },
        /* 7*/ { BARCODE_EANX_CC, "12345678", "[21]A12345678", 0, 7, 99 }, // EAN-13
        /* 8*/ { BARCODE_EANX_CC, "1+12", "[21]A12345678", 0, 8, 101 }, // EAN-8 + EAN-2
        /* 9*/ { BARCODE_EANX_CC, "12+12", "[21]A12345678", 0, 8, 101 },
        /*10*/ { BARCODE_EANX_CC, "123+12", "[21]A12345678", 0, 8, 101 },
        /*11*/ { BARCODE_EANX_CC, "1234+12", "[21]A12345678", 0, 8, 101 },
        /*12*/ { BARCODE_EANX_CC, "12345+12", "[21]A12345678", 0, 8, 101 },
        /*13*/ { BARCODE_EANX_CC, "123456+12", "[21]A12345678", 0, 8, 101 },
        /*14*/ { BARCODE_EANX_CC, "1234567+12", "[21]A12345678", 0, 8, 101 },
        /*15*/ { BARCODE_EANX_CC, "12345678+12", "[21]A12345678", 0, 7, 128 }, // EAN-13 + EAN-2
        /*16*/ { BARCODE_EANX_CC, "1+123", "[21]A12345678", 0, 8, 128 }, // EAN-8 + EAN-5
        /*17*/ { BARCODE_EANX_CC, "12+123", "[21]A12345678", 0, 8, 128 },
        /*18*/ { BARCODE_EANX_CC, "123+123", "[21]A12345678", 0, 8, 128 },
        /*19*/ { BARCODE_EANX_CC, "1234+123", "[21]A12345678", 0, 8, 128 },
        /*20*/ { BARCODE_EANX_CC, "12345+123", "[21]A12345678", 0, 8, 128 },
        /*21*/ { BARCODE_EANX_CC, "123456+123", "[21]A12345678", 0, 8, 128 },
        /*22*/ { BARCODE_EANX_CC, "1234567+123", "[21]A12345678", 0, 8, 128 },
        /*23*/ { BARCODE_EANX_CC, "12345678+123", "[21]A12345678", 0, 7, 155 }, // EAN-13 + EAN-5
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        int length = strlen(data[i].data);
        assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
        strcpy(symbol->primary, data[i].data);

        int composite_length = strlen(data[i].composite);

        ret = ZBarcode_Encode(symbol, data[i].composite, composite_length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
        assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows);
        assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_helper_generate(const struct zint_symbol* symbol, int ret, int i, unsigned char* data, unsigned char* composite, int option_1, int option_2, int option_3, char* comment)
{
    if (ret == 0) {
        printf("        /*%2d*/ { %s, \"%s\", \"%s\", %d, %d, %d, %d, %d, %d, \"%s\",\n",
                i, testUtilBarcodeName(symbol->symbology), data, composite, option_1, option_2, option_3, ret, symbol->rows, symbol->width, comment);
        testUtilModulesDump(symbol, "                    ", "\n");
        printf("               },\n");
    } else {
        printf("        /*%2d*/ { %s, \"%s\", \"%s\", %d, %d, %d, %s, %d, %d, \"%s\", \"\" },\n",
                i, testUtilBarcodeName(symbol->symbology), data, composite, option_1, option_2, option_3, testUtilErrorName(ret), symbol->rows, symbol->width, comment);
    }
}

// Replicate examples from GS1 General Specifications 19.1 and ISO/IEC 24723:2010
static void test_examples(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        unsigned char* composite;
        int option_1;
        int option_2;
        int option_3;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        unsigned char* expected;
    };
    // Verified manually against GS1 General Specifications 19.1 and ISO/IEC 24723:2010, with noted exceptions
    struct item data[] = {
        /* 0*/ { BARCODE_RSS14_OMNI_CC, "0401234567890", "[17]050101[10]ABC123", 1, 0, 0, 0, 11, 56, "Figure 5.1-5. GS1 DataBar Stacked Omnidirectional barcode with a Composite Component",
                    "01101100110101110001001100001000000110100111011110101001"
                    "01101101110110001100010100001100001000010110011100101001"
                    "01101101100111000101110001101001100011111010011101101001"
                    "01101101000110111100010011001111110100111011011101001001"
                    "01101001000111110111110100101010100000010000011101001101"
                    "00000000100110111010100000101010101100110001100000000000"
                    "01001111011001000100011111000001010011001110011010000000"
                    "00000000100110111010100000101010101100110001100000000000"
                    "00000101010101010101010101010101010101010101010000000000"
                    "00001000110000101010000000101010111011001111000000000000"
                    "10100111001111010101111111000001000100110000110101000000"
               },
        /* 1*/ { BARCODE_RSS_LTD_CC, "1311234567890", "[17]010615[10]A123456", 1, 0, 0, 0, 6, 74, "Figure 5.9.2-1. GS1 DataBar Limited Composite symbol with CC-A",
                    "01111000101101100010100110001111101001100111011101001111001110111010011010"
                    "01001111100011010010101110001111011110101111010011110111001110111010111010"
                    "01001100110100000010101100001110010001101111011110111100101000111010110010"
                    "01111000101010000010100100001011101101111110011100110011100100111010100010"
                    "00000011000001010100110011101010110101001100101011110001011001101001110000"
                    "01011100111110101011001100010101001010110011010100001110100110010110000101"
               },
        /* 2*/ { BARCODE_EAN128_CC, "[01]03812345678908", "[10]ABCD123456[410]3898765432108", 3, 0, 0, 0, 7, 154, "Figure 5.9.2-2. GS1-128 Composite symbol with CC-C **NOT SAME** (uses encodation '10')",
                    "1111111101010100011110101011110000111101011001111101110111110111010010000010000100010110010000101100001111011110110011011110101001111000111111101000101001"
                    "1111111101010100011111101010001110100001000111101001100101110010000011100001011000100100100111110110001011100001011111011111101010111000111111101000101001"
                    "1111111101010100011101010011111100110001111010001101000101011110000010001111101100010111101101111101001001011000111110011101010001111110111111101000101001"
                    "1111111101010100010101111001111000110010011001110001111010100111100010011110111101000110000110001000101100001011101111011111010111111010111111101000101001"
                    "1111111101010100011101011100001100101000111111011101011110001001111011111011001000100111100111011101001101101111001000011101011100110000111111101000101001"
                    "0000000001011000110000101000100110010011011011001110110100001100010010001010001001110111101001100100100001011100110110100001000100100001001001110001010000"
                    "0000000110100111001111010111011001101100100100110001001011110011101101110101110110001000010110011011011110100011001001011110111011011110110110001110101100"
               },
        /* 3*/ { BARCODE_EANX_CC, "331234567890", "[21]1234-abcd", 1, 0, 0, 0, 7, 99, "Figure 5.9.8-1. EAN-13 symbol with a four-column CC-A component (note [21] not [99])",
                    "110110111011010000100000110100110011101100001001110100100001011001100001100111000110001011011000101"
                    "110110110011000110111100010111011001110000101001100100100000010111101001101011100010000011001000101"
                    "110110100010011010001110000111111010001100101001100110111111010001101001010000011011111011101000101"
                    "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010"
                    "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"
                    "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010"
                    "000101011110100110010011011010000100111010110001010101010000100010010010001110100111001010000101010"
               },
        /* 4*/ { BARCODE_UPCA_CC, "61414101234", "[91]abcdefghijklmnopqrstuvwxyz", 2, 0, 0, 0, 14, 99, "Figure 5.9.8-2. UPC-A symbol with a four-column CC-B component **NOT SAME** (using [91] not [10] as length > 20 max for [10])",
                    "110001001010000001110010110110011111101100101001111010100100101111000001110101001111110011000100101"
                    "111001001011101110101000000111101101000111001011111010100011000110000101110011010000110011100100101"
                    "111101001011110110001101000111101000100000101011110010101001111001000001011111010001110011110100101"
                    "111101011011110100111100010111011111001011001011110110111110001001110101011111001110011011110101101"
                    "111101010010001100011100110111001000010011101001110110100011011010000001001100000110001011110101001"
                    "111001010010000001011110100111100110110100001001110100111001011000010001111010010100000011100101001"
                    "111011010010011111101110100101110001000011001001100100100011110010000101011110000110011011101101001"
                    "111010010011100011101000100100001011011000001001100110110001110110100001000110011101100011101001001"
                    "111010011010110111111011000101111101100111101001000110110100111100001101111100001101010011101001101"
                    "111010111010111000001000110110111110010001001001000010111100101111101101000110001000111011101011101"
                    "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010"
                    "001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"
                    "000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010"
                    "000101010111100110010100011001100101000110011001010101110010110011011011001000010101110010000101010"
               },
        /* 5*/ { BARCODE_EANX_CC, "1234567", "[21]A12345678", -1, 0, 0, 0, 8, 72, "Figure 5.9.8-3. EAN-8 symbol with a three-column CC-A",
                    "101001111000001001010011000111110101110111101001101001111110011101001101"
                    "111110010011100101010111000101110011011100001111110100011001011101011101"
                    "110011001000010001010110000101000001000010001001000110110000011101011001"
                    "101011110010000001010010000111011100111101001111001001000010011101010001"
                    "000010000000000000000000000000000000000000000000000000000000000000000010"
                    "000100000000000000000000000000000000000000000000000000000000000000000001"
                    "000010000000000000000000000000000000000000000000000000000000000000000010"
                    "000010100110010010011011110101000110101010011101010000100010011100101010"
               },
        /* 6*/ { BARCODE_UPCE_CC, "121230", "[15]021231", 1, 0, 0, 0, 9, 55, "Figure 5.9.8-4. UPC-E symbol with a two-column CC-A",
                    "1101100110111010011111010001100111100010110011110101001"
                    "1101101110110010010000110001101000011011100011100101001"
                    "1101101100111101001000000101000101111000010011101101001"
                    "1101101000111011110100011101001110011011100011101001001"
                    "1101001000111000010110111101001110001110010011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010110011001001100110010011011011110101001110101010"
               },
        /* 7*/ { BARCODE_RSS14_CC, "0361234567890", "[11]990102", 1, 0, 0, 0, 5, 100, "Figure 5.9.8-5. GS1 DataBar Omnidirectional symbol with a four-column CC-A",
                    "1101101110110000101000110001111001010111100010011101001110011101100110011001001100111000110110001010"
                    "1101101100110111011111001001000011010111111010011001001101000000111010010010111111001110110010001010"
                    "1101101000110010010111110001011001101111000010011001101111010011110010010000011001011100111010001010"
                    "0000000000010110001110100000000101001011010111111011001101010000011010000000010100101000110011110000"
                    "0000010011101001110001001111111000010100101000000100110010101111100101111111100011010111001100001101"
               },
        /* 8*/ { BARCODE_RSS14STACK_CC, "0341234567890", "[17]010200", 1, 0, 0, 0, 9, 56, "Figure 5.9.8-6. GS1 DataBar Stacked symbol with a two-column CC-A",
                    "01101100110101110011100111101010000100001111011110101001"
                    "01101101110110110001000010001110111101100100011100101001"
                    "01101101100110100001111011001111110011010110011101101001"
                    "01101101000100110000101110001011100000110111011101001001"
                    "01101001000101110111110111001001100110100000011101001101"
                    "00000001011011100010000010101010100000101101010000000000"
                    "01001110100100011101111100000001011111010010100010000000"
                    "00000011010111101010000010101010101001001101010000000000"
                    "10101100111000010101111111110111000110110011100101000000"
               },
        /* 9*/ { BARCODE_RSS_LTD_CC, "0351234567890", "[91]abcdefghijklmnopqrstuv", 2, 0, 0, 0, 17, 83, "Figure 5.9.8-7. GS1 DataBar Limited symbol with a three-column CC-B **NOT SAME** (using [91] not [21] as length > 20 max for [21])",
                    "11011101001110111110111010010110001001000001000010001011111011010011110110111010010"
                    "11011001001111110101001110010110001101111011000011001010100001111000100110110010010"
                    "11011001101001111000010010010100001101110111001011110011011100100011100110110011010"
                    "11011011101110100000100111010100011101110100001001110010000110011001000110110111010"
                    "11011011001111010010000001010100011001000110111110010011111011001000100110110110010"
                    "11011010001011111001110011010100111001011111000111011010001010000111100110110100010"
                    "11010010001000110110100000010100110001000100000010001011010111000111100110100100010"
                    "11010110001010011111100111010101110001111010010100000011101011001000000110101100010"
                    "11010111001011111000011001010101100001100011110001011011111101001101000110101110010"
                    "11010111101100010000100011010100100001100010010110000010001000010100000110101111010"
                    "11010011101000001001111001010110100001111001010000010011110100001000100110100111010"
                    "11010011001100111001001110010010100001011000111011111010000110001001110110100110010"
                    "11010001001011110001111010010010110001100001000010110010100001100011000110100010010"
                    "11010001101110110111000001010010111001101000011100001011110110111001100110100011010"
                    "11010000101111101001110100010110111001001011000111110010111110111000110110100001010"
                    "00000000000001111011100011010001110101010110101001100101110100100111000110101110000"
                    "00000000001010000100011100101110001010101001010110011010001011011000111001010000101"
               },
        /*10*/ { BARCODE_RSS_EXP_CC, "[01]93712345678904[3103]001234", "[91]1A2B3C4D5E", 1, 0, 0, 0, 5, 151, "Figure 5.9.8-8. GS1 DataBar Expanded symbol with a four-column CC-A",
                    "0011011011101110011010011000011100011100110110100111010011010001000011000101101110011000001101100010100000000000000000000000000000000000000000000000000"
                    "0011011011001101110111110100011010001111001100100110010010111111001001100100101111110011101100100010100000000000000000000000000000000000000000000000000"
                    "0011011010001010111011111100011111011011110010100110011011000011010011110100001011001111101110100010100000000000000000000000000000000000000000000000000"
                    "0000011011111011000100000000101001010000011101001110100110001100111001000010101000011010001110001000100001010000111001010000001010010111000110010110000"
                    "0101100100000100111011111111000010101111100010110001011001110011000010111100000011100101110001110111011110101111000110001111110000101000111001101000010"
               },
        /*11*/ { BARCODE_EAN128_CC, "[01]03212345678906", "[21]A1B2C3D4E5F6G7H8", 1, 0, 0, 0, 6, 145, "Figure 5.9.8-9. GS1-128 symbol with a four-column CC-A",
                    "0000000000000000000001101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010000000000000000000000000"
                    "0000000000000000000001101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010000000000000000000000000"
                    "0000000000000000000001101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010000000000000000000000000"
                    "0000000000000000000001101011110111000111011011001110010001011100010111000101011000011100110010000100000100010110111101010000000000000000000000000"
                    "0010110001100001010001001100100110110110011100100011011000100100010100010011101111010011001001000010110011011100010100001000100010010011100010100"
                    "1101001110011110101110110011011001001001100011011100100111011011101011101100010000101100110110111101001100100011101011110111011101101100011101011"
               },
        /*12*/ { BARCODE_RSS_EXPSTACK_CC, "[01]00012345678905[10]ABCDEF", "[21]12345678", 1, 0, 0, 0, 13, 102, "24723:2010 Figure 10 — A GS1 DataBar Expanded Stacked Composite symbol (with CC-A)",
                    "001101101110110100001000001101001100111011000010011101001000110011100110010100111011100000110110001010"
                    "001101101100101111110100011001111101101000001010011001001011111011011110011010111000100000110010001010"
                    "001101101000100101001111000001000111011101111010011001101011110110110000011010001011111000111010001010"
                    "000001000111011100010000000010100100001101100000101010000110010000010100000111111001110100111100100000"
                    "010110111000100011101111111100001011110010011111010101111001101111101011111000000110001011000011011101"
                    "000001000111011100010000000010100100001101100000101010000110010000010100000101010001110100111100100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000000110001000010100001000000001010010000001000110101111011001110001001010000001010000101001000010000"
                    "101111001110111101011100111111110101101111110111001010000100110001110100001111110001111010110111100010"
                    "000000110001000010100001000000001010010000001000110101111011001110001001010000001010000101001000010000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000000111001111101010100001010100101011111000010100000000000000000000000000000000000000000000000000000"
                    "010111000110000010100011110000001010100000111101000100000000000000000000000000000000000000000000000000"
               },
        /*13*/ { BARCODE_EAN128_CC, "[00]030123456789012340", "[02]13012345678909[37]24[10]1234567ABCDEFG", 3, 0, 0, 0, 7, 174, "24723:2010 Figure 12 — A GS1-128 Composite symbol (with CC-C)",
                    "111111110101010001111010101111000011010111011110000111011111011101001000001000010001011110101100111110111010010001110001000100011000011011111010100111110111111101000101001000"
                    "111111110101010001111110101000111010000100111101000110011110101111101111010001010000011111000110010100111001011100011001001001111101100011111101010111000111111101000101001000"
                    "111111110101010001010100011110000011001111100001010110100010111110001110111101011100011000001101011110101111001000000101100001011111101011101010001111110111111101000101001000"
                    "111111110101010001010111100111100011110100001011110101011111011111001101010000110000011010011100011110101111001111010001100011101101000011101001011100000111111101000101001000"
                    "111111110101010001110101110000110011111010100011000100100001111000101110000001011001011110010110001100111100101101100001111011000110100011101011100110000111111101000101001000"
                    "000000000101100011000010100010010011001101101100111001100100110001001000101000100111011110100110010010000100110010011000100100010011101011101000010001000100001010011100010100"
                    "000000011010011100111101011101101100110010010011000110011011001110110111010111011000100001011001101101111011001101100111011011101100010100010111101110111011110101100011101011"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->option_1 = data[i].option_1;
        symbol->option_2 = data[i].option_2;
        symbol->option_3 = data[i].option_3;
        int length = strlen(data[i].data);
        assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
        strcpy(symbol->primary, data[i].data);

        int composite_length = strlen(data[i].composite);

        ret = ZBarcode_Encode(symbol, data[i].composite, composite_length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_EXAMPLES_GENERATE_EXPECTED
        test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment);
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data);

        if (ret == 0) {
            int width, row;
            ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
            assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_odd_numbered_numeric(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        unsigned char* composite;
        int option_1;
        int option_2;
        int option_3;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        unsigned char* expected;
    };
    // Verified manually against tec-it.com and bwipp
    struct item data[] = {
        /* 0*/ { BARCODE_UPCE_CC, "1234567", "[91]1234567890123", 1, 0, 0, 0, 9, 55, "Test odd-numbered numeric, 1st fit, 9-bit remainder, 7-bit final, 2-bit alphanumeric latch, no padding",
                    "1101100110111011101011110001001111100110010011110101001"
                    "1101101110110001100001000101100010000100110011100101001"
                    "1101101100111110001001001101100100111110111011101101001"
                    "1101101000110101100011111101100111110100100011101001001"
                    "1101001000110111000110001001010001100001100011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 1*/ { BARCODE_UPCE_CC, "1234567", "[91]12345678901234", 1, 0, 0, 0, 9, 55, "Test even-numbered numeric, 1st fit, 2-bit remainder, 2-bit alphanumeric latch, no padding",
                    "1101100110111011101011110001001111100110010011110101001"
                    "1101101110110001100001000101100010000100110011100101001"
                    "1101101100111110001001001101100100111001000011101101001"
                    "1101101000101000010011110001101101001111000011101001001"
                    "1101001000100011101110010001011100011101000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 2*/ { BARCODE_UPCE_CC, "1234567", "[91]123456789012345", 1, 0, 0, 0, 10, 55, "Test odd-numbered numeric, 2nd fit, alphanumeric latch, padding",
                    "1100100010111100110100111001011101110001000011100101101"
                    "1110100010110001011101000001000111010111110011000101101"
                    "1110110010110101100111111001000111100001001011000101001"
                    "1100110010100100000010010001010000010000100011001101001"
                    "1101110010111111010101110001110101110000110011011101001"
                    "1101111010110000111101001101100011110110111011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 3*/ { BARCODE_UPCE_CC, "1234567", "[91]ABCD12345678901", 1, 0, 0, 0, 10, 55, "Test odd-numbered numeric, 1st fit, 4-bit final, no alphanumeric latch or padding",
                    "1100100010111100110100111001110101110111110011100101101"
                    "1110100010101111100110111101111000001000101011000101101"
                    "1110110010110111100001001101101000111111001011000101001"
                    "1100110010101000110011000001111101101011110011001101001"
                    "1101110010110101111000011001111000001001010011011101001"
                    "1101111010100010000010111101011100000100011011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 4*/ { BARCODE_UPCE_CC, "1234567", "[91]ABCDE123456789", 1, 0, 0, 0, 10, 55, "Test odd-numbered numeric, 1st fit, 5-bit final, no alphanumeric latch or padding",
                    "1100100010111100110100111001110101110111110011100101101"
                    "1110100010101111100110111101100000100011101011000101101"
                    "1110110010100110000010111001111101011110011011000101001"
                    "1100110010100011000110000101111101110101110011001101001"
                    "1101110010110100011111011101000111100101111011011101001"
                    "1101111010110111101000110001100011001011110011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 5*/ { BARCODE_UPCE_CC, "1234567", "[91]1234567890123456789", 1, 0, 0, 0, 10, 55, "Test odd-numbered numeric, 1st fit, 7-bit final, no alphanumeric latch or padding",
                    "1100100010111100110100111001011101110001000011100101101"
                    "1110100010110001011101000001000111010111110011000101101"
                    "1110110010110101100111111001000111100001001011000101001"
                    "1100110010111100100010111101100100010110000011001101001"
                    "1101110010111110010110011101110000100110100011011101001"
                    "1101111010111111011001110101011100001001100011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 6*/ { BARCODE_UPCE_CC, "1234567", "[91]1234A", 1, 0, 0, 0, 9, 55, "Test even-numbered numeric, ending in non-digit",
                    "1101100110111011101011110001001111100110010011110101001"
                    "1101101110100001000100001001110110011001110011100101001"
                    "1101101100100101111100110001000001011111011011101101001"
                    "1101101000110001001001111101011111011001000011101001001"
                    "1101001000100110001100000101110110000010110011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 7*/ { BARCODE_UPCE_CC, "1234567", "[91]12345A", 1, 0, 0, 0, 9, 55, "Test odd-numbered numeric, ending in non-digit",
                    "1101100110111011101011110001001111100110010011110101001"
                    "1101101110100111011100100001100010110001110011100101001"
                    "1101101100100100011111001101111101001101110011101101001"
                    "1101101000101111100110010001011111000110001011101001001"
                    "1101001000100111000111010001011000011000100011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->option_1 = data[i].option_1;
        symbol->option_2 = data[i].option_2;
        symbol->option_3 = data[i].option_3;
        int length = strlen(data[i].data);
        assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
        strcpy(symbol->primary, data[i].data);

        int composite_length = strlen(data[i].composite);

        ret = ZBarcode_Encode(symbol, data[i].composite, composite_length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_ODD_NUMBERED_NUMERIC_GENERATE_EXPECTED
        test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment);
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data);

        if (ret == 0) {
            int width, row;
            ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
            assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_ean128_cc_shift(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        unsigned char* composite;
        int option_1;
        int option_2;
        int option_3;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        unsigned char* expected;
    };
    // Verified manually with bwipp (tec-it.com seems to be off by 2 for top shifts > 1)
    struct item data[] = {
        /* 0*/ { BARCODE_EAN128_CC, "[91]A", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 100, "CC-A alignment, bottom shift 10",
                    "1101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010"
                    "1101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010"
                    "1101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010"
                    "1101011110111000111011011001110010001011100010111000101011000011100110010000100000100010110111101010"
                    "0000000000001011011110000101000100011010011011000110010101110011101000100001011001110110011100010100"
                    "0000000000110100100001111010111011100101100100111001101010001100010111011110100110001001100011101011"
               },
        /* 1*/ { BARCODE_EAN128_CC, "[91]AB", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 101, "CC-A alignment, top shift 1",
                    "01101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010"
                    "01101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010"
                    "01101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010"
                    "01101011110111000111011011001110010001011100010111000101011000011100110010000100000100010110111101010"
                    "00101101111000010100010001101001101100011001010111001110111010011101000100001010011110110011100010100"
                    "11010010000111101011101110010110010011100110101000110001000101100010111011110101100001001100011101011"
               },
        /* 2*/ { BARCODE_EAN128_CC, "[91]ABC", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 112, "CC-A alignment, top shift 12",
                    "0000000000001101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010"
                    "0000000000001101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010"
                    "0000000000001101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010"
                    "0000000000001101011110111000111011011001110010001011100010111000101011000011100110010000100000100010110111101010"
                    "0010110111100001010001000110100110110001100101011100111011101001110111011100101000100001010011110110011100010100"
                    "1101001000011110101110111001011001001110011010100011000100010110001000100011010111011110101100001001100011101011"
               },
        /* 3*/ { BARCODE_EAN128_CC, "[91]ABCD", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 123, "CC-A alignment, top shift 10",
                    "000000000011010010001101000010000011011010111101111100100100011010100000100100000111011101000100001110110010100000000000000"
                    "000000000011010110001101011110011000011110100011011000100100001011110000110011010111001011000010001100110010100000000000000"
                    "000000000011010111001000110011001111010110001011100000101100001010011001100111100110111100110011101101110010100000000000000"
                    "000000000011010111101110001110110110011100100010111000101110001010110000111001100100001000001000101101111010100000000000000"
                    "001011011110000101000100011010011011000110010101110011101110100111011101110010100111011101000100001001101101110011100010100"
                    "110100100001111010111011100101100100111001101010001100010001011000100010001101011000100010111011110110010010001100011101011"
               },
        /* 4*/ { BARCODE_EAN128_CC, "[91]ABCDEF", "[21]A1B2C3D4E5F6G7H8", -1, 0, 0, 0, 6, 145, "CC-A alignment, top shift 21",
                    "0000000000000000000001101001000110100001000001101101011110111110010010001101010000010010000011101110100010000111011001010000000000000000000000000"
                    "0000000000000000000001101011000110101111001100001111010001101100010010000101111000011001101011100101100001000110011001010000000000000000000000000"
                    "0000000000000000000001101011100100011001100111101011000101110000010110000101001100110011110011011110011001110110111001010000000000000000000000000"
                    "0000000000000000000001101011110111000111011011001110010001011100010111000101011000011100110010000100000100010110111101010000000000000000000000000"
                    "0010110111100001010001000110100110110001100101011100111011101001110111011100101001110111011100101110111001110101000100001001000110110011100010100"
                    "1101001000011110101110111001011001001110011010100011000100010110001000100011010110001000100011010001000110001010111011110110111001001100011101011"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->option_1 = data[i].option_1;
        symbol->option_2 = data[i].option_2;
        symbol->option_3 = data[i].option_3;
        int length = strlen(data[i].data);
        assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
        strcpy(symbol->primary, data[i].data);

        int composite_length = strlen(data[i].composite);

        ret = ZBarcode_Encode(symbol, data[i].composite, composite_length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_EAN128_CC_SHIFT_GENERATE_EXPECTED
        test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment);
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data);

        if (ret == 0) {
            int width, row;
            ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
            assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_ean128_cc_width(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        unsigned char* composite;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
    };
    // Verified manually with bwipp (except very large tests)
    struct item data[] = {
        /* 0*/ { "[91]1", "[02]13012345678909", 0, 11, 103, "" },
        /* 1*/ { "[91]12", "[02]13012345678909", 0, 20, 86, "" },
        /* 2*/ { "[91]123", "[02]13012345678909", 0, 11, 108, "" },
        /* 3*/ { "[91]123A", "[02]13012345678909", 0, 8, 120, "" },
        /* 4*/ { "[91]123A1", "[02]13012345678909", 0, 7, 137, "" },
        /* 5*/ { "[91]123A12", "[02]13012345678909", 0, 7, 141, "" },
        /* 6*/ { "[91]123A123", "[02]13012345678909", 0, 6, 154, "" },
        /* 7*/ { "[91]123A1234", "[02]13012345678909", 0, 6, 154, "" },
        /* 8*/ { "[91]123A1234A", "[02]13012345678909", 0, 5, 174, "" },
        /* 9*/ { "[91]123A1234A1", "[02]13012345678909", 0, 5, 188, "" },
        /*10*/ { "[91]123A1234A12", "[02]13012345678909", 0, 5, 205, "" },
        /*11*/ { "[00]123456789012345678", "[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[91]1234567890", 0, 32, 579, "With composite 2372 digits == max" },
        /*12*/ { "[00]123456789012345678", "[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[00]123456789012345678[91]12345678901", ZINT_ERROR_TOO_LONG, 0, 0, "With composite 2373 digits > max" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_EAN128_CC;
        symbol->option_1 = 3;
        int length = strlen(data[i].data);
        assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
        strcpy(symbol->primary, data[i].data);

        int composite_length = strlen(data[i].composite);

        ret = ZBarcode_Encode(symbol, data[i].composite, composite_length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_EAN128_CC_WIDTH_GENERATE_EXPECTED
        printf("        /*%2d*/ { \"%s\", \"%s\", %s, %d, %d, \"%s\" },\n",
                i, data[i].data, data[i].composite, testUtilErrorName(ret), symbol->rows, symbol->width, data[i].comment);
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

// Test general-purpose data compaction
static void test_encodation_0(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        unsigned char* composite;
        int option_1;
        int option_2;
        int option_3;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        unsigned char* expected;
    };
    // Verified manually against tec-it.com (with noted exception) and/or bwipp
    struct item data[] = {
        /* 0*/ { BARCODE_UPCE_CC, "1234567", "[91]1", 1, 0, 0, 0, 9, 55, "Single numeric",
                    "1101100110111101110101111101010001000111100011110101001"
                    "1101101110111011000010001101110010101110000011100101001"
                    "1101101100110001011111011101111010000100100011101101001"
                    "1101101000100111011100111101110011110101110011101001001"
                    "1101001000110011001000000101110100011011110011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 1*/ { BARCODE_UPCE_CC, "1234567", "[91]12", 1, 0, 0, 0, 9, 55, "2 numerics",
                    "1101100110111011101011110001101111110110010011110101001"
                    "1101101110101110011110011001001100110000100011100101001"
                    "1101101100100101111010000001101000001110100011101101001"
                    "1101101000110010010001111101011000011001111011101001001"
                    "1101001000110010000010011001101001000110000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 2*/ { BARCODE_UPCE_CC, "1234567", "[91]123", 1, 0, 0, 0, 9, 55, "Odd-numbered numeric",
                    "1101100110111011101011110001000111100010001011110101001"
                    "1101101110100111000111001001101000010001100011100101001"
                    "1101101100110101110001000001111010001000001011101101001"
                    "1101101000101000010000111101110011111100101011101001001"
                    "1101001000101100011100001101101110110010000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 3*/ { BARCODE_UPCE_CC, "1234567", "[91]1234", 1, 0, 0, 0, 9, 55, "Even-numbered numeric",
                    "1101100110111011101011110001001111100110010011110101001"
                    "1101101110110001100110011001101100100000010011100101001"
                    "1101101100101111101001110001001110010111110011101101001"
                    "1101101000111000110101111101000011110101000011101001001"
                    "1101001000110101101110000001001101110001100011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 4*/ { BARCODE_UPCE_CC, "1234567", "[20]12[91]12", 1, 0, 0, 0, 9, 55, "Fixed len + even-numbered numeric",
                    "1101100110111111010001100101001111010001000011110101001"
                    "1101101110100011001110011001110010000010111011100101001"
                    "1101101100101111000101111001111010010001000011101101001"
                    "1101101000110011110100110001110100011111001011101001001"
                    "1101001000111100100101111001101001101110000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 5*/ { BARCODE_UPCE_CC, "1234567", "[20]12[91]123", 1, 0, 0, 0, 9, 55, "Fixed len + odd-numbered numeric",
                    "1101100110111111010001100101001111010001000011110101001"
                    "1101101110100011001110011001100001101000100011100101001"
                    "1101101100101110010001111101111000010001010011101101001"
                    "1101101000110011110010110001100111101000110011101001001"
                    "1101001000100001101100100001110010001000111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 6*/ { BARCODE_UPCE_CC, "1234567", "[91]A1234567C", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 7 digits and alphanumeric",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110111001001011100001110010001011100011100101001"
                    "1101101100111000001000110101001011111100111011101101001"
                    "1101101000111101011110001001001111000010001011101001001"
                    "1101001000101000001100011001010001000010000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 7*/ { BARCODE_UPCE_CC, "1234567", "[91]A123456C", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 6 digits and alphanumeric",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110111001001011100001110010001011100011100101001"
                    "1101101100111000011001110101111110011010110011101101001"
                    "1101101000100110100011100001000100110111110011101001001"
                    "1101001000100000100010010001000001011011000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 8*/ { BARCODE_UPCE_CC, "1234567", "[91]A12345B", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 5 digits and alphanumeric",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110110011101100100001110110001000110011100101001"
                    "1101101100101111100110111101111110100101110011101101001"
                    "1101101000111111010011000101100101100111111011101001001"
                    "1101001000110100010110000001000100010000001011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 9*/ { BARCODE_UPCE_CC, "1234567", "[91]A1234567", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 7 digits, terminating",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110111001001011100001111001000101111011100101001"
                    "1101101100111101011001100001111100110001010011101101001"
                    "1101101000111110010011100101110100011111001011101001001"
                    "1101001000110101100011100001101110110000100011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*10*/ { BARCODE_UPCE_CC, "1234567", "[91]A123456", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 6 digits, terminating",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110111001001011100001110010001011100011100101001"
                    "1101101100111100000100010101001111101000111011101101001"
                    "1101101000100110001001110001011100110111000011101001001"
                    "1101001000110110000010000101100110010010000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*11*/ { BARCODE_UPCE_CC, "1234567", "[91]A12345", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 5 digits, terminating",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110111001001011100001111001000101111011100101001"
                    "1101101100111000101110001101001111001011110011101101001"
                    "1101101000111010011111101101100111110010001011101001001"
                    "1101001000111000100010011101000101110011100011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*12*/ { BARCODE_UPCE_CC, "1234567", "[91]A1234", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 4 digits, terminating",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110111001001011100001110110010011000011100101001"
                    "1101101100111100110111001101011111101011000011101101001"
                    "1101101000101111001100011001000001010001111011101001001"
                    "1101001000110111011000100001110000100100111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*13*/ { BARCODE_UPCE_CC, "1234567", "[91]A123", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 3 digits, terminating",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110110011101100100001001000111001110011100101001"
                    "1101101100100101111100110001011101001111100011101101001"
                    "1101101000110111110000100101001111000001010011101001001"
                    "1101001000110010100001100001110010001101111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*14*/ { BARCODE_UPCE_CC, "1234567", "[91]A123[10]C", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 3 digits, 2-digit AI (3 numerics including FNC1) and alphanumeric",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110111001001011100001100010101100000011100101001"
                    "1101101100110100001110010001110111101111101011101101001"
                    "1101101000101110001100111001001110010011000011101001001"
                    "1101001000101100111001100001100100111001111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*15*/ { BARCODE_UPCE_CC, "1234567", "[91]A12[10]C", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 2 digits, 2-digit AI (3 numerics including FNC1) and alphanumeric",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110110011101100100001000001001010000011100101001"
                    "1101101100111110110100001001111110111101101011101101001"
                    "1101101000100110010000011101100111000010111011101001001"
                    "1101001000110110001000100001101100100000010011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*16*/ { BARCODE_UPCE_CC, "1234567", "[91]A12[10]1", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 2 digits, 2-digit AI (3 numerics including FNC1) and 1 digit, terminating",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110111100100101111001000010000110110011100101001"
                    "1101101100100100011110010001001110010111110011101101001"
                    "1101101000111101111010111101000100100111100011101001001"
                    "1101001000111101110010011001001000001101100011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*17*/ { BARCODE_UPCE_CC, "1234567", "[91]A1[10]1", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 1 digit, 2-digit AI (3 numerics including FNC1) and 1 digit, terminating; **NOT SAME** as tec-it.com, which does not switch to numeric mode after 'A'; same as bwipp",
                    "1101100110111011101011110001011100010001100011110101001"
                    "1101101110110010011001110001110010010011100011100101001"
                    "1101101100111110110001001001010111111000111011101101001"
                    "1101101000111011110010011101011101100111000011101001001"
                    "1101001000110100001101110001000001010100000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*18*/ { BARCODE_UPCE_CC, "1234567", "[91]A[10]1", 1, 0, 0, 0, 9, 55, "Alphanumeric followed by 2-digit AI (3 numerics including FNC1) and 1 digit, terminating",
                    "1101100110111011101011110001101110001000111011110101001"
                    "1101101110111001100010110001100010000010110011100101001"
                    "1101101100101111110010011001001101111110110011101101001"
                    "1101101000100100100111100001110010111110100011101001001"
                    "1101001000101110001111011001111011000100111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*19*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDEFGb", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 4 digits",
                    "1110111010101100111111011001011111000100111011011011101"
                    "1110011010101100001100111101011101000001100011011011001"
                    "1111011010100100001001000001001110011110110011011010001"
                    "1111001010100111100100111101111110110001011011010010001"
                    "1110001010101100110011110001000111001101110011010110001"
                    "1100001010101000001000100001000010111001110011010111001"
                    "1100011010111011101111000101111100110010001011010111101"
                    "1100010010100111010000001101100001010111110011010011101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*20*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDEFb", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 digits",
                    "1110111010101100111111011001011111000100111011011011101"
                    "1110011010101100001100111101011101000001100011011011001"
                    "1111011010100100001001000001001110011110110011011010001"
                    "1111001010100111100100111101111110110001011011010010001"
                    "1110001010111101101011111101100111100010110011010110001"
                    "1100001010110110001000001001111001011011111011010111001"
                    "1100011010110111110010111101111100011101101011010111101"
                    "1100010010101110000010001101101110000100111011010011101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*21*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDEF", 1, 0, 0, 0, 11, 55, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 digits",
                    "1110110110101100111111011001011111000100111011100010101"
                    "1110010110101100001100111101011101000001100011000010101"
                    "1100010110100100001001000001001110011110110011000110101"
                    "1100010100100111100100111101001001111001000011000100101"
                    "1100110100110011111000101001011110000011011011100100101"
                    "1101110100111011101001000001110001000100111011110100101"
                    "1101100100110001011100100001110001011000100011110101101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*22*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDEb", 1, 0, 0, 0, 11, 55, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 4 digits",
                    "1110110110101100111111011001011111000100111011100010101"
                    "1110010110101100000010011101110111100010111011000010101"
                    "1100010110110010011100111101011000111100111011000110101"
                    "1100010100111101000110001101001011110010000011000100101"
                    "1100110100100001100001011101011110011011000011100100101"
                    "1101110100111010101110000001100101001100000011110100101"
                    "1101100100111100100100100001110001100111010011110101101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*23*/ { BARCODE_UPCE_CC, "1234567", "[91]a1234ABCDE", 1, 0, 0, 0, 10, 55, "ISO-646 followed by 9 non-ISO-646 terminating, starting 4 digits",
                    "1100100010111001101001100001111001111010100011100101101"
                    "1110100010111110010010001101110110011100100011000101101"
                    "1110110010100010100011110001001111000011011011000101001"
                    "1100110010100000100010000101110110001000110011001101001"
                    "1101110010100010001111000101000011001111101011011101001"
                    "1101111010111110101111011001010001000001111011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*24*/ { BARCODE_UPCE_CC, "1234567", "[91]a123ABCDEFGb", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 3 digits (5 alphanumerics rule applies)",
                    "1110111010101100111111011001011111000100111011011011101"
                    "1110011010100100000010111101101111001100111011011011001"
                    "1111011010111101100100011101001011110111100011011010001"
                    "1111001010111110001010110001101001110000100011010010001"
                    "1110001010110011100010111001101110100001110011010110001"
                    "1100001010110100111101111101100110100010000011010111001"
                    "1100011010101000111111011101110110111001000011010111101"
                    "1100010010100011110110110001000111100100001011010011101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*25*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDEF12345b", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 6 letters",
                    "1110111010101100111111011001011111000100111011011011101"
                    "1110011010101100000110111101111010011111011011011011001"
                    "1111011010100001001100001101010010000010000011011010001"
                    "1111001010101111110011011101110100110100000011010010001"
                    "1110001010111110101110100001001101011100000011010110001"
                    "1100001010100010011000011001100001000010011011010111001"
                    "1100011010111000101110110001110100111000011011010111101"
                    "1100010010101100010011100001001110000110111011010011101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*26*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDEF1234b", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 6 letters",
                    "1110111010101100111111011001011111000100111011011011101"
                    "1110011010101100000110111101111010011111011011011011001"
                    "1111011010100001001100001101010010000010000011011010001"
                    "1111001010101111110011011101110100110100000011010010001"
                    "1110001010111111010110000101110001110101111011010110001"
                    "1100001010111010001011100001100001001000011011010111001"
                    "1100011010101001111010000001111100100010011011010111101"
                    "1100010010110100111111010001011001000001110011010011101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*27*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE12345b", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 5 letters",
                    "1110111010101100111111011001011111000100111011011011101"
                    "1110011010101100000110111101111010011111011011011011001"
                    "1111011010100001001100001101010010000010000011011010001"
                    "1111001010111001101110010001101000011100010011010010001"
                    "1110001010111011011111101001011101000000110011010110001"
                    "1100001010100011000111011001110000100101110011010111001"
                    "1100011010110100001110100001110110011100010011010111101"
                    "1100010010111111010111001101110111100101110011010011101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*28*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE12345", 1, 0, 0, 0, 11, 55, "ISO-646 followed by 10 non-ISO-646 terminating, starting 5 letters",
                    "1110110110101100111111011001011111000100111011100010101"
                    "1110010110101100000110111101111010011111011011000010101"
                    "1100010110100001001100001101010010000010000011000110101"
                    "1100010100101100101111110001101000001111011011000100101"
                    "1100110100101000000100111101010000011011111011100100101"
                    "1101110100110011101100010001110001100101100011110100101"
                    "1101100100111100110110000101111110101001110011110101101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*29*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCD012345b", 1, 0, 0, 0, 12, 55, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 letters + numeric",
                    "1110111010101100111111011001011111000100111011011011101"
                    "1110011010101100000110111101111010011111011011011011001"
                    "1111011010100001001100001101110101000111000011011010001"
                    "1111001010110010111000100001001101011111100011010010001"
                    "1110001010110010101111100001000010010111100011010110001"
                    "1100001010111101001011110001001011110011110011010111001"
                    "1100011010111000101110110001110001011000100011010111101"
                    "1100010010111101101011111101000000110101110011010011101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*30*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCD012345", 1, 0, 0, 0, 10, 55, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 letters + numeric",
                    "1100100010111001101001100001111001111010100011100101101"
                    "1110100010111001001101000001111010011011000011000101101"
                    "1110110010100001100100011101110101000111111011000101001"
                    "1100110010111101100100011101110001011011110011001101001"
                    "1101110010111000100011010001110010110001000011011101001"
                    "1101111010111000110101111101000110010001110011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*31*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE1234b", 1, 0, 0, 0, 11, 55, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 5 letters",
                    "1110110110101100111111011001011111000100111011100010101"
                    "1110010110100010110001111101011000001101111011000010101"
                    "1100010110111101101100111101000110000110100011000110101"
                    "1100010100111001101110010001101000111000010011000100101"
                    "1100110100100111001110111101001111101100100011100100101"
                    "1101110100110011000100000101100101001100000011110100101"
                    "1101100100111100001010000101100111011111010011110101101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*32*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE1234", 1, 0, 0, 0, 10, 55, "ISO-646 followed by 9 non-ISO-646 terminating, starting 5 letters",
                    "1100100010111001101001100001111001111010100011100101101"
                    "1110100010111001001101000001111010011011000011000101101"
                    "1110110010100001100100011101110101111110011011000101001"
                    "1100110010100100000100001001111011010011100011001101001"
                    "1101110010111101011001100001111010011000011011011101001"
                    "1101111010111010111110100001111100101110010011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*33*/ { BARCODE_UPCE_CC, "1234567", "[91]aABCDE123", 1, 0, 0, 0, 10, 55, "ISO-646 followed by 8 non-ISO-646 terminating, starting 5 letters",
                    "1100100010111001101001100001111001111010100011100101101"
                    "1110100010111001001101000001111010011011000011000101101"
                    "1110110010100001100100011101110101111110011011000101001"
                    "1100110010110011000100000101010000010001000011001101001"
                    "1101110010111000111011110101100010011101000011011101001"
                    "1101111010101101100001111001010000011011111011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->option_1 = data[i].option_1;
        symbol->option_2 = data[i].option_2;
        symbol->option_3 = data[i].option_3;
        int length = strlen(data[i].data);
        assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
        strcpy(symbol->primary, data[i].data);

        int composite_length = strlen(data[i].composite);

        ret = ZBarcode_Encode(symbol, data[i].composite, composite_length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_ENCODATION_0_GENERATE_EXPECTED
        test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment);
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data);

        if (ret == 0) {
            int width, row;
            ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
            assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_encodation_10(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        unsigned char* composite;
        int option_1;
        int option_2;
        int option_3;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        unsigned char* expected;
    };
    // Verified manually against bwipp (and with noted exceptions, tec-it.com)
    struct item data[] = {
        /* 0*/ { BARCODE_UPCE_CC, "1234567", "[11]201001[10]AB1234", 1, 0, 0, 0, 9, 55, "Mode '10' date + even-numbered numeric lot, 1st fit, alphanumeric latch and padding",
                    "1101100110101110000100011001001000100111100011110101001"
                    "1101101110110010100011000001100110010000001011100101001"
                    "1101101100111011011101000001110100111000110011101101001"
                    "1101101000111110101110000101000110000010111011101001001"
                    "1101001000101100011010000001100110001010000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 1*/ { BARCODE_UPCE_CC, "1234567", "[11]201001[10]AB12345", 1, 0, 0, 0, 9, 55, "Mode '10' date + odd-numbered numeric lot, 1st fit, 7-bit final, no alphanumeric latch or padding",
                    "1101100110101110000100011001001000100111100011110101001"
                    "1101101110110010100011000001100110010000001011100101001"
                    "1101101100111011011101000001111010000110110011101101001"
                    "1101101000100111101110111001000001001001111011101001001"
                    "1101001000101100011100011001111101010111110011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 2*/ { BARCODE_UPCE_CC, "1234567", "[11]201001", 1, 0, 0, 0, 9, 55, "Mode '10' date, no lot or other data",
                    "1101100110101110000100011001001000100111100011110101001"
                    "1101101110110010100110000001010000010010000011100101001"
                    "1101101100111011000001110101000001011111011011101101001"
                    "1101101000101000100111100001011110000101000011101001001"
                    "1101001000111100111001001101000110001100001011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 3*/ { BARCODE_UPCE_CC, "1234567", "[11]201001[20]12", 1, 0, 0, 0, 9, 55, "Mode '10' date, no lot, other data",
                    "1101100110101110000100011001100100010011111011110101001"
                    "1101101110101110111010000001000101100001100011100101001"
                    "1101101100111010011000100001111110101001110011101101001"
                    "1101101000111111010110010001010100001111000011101001001"
                    "1101001000111001011011110001100001101010000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 4*/ { BARCODE_UPCE_CC, "1234567", "[10]1234", 1, 0, 0, 0, 9, 55, "Mode '10' no date, numeric lot, no other data; **NOT SAME** as tec-it.com; same as bwipp",
                    "1101100110100111000110011101110011100101111011110101001"
                    "1101101110110100100110000001111011100101100011100101001"
                    "1101101100100111101011110001111110011010110011101101001"
                    "1101101000100110110000111101101010111110000011101001001"
                    "1101001000110100111000111101000001000010001011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 5*/ { BARCODE_UPCE_CC, "1234567", "[10]ABCD", 1, 0, 0, 0, 9, 55, "Mode '10' no date, alphanumeric lot, no other data; **NOT SAME** as tec-it.com; same as bwipp",
                    "1101100110101111001100011001111000010111101011110101001"
                    "1101101110100010111100111101100110010010000011100101001"
                    "1101101100100111101001111001000010111110110011101101001"
                    "1101101000110001100010111101011101000001100011101001001"
                    "1101001000111010000101110001101000011101111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->option_1 = data[i].option_1;
        symbol->option_2 = data[i].option_2;
        symbol->option_3 = data[i].option_3;
        int length = strlen(data[i].data);
        assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
        strcpy(symbol->primary, data[i].data);

        int composite_length = strlen(data[i].composite);

        ret = ZBarcode_Encode(symbol, data[i].composite, composite_length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_ENCODATION_10_GENERATE_EXPECTED
        test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment);
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data);

        if (ret == 0) {
            int width, row;
            ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
            assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_encodation_11(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        unsigned char* composite;
        int option_1;
        int option_2;
        int option_3;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        unsigned char* expected;
    };
    // Verified manually against tec-it.com (with noted exception) (bwipp 2019-10-13 has some issues with encodation 11 so not used)
    struct item data[] = {
        /* 0*/ { BARCODE_UPCE_CC, "1234567", "[90]A", 1, 0, 0, 0, 9, 55, "Mode '11', letter prefix only",
                    "1101100110100111100000101001110110010011111011110101001"
                    "1101101110110001000101100001100011010010000011100101001"
                    "1101101100110001000011100101001110010011111011101101001"
                    "1101101000110100111111010001000001100010111011101001001"
                    "1101001000110001010110000001001100011100011011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 1*/ { BARCODE_UPCE_CC, "1234567", "[90]1A", 1, 0, 0, 0, 9, 55, "Mode '11', 1 digit letter prefix only",
                    "1101100110100111100000101001011001000111000011110101001"
                    "1101101110101101111011100001011100111010000011100101001"
                    "1101101100111000010011010001101011100001000011101101001"
                    "1101101000101100011001111001000111110110001011101001001"
                    "1101001000100010001110111001001100111001100011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 2*/ { BARCODE_UPCE_CC, "1234567", "[90]12A", 1, 0, 0, 0, 9, 55, "Mode '11', 2 digit letter prefix only",
                    "1101100110100111100000101001011001101111000011110101001"
                    "1101101110110001010000110001110111010000010011100101001"
                    "1101101100111110011010000101111100100110111011101101001"
                    "1101101000110111100101100001000110010001110011101001001"
                    "1101001000100100111101111001000010011100111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 3*/ { BARCODE_UPCE_CC, "1234567", "[90]123A", 1, 0, 0, 0, 9, 55, "Mode '11', 3 digit letter prefix only",
                    "1101100110100111100000101001100110101111000011110101001"
                    "1101101110100001001010000001101110110100000011100101001"
                    "1101101100111110110000101001100101111100111011101101001"
                    "1101101000111001110010111101110101111110011011101001001"
                    "1101001000110011000001001001101110111001100011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 4*/ { BARCODE_UPCE_CC, "1234567", "[90]A1234", 1, 0, 0, 0, 9, 55, "Mode '11', even-numbered numeric [90]",
                    "1101100110100111100000101001110110010011111011110101001"
                    "1101101110110001000100110001101000100110000011100101001"
                    "1101101100111100010111011101100011011110100011101101001"
                    "1101101000101001100001111101001001110111111011101001001"
                    "1101001000111011100100100001101000010000011011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 5*/ { BARCODE_UPCE_CC, "1234567", "[90]A12345", 1, 0, 0, 0, 9, 55, "Mode '11', odd-numbered numeric [90]",
                    "1101100110100111100000101001110110010011111011110101001"
                    "1101101110110001000100110001110100010011100011100101001"
                    "1101101100101000011110010001110100011010000011101101001"
                    "1101101000101110000010110001001111000100001011101001001"
                    "1101001000111000100010111001011000111100111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 6*/ { BARCODE_UPCE_CC, "1234567", "[90]1ABC4", 1, 0, 0, 0, 9, 55, "Mode '11', alpha [90]",
                    "1101100110100111110110010001001110011000111011110101001"
                    "1101101110110110011000011001010011000011000011100101001"
                    "1101101100101000111100000101110000100110010011101101001"
                    "1101101000100111101100001101000001001011110011101001001"
                    "1101001000110111001101000001000010000110011011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 7*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB34", 1, 0, 0, 0, 9, 55, "Mode '11', alphanumeric [90] (letters <= numbers)",
                    "1101100110100011100110111001011111101110010011110101001"
                    "1101101110110000110100010001100101100011100011100101001"
                    "1101101100110010000011100101101100011110001011101101001"
                    "1101101000100111011101111001110011111101001011101001001"
                    "1101001000111100010101111001110011000100011011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 8*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB.D", 1, 0, 0, 0, 9, 55, "Mode '11', alphanumeric [90]",
                    "1101100110100011100110111001011111101110010011110101001"
                    "1101101110110000110100010001000010100000100011100101001"
                    "1101101100101110100001111101110111000111101011101101001"
                    "1101101000100011001000011101011011001111000011101001001"
                    "1101001000110010000010001101101000111011110011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /* 9*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB+D", 1, 0, 0, 0, 9, 55, "Mode '11', ISO-646 [90]",
                    "1101100110100011100110111001011111101110010011110101001"
                    "1101101110110000110100010001101000111001111011100101001"
                    "1101101100111110110100001001100101111101110011101101001"
                    "1101101000100001011001111101000111100001001011101001001"
                    "1101001000100010000001000101101100100010000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*10*/ { BARCODE_UPCE_CC, "1234567", "[90]1A+BD", 1, 0, 0, 0, 9, 55, "Mode '11', immediate ISO-646 [90]",
                    "1101100110100011100110111001011111101110010011110101001"
                    "1101101110101111000111100101111011101011000011100101001"
                    "1101101100101000011110010001001111001011110011101101001"
                    "1101101000100111110011001001101111101001000011101001001"
                    "1101001000110110001000001001101110001100001011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*11*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB#D", 1, 0, 0, ZINT_ERROR_INVALID_DATA, 0, 0, "Mode '11', invalid char [90]", "" },
        /*12*/ { BARCODE_UPCE_CC, "1234567", "[90]A12345[21]AB", 1, 0, 0, 0, 10, 55, "Mode '11', numeric [90], with [21]",
                    "1100100010111000111011011001001100011000010011100101101"
                    "1110100010101000001111001001111100110100010011000101101"
                    "1110110010101110010000110001100111000100111011000101001"
                    "1100110010100001100011000101010000010000100011001101001"
                    "1101110010111101101110011001101000001110010011011101001"
                    "1101111010100001000100111101001010001111000011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*13*/ { BARCODE_UPCE_CC, "1234567", "[90]1ABC4[21]AB12", 1, 0, 0, 0, 10, 55, "Mode '11', alpha [90], with [21]",
                    "1100100010100011100111101101011000111000110011100101101"
                    "1110100010111010000110001001110100011000001011000101101"
                    "1110110010100001100100011101110111111010100011000101001"
                    "1100110010110100100001100001001001111011110011001101001"
                    "1101110010111100101100011001111101001000110011011101001"
                    "1101111010101110100001100001011101100111000011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*14*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB.D[21]AB", 1, 0, 0, 0, 10, 55, "Mode '11', alphanumeric [90], with [21]",
                    "1100100010110011100011000101110001110110011011100101101"
                    "1110100010111101101100100001110010011100011011000101101"
                    "1110110010110000110101111001011100110001110011000101001"
                    "1100110010110011101100000101101001110001111011001101001"
                    "1101110010110110011110001001100110001111001011011101001"
                    "1101111010100110111011111001111001000111101011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*15*/ { BARCODE_UPCE_CC, "1234567", "[90]1AB+D[21]A.", 1, 0, 0, 0, 10, 55, "Mode '11', ISO-646 [90], with [21]; **NOT SAME** as tec-it.com, which probably includes '21' in 5 alphanumeric count",
                    "1100100010110011100011000101110001110110011011100101101"
                    "1110100010111101101100100001110101110001100011000101101"
                    "1110110010100000111000101101110010111110001011000101001"
                    "1100110010110111011000100001110110000100011011001101001"
                    "1101110010111000010001100101111010001110111011011101001"
                    "1101111010110001100100111101111101001110010011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*16*/ { BARCODE_UPCE_CC, "1234567", "[90]1A+BD[21]A12", 1, 0, 0, 0, 11, 55, "Mode '11', immediate ISO-646 [90], with [21]; tec-it.com same, probably since have 5 alphanumerics with or without '21'",
                    "1110110110111100011000110101100111101011111011100010101"
                    "1110010110100100001101111101000100010111100011000010101"
                    "1100010110100010100000100001110011101000001011000110101"
                    "1100010100100001011111011001010111110110000011000100101"
                    "1100110100100000011010011101110001111101011011100100101"
                    "1101110100100000100011011001100001101001000011110100101"
                    "1101100100111010111100011101011110100011110011110101101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*17*/ { BARCODE_UPCE_CC, "1234567", "[90]A12[8004]12", 1, 0, 0, 0, 9, 55, "Mode '11', numeric [90], with [8004]",
                    "1101100110110001111010011001000001101101111011110101001"
                    "1101101110110100100000110001011100111101100011100101001"
                    "1101101100110100000111010001100100001110001011101101001"
                    "1101101000101110001001100001101111001011000011101001001"
                    "1101001000100100110000110001101000010000110011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*18*/ { BARCODE_UPCE_CC, "1234567", "[90]AB[8004]12", 1, 0, 0, 0, 9, 55, "Mode '11', alpha [90], with [8004]",
                    "1101100110100111110011001001100101111110010011110101001"
                    "1101101110101000100000100001011000111001100011100101001"
                    "1101101100100111110100011101111000100001001011101101001"
                    "1101101000101000110011111001010001110111111011101001001"
                    "1101001000110011101100001001111011100001011011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*19*/ { BARCODE_UPCE_CC, "1234567", "[90]A.[8004]12", 1, 0, 0, 0, 9, 55, "Mode '11', alphanumeric [90], with [8004]",
                    "1101100110110111110011001101111110100110001011110101001"
                    "1101101110100010001001000001100101100011100011100101001"
                    "1101101100100001011110001001100001100111101011101101001"
                    "1101101000100111100100001001011110001110111011101001001"
                    "1101001000101101111100111101100011010100000011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*20*/ { BARCODE_UPCE_CC, "1234567", "[90]A+[8004]12", 1, 0, 0, 0, 9, 55, "Mode '11', ISO-646 [90], with [8004]",
                    "1101100110110111110011001101111110100110001011110101001"
                    "1101101110111100110010111001001110001110100011100101001"
                    "1101101100111001011100011001101001110000010011101101001"
                    "1101101000101100000110111101000110001001110011101001001"
                    "1101001000100011000110000101111100110101111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*21*/ { BARCODE_UPCE_CC, "1234567", "[90]12A1[10]12", 1, 0, 0, 0, 9, 55, "Mode '11', numeric [90], other data",
                    "1101100110100111100000101001011001101111000011110101001"
                    "1101101110111000101101111001110110100001100011100101001"
                    "1101101100111100001010001001110000100110010011101101001"
                    "1101101000100000111010001101001000011011111011101001001"
                    "1101001000100010111011100001100001101100011011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*22*/ { BARCODE_UPCE_CC, "1234567", "[90]123AB[10]12", 1, 0, 0, 0, 9, 55, "Mode '11', alpha [90], other data",
                    "1101100110100111110110010001100011101000111011110101001"
                    "1101101110111001110100000101100110001100110011100101001"
                    "1101101100110110011111001101111010100001000011101101001"
                    "1101101000100110111011111001000001100010111011101001001"
                    "1101001000110010010000110001011110011110010011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*23*/ { BARCODE_UPCE_CC, "1234567", "[90]123AB.D[10]12", 1, 0, 0, 0, 10, 55, "Mode '11', alphanumeric [90], other data",
                    "1100100010100011000110000101110110000100110011100101101"
                    "1110100010101101111100100001011111001001110011000101101"
                    "1110110010101111100110001001101111001000110011000101001"
                    "1100110010110110111100111101010111110111110011001101001"
                    "1101110010101000011111001101111100110100100011011101001"
                    "1101111010110011111100110101110101111101000011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*24*/ { BARCODE_UPCE_CC, "1234567", "[90]123AB+D[10]12", 1, 0, 0, 0, 10, 55, "Mode '11', ISO-646 [90], other data",
                    "1100100010100011000110000101110110000100110011100101101"
                    "1110100010101101111100100001100100111000001011000101101"
                    "1110110010100010110011111001000110100111000011000101001"
                    "1100110010111011100100001001110010110011110011001101001"
                    "1101110010111101000000100101111001101101000011011101001"
                    "1101111010101101000001110001101111100001001011011001001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*25*/ { BARCODE_UPCE_CC, "1234567", "[90]A123[21]AB[91]A123", 1, 0, 0, 0, 12, 55, "Mode '11', numeric [90], with [21], other data",
                    "1110111010100001100111110101100010011110110011011011101"
                    "1110011010111111011011100101001110110011100011011011001"
                    "1111011010101000111011100001001011110011110011011010001"
                    "1111001010111100100100100001111010111101111011010010001"
                    "1110001010101100110111100001100111110100010011010110001"
                    "1100001010100110111001100001111101111001011011010111001"
                    "1100011010111110001011011101101001110010000011010111101"
                    "1100010010111001110010111101101111101100110011010011101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
        /*26*/ { BARCODE_UPCE_CC, "1234567", "[90]AB[8004]1[10]12", 1, 0, 0, 0, 9, 55, "Mode '11', alpha [90], with [8004], other data",
                    "1101100110100111110011001001100101111110010011110101001"
                    "1101101110101000100000100001101100011100111011100101001"
                    "1101101100100010011111011001100110011110001011101101001"
                    "1101101000110101100111111001000011001000111011101001001"
                    "1101001000100010000010100001101001111011111011101001101"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0010000000000000000000000000000000000000000000000000001"
                    "0001000000000000000000000000000000000000000000000000010"
                    "0001010010011011110101000110111001000010100100010101010"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->option_1 = data[i].option_1;
        symbol->option_2 = data[i].option_2;
        symbol->option_3 = data[i].option_3;
        int length = strlen(data[i].data);
        assert_zero(length >= 128, "i:%d length %d >= 128\n", i, length);
        strcpy(symbol->primary, data[i].data);

        int composite_length = strlen(data[i].composite);

        ret = ZBarcode_Encode(symbol, data[i].composite, composite_length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_ENCODATION_11_GENERATE_EXPECTED
        test_helper_generate(symbol, ret, i, data[i].data, data[i].composite, data[i].option_1, data[i].option_2, data[i].option_3, data[i].comment);
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data);

        if (ret == 0) {
            int width, row;
            ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
            assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_eanx_leading_zeroes();
    test_examples();
    test_odd_numbered_numeric();
    test_ean128_cc_shift();
    test_ean128_cc_width();
    test_encodation_0();
    test_encodation_10();
    test_encodation_11();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_dmatrix.c.


















































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

//#define TEST_ENCODE_GENERATE_EXPECTED 1

static void test_buffer(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int eci;
        int input_mode;
        int output_options;
        int ret;
        char* comment;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "1", 16383, UNICODE_MODE, READER_INIT, 0, "" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_DATAMATRIX;
        symbol->input_mode = data[i].input_mode;
        symbol->eci = data[i].eci;
        symbol->output_options = data[i].output_options;

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_encode(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        char* expected;
    };
    struct item data[] = {
        /*  0*/ { "1234abcd", 0, 14, 14, "",
                    "10101010101010"
                    "11001010001111"
                    "11000101100100"
                    "11001001100001"
                    "11011001110000"
                    "10100101011001"
                    "10101110011000"
                    "10011101100101"
                    "10100001001000"
                    "10101000001111"
                    "11101100000010"
                    "11010010100101"
                    "10011111000100"
                    "11111111111111"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_DATAMATRIX;

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        #ifdef TEST_ENCODE_GENERATE_EXPECTED
        printf("        /*%3d*/ { \"%s\", %s, %d, %d, \"%s\",\n", i, data[i].data, testUtilErrorName(data[i].ret), symbol->rows, symbol->width, data[i].comment);
        testUtilModulesDump(symbol, "                    ", "\n");
        printf("               },\n");
        #else
        if (ret < 5) {
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);

            if (ret == 0) {
                int width, row;
                ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
                assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);
            }
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_buffer();
    test_encode();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_eci.c.
















































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

static void test_bom(void)
{
    testStart("");

    struct zint_symbol* symbol = ZBarcode_Create();
    assert_nonnull(symbol, "Symbol not created\n");

    symbol->symbology = BARCODE_QRCODE;
    symbol->input_mode = UNICODE_MODE;
    symbol->option_1 = 4;
    symbol->option_2 = 1;

    char data[] = "\xEF\xBB\xBF‹"; // U+FEFF BOM, with U+2039 (only in Windows pages)
    int length = strlen(data);

    char expected[] =
        "111111100001001111111"
        "100000101110101000001"
        "101110100000101011101"
        "101110100111101011101"
        "101110100110101011101"
        "100000101011001000001"
        "111111101010101111111"
        "000000001100100000000"
        "000011110110101100010"
        "010011011100000100001"
        "111110110001011111000"
        "000110000110001011100"
        "000111110111100001011"
        "000000001011001000111"
        "111111101010111001010"
        "100000101110101101010"
        "101110101110001110101"
        "101110100001100101001"
        "101110100111111111100"
        "100000100010011010111"
        "111111100101101000101";

    int ret;
    ret = ZBarcode_Encode(symbol, data, length);
    assert_equal(ret, ZINT_WARN_USES_ECI, "ZBarcode_Encode ret %d != ZINT_WARN_USES_ECI\n", ret);
    assert_equal(symbol->eci, 21, "eci %d != 21\n", symbol->eci); // ECI 21 == Windows-1250

    int width, height;
    ret = testUtilModulesCmp(symbol, expected, &width, &height);
    assert_equal(ret, 0, "testUtilModulesEqual ret %d != 0, width %d, height %d\n", ret, width, height);

    ZBarcode_Delete(symbol);

    testFinish();
}

static void test_iso_8859_16(void)
{
    testStart("");

    struct zint_symbol* symbol = ZBarcode_Create();
    assert_nonnull(symbol, "Symbol not created\n");

    symbol->symbology = BARCODE_QRCODE;
    symbol->input_mode = UNICODE_MODE;

    char data[] = "Èš"; // U+021A only in ISO 8859-16
    int length = strlen(data);

    int ret;
    ret = ZBarcode_Encode(symbol, data, length);
    assert_equal(ret, ZINT_WARN_USES_ECI, "ZBarcode_Encode ret %d != ZINT_WARN_USES_ECI\n", ret);
    assert_equal(symbol->eci, 18, "eci %d != 18\n", symbol->eci); // ECI 18 == ISO 8859-16

    ZBarcode_Delete(symbol);

    testFinish();
}

// Only testing standard non-extended barcodes here, ie not QRCODE, MICROQR, GRIDMATRIX, HANXIN or UPNQR
static void test_reduced_charset_input(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        int input_mode;
        int eci;
        unsigned char* data;
        int ret;
        int expected_eci;
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, not in Shift JIS
    // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in Shift JIS
    // ภU+0E01 in ISO 8859-11 Thai (but not other ISO 8859 or Win page), not in Shift JIS
    // Ж U+0416 in ISO 8859-5 Cyrillic (but not other ISO 8859), Win 1251, in Shift JIS
    // ຠU+0E81 Lao not in any ISO 8859 (or Win page) or Shift JIS
    // … U+2026 in Win pages (but not in any ISO 8859)
    // テ U+30C6 katakana, in Shift JIS
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { BARCODE_CODE11, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "ASCII subset only" },
        /*  1*/ { BARCODE_C25MATRIX, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "Numbers only" },
        /*  2*/ { BARCODE_CODE39, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "ASCII subset only" },
        /*  3*/ { BARCODE_EXCODE39, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "ASCII only" },
        /*  4*/ { BARCODE_EANX, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "Numbers only" },
        /*  5*/ { BARCODE_CODABAR, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "ASCII subset only" },
        /*  6*/ { BARCODE_CODE128, UNICODE_MODE, 0, "é", 0, 0, "" },
        /*  7*/ { BARCODE_CODE128, UNICODE_MODE, 3, "é", ZINT_ERROR_INVALID_OPTION, -1, "Does not support ECI" },
        /*  8*/ { BARCODE_CODE128, UNICODE_MODE, 0, "β", ZINT_ERROR_INVALID_DATA, -1, "β not in ISO 8859-1" },
        /*  9*/ { BARCODE_DPLEIT, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "Numbers only" },
        /* 10*/ { BARCODE_CODE16K, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 11*/ { BARCODE_CODE16K, UNICODE_MODE, 3, "é", ZINT_ERROR_INVALID_OPTION, -1, "Does not support ECI" },
        /* 12*/ { BARCODE_CODE16K, UNICODE_MODE, 0, "β", ZINT_ERROR_INVALID_DATA, -1, "β not in ISO 8859-1" },
        /* 13*/ { BARCODE_CODE49, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "ASCII only" },
        /* 14*/ { BARCODE_CODE93, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "ASCII subset only" },
        /* 15*/ { BARCODE_FLAT, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "Numbers only" },
        /* 16*/ { BARCODE_RSS14, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "Numbers only" },
        /* 17*/ { BARCODE_RSS_EXP, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "ASCII subset only" },
        /* 18*/ { BARCODE_LOGMARS, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "ASCII subset only" },
        /* 19*/ { BARCODE_PDF417, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 20*/ { BARCODE_PDF417, UNICODE_MODE, 3, "é", 0, 3, "Supports ECI" },
        /* 21*/ { BARCODE_PDF417, UNICODE_MODE, 0, "β", ZINT_WARN_USES_ECI, 9, "" },
        /* 22*/ { BARCODE_PDF417, UNICODE_MODE, 9, "β", 0, 9, "" },
        /* 23*/ { BARCODE_PDF417, UNICODE_MODE, 0, "à¸", ZINT_WARN_USES_ECI, 13, "" },
        /* 24*/ { BARCODE_PDF417, UNICODE_MODE, 13, "à¸", 0, 13, "" },
        /* 25*/ { BARCODE_PDF417, UNICODE_MODE, 0, "Ж", ZINT_WARN_USES_ECI, 7, "" },
        /* 26*/ { BARCODE_PDF417, UNICODE_MODE, 7, "Ж", 0, 7, "" },
        /* 27*/ { BARCODE_PDF417, UNICODE_MODE, 0, "…", ZINT_WARN_USES_ECI, 21, "" },
        /* 28*/ { BARCODE_PDF417, UNICODE_MODE, 21, "…", 0, 21, "" },
        /* 29*/ { BARCODE_PDF417, UNICODE_MODE, 0, "テ", ZINT_WARN_USES_ECI, 26, "Defaults to UTF-8 if not in any ISO 8859 or Win page" },
        /* 30*/ { BARCODE_PDF417, UNICODE_MODE, 26, "テ", 0, 26, "" },
        /* 31*/ { BARCODE_PDF417, UNICODE_MODE, 20, "テ", ZINT_ERROR_INVALID_DATA, -1, "テ in ECI 20 but that conversion not currently supported in Zint for non-extended barcodes" },
        /* 32*/ { BARCODE_PDF417, UNICODE_MODE, 900, "é", 0, 900, "ECI > 899 ignored for character set conversion" },
        /* 33*/ { BARCODE_PDF417, UNICODE_MODE, 900, "β", ZINT_ERROR_INVALID_DATA, 900, "But ECI > 899 suppresses auto-ECI `get_best_eci()`" },
        /* 34*/ { BARCODE_PDF417TRUNC, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 35*/ { BARCODE_PDF417TRUNC, UNICODE_MODE, 3, "é", 0, 3, "Supports ECI" },
        /* 36*/ { BARCODE_PDF417TRUNC, UNICODE_MODE, 0, "β", ZINT_WARN_USES_ECI, 9, "" },
        /* 37*/ { BARCODE_PDF417TRUNC, UNICODE_MODE, 9, "β", 0, 9, "" },
        /* 38*/ { BARCODE_PDF417TRUNC, UNICODE_MODE, 26, "テ", 0, 26, "" },
        /* 39*/ { BARCODE_MAXICODE, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 40*/ { BARCODE_MAXICODE, UNICODE_MODE, 3, "é", 0, 3, "Supports ECI" },
        /* 41*/ { BARCODE_MAXICODE, UNICODE_MODE, 0, "β", ZINT_WARN_USES_ECI, 9, "" },
        /* 42*/ { BARCODE_MAXICODE, UNICODE_MODE, 9, "β", 0, 9, "" },
        /* 43*/ { BARCODE_MAXICODE, UNICODE_MODE, 26, "テ", 0, 26, "" },
        /* 44*/ { BARCODE_CODE128B, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 45*/ { BARCODE_CODE128B, UNICODE_MODE, 3, "é", ZINT_ERROR_INVALID_OPTION, -1, "Does not support ECI" },
        /* 46*/ { BARCODE_CODE128B, UNICODE_MODE, 0, "β", ZINT_ERROR_INVALID_DATA, -1, "β not in ISO 8859-1" },
        /* 47*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 48*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 3, "é", 0, 3, "Supports ECI" },
        /* 49*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 0, "β", ZINT_WARN_USES_ECI, 9, "" },
        /* 50*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 9, "β", 0, 9, "" },
        /* 51*/ { BARCODE_DATAMATRIX, UNICODE_MODE, 26, "テ", 0, 26, "" },
        /* 52*/ { BARCODE_CODABLOCKF, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 53*/ { BARCODE_CODABLOCKF, UNICODE_MODE, 3, "é", ZINT_ERROR_INVALID_OPTION, -1, "Does not support ECI" },
        /* 54*/ { BARCODE_CODABLOCKF, UNICODE_MODE, 0, "β", ZINT_ERROR_INVALID_DATA, -1, "β not in ISO 8859-1" },
        /* 55*/ { BARCODE_NVE18, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "Numbers only" },
        /* 56*/ { BARCODE_MICROPDF417, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 57*/ { BARCODE_MICROPDF417, UNICODE_MODE, 3, "é", 0, 3, "Supports ECI" },
        /* 58*/ { BARCODE_MICROPDF417, UNICODE_MODE, 0, "β", ZINT_WARN_USES_ECI, 9, "" },
        /* 59*/ { BARCODE_MICROPDF417, UNICODE_MODE, 9, "β", 0, 9, "" },
        /* 60*/ { BARCODE_MICROPDF417, UNICODE_MODE, 26, "テ", 0, 26, "" },
        /* 61*/ { BARCODE_ONECODE, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "Numbers/dash only" },
        /* 62*/ { BARCODE_AZTEC, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 63*/ { BARCODE_AZTEC, UNICODE_MODE, 3, "é", 0, 3, "Supports ECI" },
        /* 64*/ { BARCODE_AZTEC, UNICODE_MODE, 0, "β", ZINT_WARN_USES_ECI, 9, "" },
        /* 65*/ { BARCODE_AZTEC, UNICODE_MODE, 9, "β", 0, 9, "" },
        /* 66*/ { BARCODE_AZTEC, UNICODE_MODE, 26, "テ", 0, 26, "" },
        /* 67*/ { BARCODE_HIBC_128, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "HIBC ASCII subset only" },
        /* 68*/ { BARCODE_HIBC_AZTEC, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "HIBC ASCII subset only" },
        /* 69*/ { BARCODE_DOTCODE, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 70*/ { BARCODE_DOTCODE, UNICODE_MODE, 3, "é", 0, 3, "Supports ECI" },
        /* 71*/ { BARCODE_DOTCODE, UNICODE_MODE, 0, "β", ZINT_WARN_USES_ECI, 9, "" },
        /* 72*/ { BARCODE_DOTCODE, UNICODE_MODE, 9, "β", 0, 9, "" },
        /* 73*/ { BARCODE_DOTCODE, UNICODE_MODE, 26, "テ", 0, 26, "" },
        /* 74*/ { BARCODE_AZRUNE, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "Numbers <= 255 only" },
        /* 75*/ { BARCODE_CODE32, UNICODE_MODE, 0, "é", ZINT_ERROR_INVALID_DATA, -1, "Numbers only" },
        /* 76*/ { BARCODE_CODEONE, UNICODE_MODE, 0, "é", 0, 0, "" },
        /* 77*/ { BARCODE_CODEONE, UNICODE_MODE, 3, "é", ZINT_ERROR_INVALID_OPTION, -1, "Does not support ECI" },
        /* 78*/ { BARCODE_CODEONE, UNICODE_MODE, 0, "β", ZINT_ERROR_INVALID_DATA, -1, "β not in ISO 8859-1" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->input_mode = data[i].input_mode;
        symbol->eci = data[i].eci;

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        if (data[i].expected_eci != -1) {
            assert_equal(symbol->eci, data[i].expected_eci, "i:%d eci %d != %d\n", i, symbol->eci, data[i].expected_eci);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_bom();
    test_iso_8859_16();
    test_reduced_charset_input();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_gb18030.c.


























































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"
#include "test_gb18030_tab.h"
#include "../gb18030.h"

// As control convert to GB 18030 using table generated from GB18030.TXT plus simple processing.
// The version of GB18030.TXT is libiconv-1.11/GB18030.TXT taken from https://haible.de/bruno/charsets/conversion-tables/GB18030.html
// The generated file backend/tests/test_gb18030_tab.h does not include U+10000..10FFFF codepoints to save space.
// See also backend/tests/tools/data/GB18030.TXT.README and backend/tests/tools/gen_test_tab.php.
static int gb18030_wctomb_zint2(unsigned int* r1, unsigned int* r2, unsigned int wc)
{
    unsigned int c;
    // GB18030 two-byte extension (libiconv-1.16/lib/gb18030ext.h)
    if (wc == 0x1E3F) { // GB 18030-2005 change, was PUA U+E7C7 below, see Table 3-39, p.111, Lunde 2nd ed.
        *r1 = 0xA8BC;
        return 2;
    }
    // GB18030 four-byte extension (libiconv-1.16/lib/gb18030uni.h)
    if (wc == 0xE7C7) { // PUA
        *r1 = 0x8135;
        *r2 = 0xF437;
        return 4;
    }
    // GB18030 two-byte extension (libiconv-1.16/lib/gb18030ext.h)
    if (wc >= 0x9FB4 && wc <= 0x9FBB) { // GB 18030-2005 change, were PUA, see Table 3-37, p.108, Lunde 2nd ed.
        if (wc == 0x9FB4) {
            *r1 = 0xFE59;
        } else if (wc == 0x9FB5) {
            *r1 = 0xFE61;
        } else if (wc == 0x9FB6 || wc == 0x9FB7) {
            *r1 = 0xFE66 + (wc - 0x9FB6);
        } else if (wc == 0x9FB8) {
            *r1 = 0xFE6D;
        } else if (wc == 0x9FB9) {
            *r1 = 0xFE7E;
        } else if (wc == 0x9FBA) {
            *r1 = 0xFE90;
        } else {
            *r1 = 0xFEA0;
        }
        return 2;
    }
    // GB18030 two-byte extension (libiconv-1.16/lib/gb18030ext.h)
    if (wc >= 0xFE10 && wc <= 0xFE19) { // GB 18030-2005 change, were PUA, see Table 3-37, p.108, Lunde 2nd ed.
        if (wc == 0xFE10) {
            *r1 = 0xA6D9;
        } else if (wc == 0xFE11) {
            *r1 = 0xA6DB;
        } else if (wc == 0xFE12) {
            *r1 = 0xA6DA;
        } else if (wc >= 0xFE13 && wc <= 0xFE16) {
            *r1 = 0xA6DC + (wc - 0xFE13);
        } else if (wc == 0xFE17 || wc == 0xFE18) {
            *r1 = 0xA6EC + (wc - 0xFE17);
        } else {
            *r1 = 0xA6F3;
        }
        return 2;
    }
    // GB18030 four-byte extension (libiconv-1.16/lib/gb18030uni.h)
    if (wc >= 0xFE1A && wc <= 0xFE2F) { // These are Vertical Forms (U+FE1A..FE1F unassigned) and Combining Half Marks (U+FE20..FE2F)
        if (wc >= 0xFE1A && wc <= 0xFE1D) {
            c = 0x84318336 + (wc - 0xFE1A);
        } else if (wc >= 0xFE1E && wc <= 0xFE27) {
            c = 0x84318430 + (wc - 0xFE1E);
        } else {
            c = 0x84318530 + (wc - 0xFE28);
        }
        *r1 = c >> 16;
        *r2 = c & 0xFFFF;
        return 4;
    }
    // GB18030 (libiconv-1.16/lib/gb18030.h)
    if (wc >= 0x10000 && wc < 0x10400) { // Code set 3 (Unicode U+10000..U+10FFFF)
        c = wc - 0x10000;
        *r1 = 0x9030;
        *r2 = 0x8130 + (c % 10) + 0x100 * (c / 10);
        return 4;
    }
    int tab_length = sizeof(test_gb18030_tab) / sizeof(unsigned int);
    for (int i = test_gb18030_tab_ind[wc >> 12]; i < tab_length; i += 2) {
        if (test_gb18030_tab[i + 1] == wc) {
            c = test_gb18030_tab[i];
            if (c <= 0xFFFF) {
                *r1 = c;
                return c <= 0xFF ? 1 : 2;
            }
            *r1 = c >> 16;
            *r2 = c & 0xFFFF;
            return 4;
        }
    }
    return 0;
}

static void test_gb18030_wctomb_zint(void)
{
    testStart("");

    int ret, ret2;
    unsigned int val1_1, val1_2, val2_1, val2_2;

    for (unsigned int i = 0; i < 0x10400; i++) { // Don't bother with U+10400..U+10FFFF, programmatically filled
        if (i >= 0xD800 && i <= 0xDFFF) { // UTF-16 surrogates
            continue;
        }
        val1_1 = val1_2 = val2_1 = val2_2 = 0;
        ret = gb18030_wctomb_zint(&val1_1, &val1_2, i);
        ret2 = gb18030_wctomb_zint2(&val2_1, &val2_2, i);
        assert_equal(ret, ret2, "i:%d 0x%04X ret %d != ret2 %d, val1_1 0x%04X, val2_1 0x%04X, val1_2 0x%04X, val2_2 0x%04X\n", i, i, ret, ret2, val1_1, val2_1, val1_2, val2_2);
        if (ret2) {
            assert_equal(val1_1, val2_1, "i:%d 0x%04X val1_1 0x%04X != val2_1 0x%04X\n", i, i, val1_1, val2_1);
            assert_equal(val1_2, val2_2, "i:%d 0x%04X val1_2 0x%04X != val2_2 0x%04X\n", i, i, val1_2, val2_2);
        }
    }

    testFinish();
}

static void test_gb18030_utf8tomb(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int length;
        int ret;
        size_t ret_length;
        unsigned int expected_gbdata[20];
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, in GB 18030 0xA8A6, UTF-8 C3A9
    // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in GB 18030 0xA6C2, UTF-8 CEB2
    // ¤ U+00A4 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, in GB 18030 0xA1E8, UTF-8 C2A4
    // ¥ U+00A5 in ISO 8859-1 0xA5, in GB 18030 4-byte 0x81308436, UTF-8 C2A5
    // ・ U+30FB katakana middle dot, not in any ISO or Win page, in GB 18030 0xA1A4, duplicate of mapping of U+00B7, UTF-8 E383BB
    // · U+00B7 middle dot in ISO 8859-1 0xB7, in GB 18030 "GB 18030 subset" 0xA1A4, duplicate of mapping of U+30FB, UTF-8 C2B7
    // ― U+2015 horizontal bar in ISO 8859-7 Greek and ISO 8859-10 Nordic, not in any Win page, in GB 18030 "GB18030.TXT" 0xA1AA, duplicate of mapping of U+2014, UTF-8 E28095
    // — U+2014 em dash, not in any ISO, in Win 1250 and other Win, in GB 18030 "GB 18030 subset" 0xA1AA, duplicate of mapping of U+2015, UTF-8 E28094
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "é", -1, 0, 1, { 0xA8A6 }, "" },
        /*  1*/ { "β", -1, 0, 1, { 0xA6C2 }, "" },
        /*  2*/ { "¤", -1, 0, 1, { 0xA1E8 }, "" },
        /*  3*/ { "Â¥", -1, 0, 2, { 0x8130, 0x8436 }, "0x81308436" },
        /*  4*/ { "・", -1, 0, 2, { 0x8139, 0xA739 }, "" },
        /*  5*/ { "·", -1, 0, 1, { 0xA1A4 }, "GB 18030 subset mapping" },
        /*  6*/ { "―", -1, 0, 1, { 0xA844 }, "GB18030.TXT mapping" },
        /*  7*/ { "—", -1, 0, 1, { 0xA1AA }, "GB 18030 subset mapping" },
        /*  8*/ { "aβc・·—é—Z", -1, 0, 10, { 'a', 0xA6C2, 'c', 0x8139, 0xA739, 0xA1A4, 0xA1AA, 0xA8A6, 0xA1AA, 'Z' }, "" },
    };

    int data_size = sizeof(data) / sizeof(struct item);

    struct zint_symbol symbol;
    unsigned int gbdata[20];

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        ret = gb18030_utf8tomb(&symbol, data[i].data, &ret_length, gbdata);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol.errtxt);
        if (ret == 0) {
            assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %zu != %zu\n", i, ret_length, data[i].ret_length);
            for (int j = 0; j < ret_length; j++) {
                assert_equal(gbdata[j], data[i].expected_gbdata[j], "i:%d gbdata[%d] 0x%04X != 0x%04X\n", i, j, gbdata[j], data[i].expected_gbdata[j]);
            }
        }
    }

    testFinish();
}

static void test_gb18030_utf8tosb(void)
{
    testStart("");

    int ret;
    struct item {
        int eci;
        unsigned char* data;
        int length;
        int ret;
        size_t ret_length;
        unsigned int expected_gbdata[20];
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 0xE9, Win 1250 plus other Win, in HANXIN Chinese mode first byte range 0x81..FE
    // β U+03B2 in ISO 8859-7 Greek 0xE2 (but not other ISO 8859 or Win page)
    // ¥ U+00A5 in ISO 8859-1 0xA5, in first byte range 0x81..FE
    // ÿ U+00FF in ISO 8859-1 0xFF, outside first byte and second/third/fourth byte ranges
    // @ U+0040 in ASCII 0x40, outside first byte range, in double-byte second byte range, outside quad-byte second/third/fourth byte ranges
    // 9 U+0039 in ASCII 0x39, outside first byte range, outside double-byte second byte range and quad-byte third byte range, in quad-byte second/fourth byte ranges
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { 3, "é", -1, 0, 1, { 0xE9 }, "First byte in range but only one byte" },
        /*  1*/ { 3, "β", -1, ZINT_ERROR_INVALID_DATA, -1, {}, "Not in ECI 3 (ISO 8859-1)" },
        /*  2*/ { 9, "β", -1, 0, 1, { 0xE2 }, "In ECI 9 (ISO 8859-7)" },
        /*  3*/ { 3, "Â¥", -1, 0, 1, { 0xA5 }, "First byte in range but only one byte" },
        /*  4*/ { 3, "¥é", -1, 0, 1, { 0xA5E9 }, "In double-byte range" },
        /*  5*/ { 3, "¥ÿ", -1, 0, 2, { 0xA5, 0xFF }, "First byte in range but not second" },
        /*  6*/ { 3, "¥9é9", -1, 0, 2, { 0xA539, 0xE939 }, "In quad-byte range" },
        /*  7*/ { 3, "Â¥9", -1, 0, 2, { 0xA5, 0x39 }, "In quad-byte first/second range but only 2 bytes, not in double-byte range" },
        /*  8*/ { 3, "¥9é", -1, 0, 3, { 0xA5, 0x39, 0xE9 }, "In quad-byte first/second/third range but only 3 bytes, no bytes in double-byte range" },
        /*  9*/ { 3, "¥9é@", -1, 0, 3, { 0xA5, 0x39, 0xE940 }, "In quad-byte first/second/third range but not fourth, second 2 bytes in double-byte range" },
        /* 10*/ { 3, "¥@é9", -1, 0, 3, { 0xA540, 0xE9, 0x39 }, "In quad-byte first/third/fourth range but not second, first 2 bytes in double-byte range" },
        /* 11*/ { 3, "Â¥9@9", -1, 0, 4, { 0xA5, 0x39, 0x40, 0x39 }, "In quad-byte first/second/fourth range but not third, no bytes in double-byte range" },
        /* 12*/ { 3, "é9éé¥9é@¥9é9¥9é0é@@¥¥é0é1", -1, 0, 15, { 0xE9, 0x39, 0xE9E9, 0xA5, 0x39, 0xE940, 0xA539, 0xE939, 0xA539, 0xE930, 0xE940, 0x40, 0xA5A5, 0xE930, 0xE931 }, "" },
    };

    int data_size = sizeof(data) / sizeof(struct item);

    unsigned int gbdata[20];

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        ret = gb18030_utf8tosb(data[i].eci, data[i].data, &ret_length, gbdata);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
        if (ret == 0) {
            assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %zu != %zu\n", i, ret_length, data[i].ret_length);
            for (int j = 0; j < ret_length; j++) {
                assert_equal(gbdata[j], data[i].expected_gbdata[j], "i:%d gbdata[%d] %04X != %04X\n", i, j, gbdata[j], data[i].expected_gbdata[j]);
            }
        }
    }

    testFinish();
}

static void test_gb18030_cpy(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int length;
        int ret;
        size_t ret_length;
        unsigned int expected_jisdata[20];
        char* comment;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "\351", -1, 0, 1, { 0xE9 }, "In HANXIN Chinese mode first-byte range but only one byte" },
        /*  1*/ { "\351\241", -1, 0, 1, { 0xE9A1 }, "In HANXIN Chinese range" },
        /*  2*/ { "\241", -1, 0, 1, { 0xA1 }, "In first-byte range but only one byte" },
        /*  3*/ { "\241\241", -1, 0, 1, { 0xA1A1 }, "In range" },
        /*  4*/ { "\241\240\241\376\367\376\367\377\2012\2013", -1, 0, 7, { 0xA1A0, 0xA1FE, 0xF7FE, 0xF7, 0xFF, 0x8132, 0x8133 }, "" },
    };

    int data_size = sizeof(data) / sizeof(struct item);

    unsigned int jisdata[40];

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        gb18030_cpy(data[i].data, &ret_length, jisdata);
        assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %zu != %zu\n", i, ret_length, data[i].ret_length);
        for (int j = 0; j < ret_length; j++) {
            assert_equal(jisdata[j], data[i].expected_jisdata[j], "i:%d jisdata[%d] %04X != %04X\n", i, j, jisdata[j], data[i].expected_jisdata[j]);
        }
    }

    testFinish();
}

int main()
{
    test_gb18030_wctomb_zint();
    test_gb18030_utf8tomb();
    test_gb18030_utf8tosb();
    test_gb18030_cpy();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_gb18030_tab.h.

more than 10,000 changes

Added jni/zint/backend/tests/test_gb2312.c.








































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"
#include "test_gb2312_tab.h"
#include "../gb2312.h"

// As control convert to GB 2312 using simple table generated from unicode.org GB2312.TXT plus simple processing
// GB2312.TXT no longer on unicode.org site but available from https://haible.de/bruno/charsets/conversion-tables/GB2312.html
static int gb2312_wctomb_zint2(unsigned int* r, unsigned int wc)
{
    // Shortcut
    if ((wc > 0x0451 && wc < 0x2015) || (wc > 0x3229 && wc < 0x4E00) || (wc > 0x9FA0 && wc < 0xFF01) || wc > 0xFFE5) {
        return 0;
    }
    int tab_length = sizeof(test_gb2312_tab) / sizeof(unsigned int);
    for (int i = test_gb2312_tab_ind[wc >> 12]; i < tab_length; i += 2) {
        if (test_gb2312_tab[i + 1] == wc) {
            *r = test_gb2312_tab[i] + 0x8080; // Table in GB 2312 not EUC-CN
            return 2;
        }
    }
    return 0;
}

static void test_gb2312_wctomb_zint(void)
{
    testStart("");

    int ret, ret2;
    unsigned char buf[2], buf2[2];
    unsigned int val, val2;

    for (unsigned int i = 0; i < 0xFFFE; i++) {
        if (i < 0x80) { // ASCII is straight through and not dealt with by gb2312_wctomb_zint()
            continue;
        }
        if (i >= 0xD800 && i <= 0xDFFF) { // UTF-16 surrogates
            continue;
        }
        val = val2 = 0;
        ret = gb2312_wctomb_zint(&val, i);
        ret2 = gb2312_wctomb_zint2(&val2, i);
        if (i == 0xB7) { // Extra mapping middle dot U+00B7 to 0xA1A4, duplicate of U+30FB (Katakana middle dot)
            assert_equal(ret, 2, "i:%d 0x%04X ret %d != 2, val 0x%04X\n", i, i, ret, val);
            assert_equal(val, 0xA1A4, "i:%d 0x%04X val 0x%04X != 0xA1A4\n", i, i, val);
            assert_zero(ret2, "i:%d 0x%04X ret2 %d != 0, val2 0x%04X\n", i, i, ret2, val2);
        } else if (i == 0x2014) { // Extra mapping em dash U+2014 to 0xA1AA, duplicate of U+2015 (horizontal bar)
            assert_equal(ret, 2, "i:%d 0x%04X ret %d != 2, val 0x%04X\n", i, i, ret, val);
            assert_equal(val, 0xA1AA, "i:%d 0x%04X val 0x%04X != 0xA1AA\n", i, i, val);
            assert_zero(ret2, "i:%d 0x%04X ret2 %d != 0, val2 0x%04X\n", i, i, ret2, val2);
        } else {
            assert_equal(ret, ret2, "i:%d 0x%04X ret %d != ret2 %d, val 0x%04X, val2 0x%04X\n", i, i, ret, ret2, val, val2);
        }
        if (ret2) {
            assert_equal(val, val2, "i:%d 0x%04X val 0x%04X != val2 0x%04X\n", i, i, val, val2);
        }
    }

    testFinish();
}

static void test_gb2312_utf8tomb(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int length;
        int ret;
        size_t ret_length;
        unsigned int expected_gbdata[20];
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, in GB 2312 0xA8A6, UTF-8 C3A9
    // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in GB 2312 0xA6C2, UTF-8 CEB2
    // ¤ U+00A4 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, in GB 2312 0xA1E8, UTF-8 C2A4
    // ¥ U+00A5 in ISO 8859-1 0xA5, not in GB 2312, UTF-8 C2A5
    // ・ U+30FB katakana middle dot, not in any ISO or Win page, in GB 2312 "GB2312.TXT" 0xA1A4, duplicate of mapping of U+00B7, UTF-8 E383BB
    // · U+00B7 middle dot in ISO 8859-1 0xB7, in GB 2312 "GB 18030 subset" 0xA1A4, duplicate of mapping of U+30FB, UTF-8 C2B7
    // ― U+2015 horizontal bar in ISO 8859-7 Greek and ISO 8859-10 Nordic, not in any Win page, in GB 2312 "GB2312.TXT" 0xA1AA, duplicate of mapping of U+2014, UTF-8 E28095
    // — U+2014 em dash, not in any ISO, in Win 1250 and other Win, in GB 2312 "GB 18030 subset" 0xA1AA, duplicate of mapping of U+2015, UTF-8 E28094
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "é", -1, 0, 1, { 0xA8A6 }, "" },
        /*  1*/ { "β", -1, 0, 1, { 0xA6C2 }, "" },
        /*  2*/ { "¤", -1, 0, 1, { 0xA1E8 }, "" },
        /*  3*/ { "Â¥", -1, ZINT_ERROR_INVALID_DATA, -1, {}, "" },
        /*  4*/ { "・", -1, 0, 1, { 0xA1A4 }, "GB2312.TXT mapping" },
        /*  5*/ { "·", -1, 0, 1, { 0xA1A4 }, "GB 18030 subset mapping" },
        /*  6*/ { "―", -1, 0, 1, { 0xA1AA }, "GB2312.TXT mapping" },
        /*  7*/ { "—", -1, 0, 1, { 0xA1AA }, "GB 18030 subset mapping" },
        /*  8*/ { "aβc・·—é—Z", -1, 0, 9, { 'a', 0xA6C2, 'c', 0xA1A4, 0xA1A4, 0xA1AA, 0xA8A6, 0xA1AA, 'Z' }, "" },
    };

    int data_size = sizeof(data) / sizeof(struct item);

    struct zint_symbol symbol;
    unsigned int gbdata[20];

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        ret = gb2312_utf8tomb(&symbol, data[i].data, &ret_length, gbdata);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol.errtxt);
        if (ret == 0) {
            assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %zu != %zu\n", i, ret_length, data[i].ret_length);
            for (int j = 0; j < ret_length; j++) {
                assert_equal(gbdata[j], data[i].expected_gbdata[j], "i:%d gbdata[%d] %04X != %04X\n", i, j, gbdata[j], data[i].expected_gbdata[j]);
            }
        }
    }

    testFinish();
}

static void test_gb2312_utf8tosb(void)
{
    testStart("");

    int ret;
    struct item {
        int eci;
        unsigned char* data;
        int length;
        int ret;
        size_t ret_length;
        unsigned int expected_gbdata[20];
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 0xE9, Win 1250 plus other Win, in GRIDMATRIX Chinese mode first byte range 0xA1..A9, 0xB0..F7
    // β U+03B2 in ISO 8859-7 Greek 0xE2 (but not other ISO 8859 or Win page)
    // ¥ U+00A5 in ISO 8859-1 0xA5, in first byte range 0xA1..A9, 0xB0..F7
    // NBSP U+00A0 in ISO 8859-1 0xA0, outside first byte and second byte range 0xA1..FE, UTF-8 C2A0 (\302\240)
    // ¡ U+00A1 in ISO 8859-1 0xA1, in first byte range
    // © U+00A9 in ISO 8859-1 0xA9, in first byte range
    // ª U+00AA in ISO 8859-1 0xAA, outside first byte range
    // ¯ U+00AF in ISO 8859-1 0xAF, outside first byte range
    // ° U+00B0 in ISO 8859-1 0xB0, in first byte range
    // ÷ U+00F7 in ISO 8859-1 0xF7, in first byte range
    // ø U+00F8 in ISO 8859-1 0xF8, outside first byte range
    // ÿ U+00FF in ISO 8859-1 0xFF, outside first byte and second byte range
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { 3, "é", -1, 0, 1, { 0xE9 }, "First byte in range but only one byte" },
        /*  1*/ { 3, "β", -1, ZINT_ERROR_INVALID_DATA, -1, {}, "Not in ECI 3 (ISO 8859-1)" },
        /*  2*/ { 9, "β", -1, 0, 1, { 0xE2 }, "In ECI 9 (ISO 8859-7)" },
        /*  3*/ { 3, "Â¥", -1, 0, 1, { 0xA5 }, "First byte in range but only one byte" },
        /*  4*/ { 3, "¡é", -1, 0, 1, { 0xA1E9 }, "In GRIDMATRIX Chinese mode range" },
        /*  5*/ { 3, "¡\302\240", -1, 0, 2, { 0xA1, 0xA0 }, "First byte in range but not second" },
        /*  6*/ { 3, "©é", -1, 0, 1, { 0xA9E9 }, "In GRIDMATRIX Chinese mode range" },
        /*  7*/ { 3, "©ÿ", -1, 0, 2, { 0xA9, 0xFF }, "First byte in range but not second" },
        /*  8*/ { 3, "éaé驪ª©¯é°°é÷éø", -1, 0, 10, { 0xE9, 0x61, 0xE9E9, 0xA9AA, 0xAA, 0xA9AF, 0xE9B0, 0xB0E9, 0xF7E9, 0xF8 }, "" },
    };

    int data_size = sizeof(data) / sizeof(struct item);

    unsigned int gbdata[20];

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        ret = gb2312_utf8tosb(data[i].eci, data[i].data, &ret_length, gbdata);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
        if (ret == 0) {
            assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %zu != %zu\n", i, ret_length, data[i].ret_length);
            for (int j = 0; j < ret_length; j++) {
                assert_equal(gbdata[j], data[i].expected_gbdata[j], "i:%d gbdata[%d] %04X != %04X\n", i, j, gbdata[j], data[i].expected_gbdata[j]);
            }
        }
    }

    testFinish();
}

static void test_gb2312_cpy(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int length;
        int ret;
        size_t ret_length;
        unsigned int expected_jisdata[20];
        char* comment;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "\351", -1, 0, 1, { 0xE9 }, "In GRIDMATRIX Chinese mode first-byte range but only one byte" },
        /*  1*/ { "\351\241", -1, 0, 1, { 0xE9A1 }, "In GRIDMATRIX Chinese range" },
        /*  2*/ { "\241", -1, 0, 1, { 0xA1 }, "In first-byte range but only one byte" },
        /*  3*/ { "\241\241", -1, 0, 1, { 0xA1A1 }, "In range" },
        /*  4*/ { "\241\240\241\376\367\376\367\377", -1, 0, 6, { 0xA1, 0xA0, 0xA1FE, 0xF7FE, 0xF7, 0xFF }, "" },
    };

    int data_size = sizeof(data) / sizeof(struct item);

    unsigned int jisdata[20];

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        gb2312_cpy(data[i].data, &ret_length, jisdata);
        assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %zu != %zu\n", i, ret_length, data[i].ret_length);
        for (int j = 0; j < ret_length; j++) {
            assert_equal(jisdata[j], data[i].expected_jisdata[j], "i:%d jisdata[%d] %04X != %04X\n", i, j, jisdata[j], data[i].expected_jisdata[j]);
        }
    }

    testFinish();
}

int main()
{
    test_gb2312_wctomb_zint();
    test_gb2312_utf8tomb();
    test_gb2312_utf8tosb();
    test_gb2312_cpy();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_gb2312_tab.h.






















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
/* Generated by gen_test_tab.php from GB2312.TXT */
static const unsigned int test_gb2312_tab[] = {
    0x2168, 0x00A4,
    0x216C, 0x00A7,
    0x2127, 0x00A8,
    0x2163, 0x00B0,
    0x2140, 0x00B1,
    0x2141, 0x00D7,
    0x2824, 0x00E0,
    0x2822, 0x00E1,
    0x2828, 0x00E8,
    0x2826, 0x00E9,
    0x283A, 0x00EA,
    0x282C, 0x00EC,
    0x282A, 0x00ED,
    0x2830, 0x00F2,
    0x282E, 0x00F3,
    0x2142, 0x00F7,
    0x2834, 0x00F9,
    0x2832, 0x00FA,
    0x2839, 0x00FC,
    0x2821, 0x0101,
    0x2825, 0x0113,
    0x2827, 0x011B,
    0x2829, 0x012B,
    0x282D, 0x014D,
    0x2831, 0x016B,
    0x2823, 0x01CE,
    0x282B, 0x01D0,
    0x282F, 0x01D2,
    0x2833, 0x01D4,
    0x2835, 0x01D6,
    0x2836, 0x01D8,
    0x2837, 0x01DA,
    0x2838, 0x01DC,
    0x2126, 0x02C7,
    0x2125, 0x02C9,
    0x2621, 0x0391,
    0x2622, 0x0392,
    0x2623, 0x0393,
    0x2624, 0x0394,
    0x2625, 0x0395,
    0x2626, 0x0396,
    0x2627, 0x0397,
    0x2628, 0x0398,
    0x2629, 0x0399,
    0x262A, 0x039A,
    0x262B, 0x039B,
    0x262C, 0x039C,
    0x262D, 0x039D,
    0x262E, 0x039E,
    0x262F, 0x039F,
    0x2630, 0x03A0,
    0x2631, 0x03A1,
    0x2632, 0x03A3,
    0x2633, 0x03A4,
    0x2634, 0x03A5,
    0x2635, 0x03A6,
    0x2636, 0x03A7,
    0x2637, 0x03A8,
    0x2638, 0x03A9,
    0x2641, 0x03B1,
    0x2642, 0x03B2,
    0x2643, 0x03B3,
    0x2644, 0x03B4,
    0x2645, 0x03B5,
    0x2646, 0x03B6,
    0x2647, 0x03B7,
    0x2648, 0x03B8,
    0x2649, 0x03B9,
    0x264A, 0x03BA,
    0x264B, 0x03BB,
    0x264C, 0x03BC,
    0x264D, 0x03BD,
    0x264E, 0x03BE,
    0x264F, 0x03BF,
    0x2650, 0x03C0,
    0x2651, 0x03C1,
    0x2652, 0x03C3,
    0x2653, 0x03C4,
    0x2654, 0x03C5,
    0x2655, 0x03C6,
    0x2656, 0x03C7,
    0x2657, 0x03C8,
    0x2658, 0x03C9,
    0x2727, 0x0401,
    0x2721, 0x0410,
    0x2722, 0x0411,
    0x2723, 0x0412,
    0x2724, 0x0413,
    0x2725, 0x0414,
    0x2726, 0x0415,
    0x2728, 0x0416,
    0x2729, 0x0417,
    0x272A, 0x0418,
    0x272B, 0x0419,
    0x272C, 0x041A,
    0x272D, 0x041B,
    0x272E, 0x041C,
    0x272F, 0x041D,
    0x2730, 0x041E,
    0x2731, 0x041F,
    0x2732, 0x0420,
    0x2733, 0x0421,
    0x2734, 0x0422,
    0x2735, 0x0423,
    0x2736, 0x0424,
    0x2737, 0x0425,
    0x2738, 0x0426,
    0x2739, 0x0427,
    0x273A, 0x0428,
    0x273B, 0x0429,
    0x273C, 0x042A,
    0x273D, 0x042B,
    0x273E, 0x042C,
    0x273F, 0x042D,
    0x2740, 0x042E,
    0x2741, 0x042F,
    0x2751, 0x0430,
    0x2752, 0x0431,
    0x2753, 0x0432,
    0x2754, 0x0433,
    0x2755, 0x0434,
    0x2756, 0x0435,
    0x2758, 0x0436,
    0x2759, 0x0437,
    0x275A, 0x0438,
    0x275B, 0x0439,
    0x275C, 0x043A,
    0x275D, 0x043B,
    0x275E, 0x043C,
    0x275F, 0x043D,
    0x2760, 0x043E,
    0x2761, 0x043F,
    0x2762, 0x0440,
    0x2763, 0x0441,
    0x2764, 0x0442,
    0x2765, 0x0443,
    0x2766, 0x0444,
    0x2767, 0x0445,
    0x2768, 0x0446,
    0x2769, 0x0447,
    0x276A, 0x0448,
    0x276B, 0x0449,
    0x276C, 0x044A,
    0x276D, 0x044B,
    0x276E, 0x044C,
    0x276F, 0x044D,
    0x2770, 0x044E,
    0x2771, 0x044F,
    0x2757, 0x0451,
    0x212A, 0x2015,
    0x212C, 0x2016,
    0x212E, 0x2018,
    0x212F, 0x2019,
    0x2130, 0x201C,
    0x2131, 0x201D,
    0x212D, 0x2026,
    0x216B, 0x2030,
    0x2164, 0x2032,
    0x2165, 0x2033,
    0x2179, 0x203B,
    0x2166, 0x2103,
    0x216D, 0x2116,
    0x2271, 0x2160,
    0x2272, 0x2161,
    0x2273, 0x2162,
    0x2274, 0x2163,
    0x2275, 0x2164,
    0x2276, 0x2165,
    0x2277, 0x2166,
    0x2278, 0x2167,
    0x2279, 0x2168,
    0x227A, 0x2169,
    0x227B, 0x216A,
    0x227C, 0x216B,
    0x217B, 0x2190,
    0x217C, 0x2191,
    0x217A, 0x2192,
    0x217D, 0x2193,
    0x214A, 0x2208,
    0x2147, 0x220F,
    0x2146, 0x2211,
    0x214C, 0x221A,
    0x2158, 0x221D,
    0x215E, 0x221E,
    0x214F, 0x2220,
    0x214E, 0x2225,
    0x2144, 0x2227,
    0x2145, 0x2228,
    0x2149, 0x2229,
    0x2148, 0x222A,
    0x2152, 0x222B,
    0x2153, 0x222E,
    0x2160, 0x2234,
    0x215F, 0x2235,
    0x2143, 0x2236,
    0x214B, 0x2237,
    0x2157, 0x223D,
    0x2156, 0x2248,
    0x2155, 0x224C,
    0x2159, 0x2260,
    0x2154, 0x2261,
    0x215C, 0x2264,
    0x215D, 0x2265,
    0x215A, 0x226E,
    0x215B, 0x226F,
    0x2151, 0x2299,
    0x214D, 0x22A5,
    0x2150, 0x2312,
    0x2259, 0x2460,
    0x225A, 0x2461,
    0x225B, 0x2462,
    0x225C, 0x2463,
    0x225D, 0x2464,
    0x225E, 0x2465,
    0x225F, 0x2466,
    0x2260, 0x2467,
    0x2261, 0x2468,
    0x2262, 0x2469,
    0x2245, 0x2474,
    0x2246, 0x2475,
    0x2247, 0x2476,
    0x2248, 0x2477,
    0x2249, 0x2478,
    0x224A, 0x2479,
    0x224B, 0x247A,
    0x224C, 0x247B,
    0x224D, 0x247C,
    0x224E, 0x247D,
    0x224F, 0x247E,
    0x2250, 0x247F,
    0x2251, 0x2480,
    0x2252, 0x2481,
    0x2253, 0x2482,
    0x2254, 0x2483,
    0x2255, 0x2484,
    0x2256, 0x2485,
    0x2257, 0x2486,
    0x2258, 0x2487,
    0x2231, 0x2488,
    0x2232, 0x2489,
    0x2233, 0x248A,
    0x2234, 0x248B,
    0x2235, 0x248C,
    0x2236, 0x248D,
    0x2237, 0x248E,
    0x2238, 0x248F,
    0x2239, 0x2490,
    0x223A, 0x2491,
    0x223B, 0x2492,
    0x223C, 0x2493,
    0x223D, 0x2494,
    0x223E, 0x2495,
    0x223F, 0x2496,
    0x2240, 0x2497,
    0x2241, 0x2498,
    0x2242, 0x2499,
    0x2243, 0x249A,
    0x2244, 0x249B,
    0x2924, 0x2500,
    0x2925, 0x2501,
    0x2926, 0x2502,
    0x2927, 0x2503,
    0x2928, 0x2504,
    0x2929, 0x2505,
    0x292A, 0x2506,
    0x292B, 0x2507,
    0x292C, 0x2508,
    0x292D, 0x2509,
    0x292E, 0x250A,
    0x292F, 0x250B,
    0x2930, 0x250C,
    0x2931, 0x250D,
    0x2932, 0x250E,
    0x2933, 0x250F,
    0x2934, 0x2510,
    0x2935, 0x2511,
    0x2936, 0x2512,
    0x2937, 0x2513,
    0x2938, 0x2514,
    0x2939, 0x2515,
    0x293A, 0x2516,
    0x293B, 0x2517,
    0x293C, 0x2518,
    0x293D, 0x2519,
    0x293E, 0x251A,
    0x293F, 0x251B,
    0x2940, 0x251C,
    0x2941, 0x251D,
    0x2942, 0x251E,
    0x2943, 0x251F,
    0x2944, 0x2520,
    0x2945, 0x2521,
    0x2946, 0x2522,
    0x2947, 0x2523,
    0x2948, 0x2524,
    0x2949, 0x2525,
    0x294A, 0x2526,
    0x294B, 0x2527,
    0x294C, 0x2528,
    0x294D, 0x2529,
    0x294E, 0x252A,
    0x294F, 0x252B,
    0x2950, 0x252C,
    0x2951, 0x252D,
    0x2952, 0x252E,
    0x2953, 0x252F,
    0x2954, 0x2530,
    0x2955, 0x2531,
    0x2956, 0x2532,
    0x2957, 0x2533,
    0x2958, 0x2534,
    0x2959, 0x2535,
    0x295A, 0x2536,
    0x295B, 0x2537,
    0x295C, 0x2538,
    0x295D, 0x2539,
    0x295E, 0x253A,
    0x295F, 0x253B,
    0x2960, 0x253C,
    0x2961, 0x253D,
    0x2962, 0x253E,
    0x2963, 0x253F,
    0x2964, 0x2540,
    0x2965, 0x2541,
    0x2966, 0x2542,
    0x2967, 0x2543,
    0x2968, 0x2544,
    0x2969, 0x2545,
    0x296A, 0x2546,
    0x296B, 0x2547,
    0x296C, 0x2548,
    0x296D, 0x2549,
    0x296E, 0x254A,
    0x296F, 0x254B,
    0x2176, 0x25A0,
    0x2175, 0x25A1,
    0x2178, 0x25B2,
    0x2177, 0x25B3,
    0x2174, 0x25C6,
    0x2173, 0x25C7,
    0x2170, 0x25CB,
    0x2172, 0x25CE,
    0x2171, 0x25CF,
    0x216F, 0x2605,
    0x216E, 0x2606,
    0x2162, 0x2640,
    0x2161, 0x2642,
    0x2121, 0x3000,
    0x2122, 0x3001,
    0x2123, 0x3002,
    0x2128, 0x3003,
    0x2129, 0x3005,
    0x2134, 0x3008,
    0x2135, 0x3009,
    0x2136, 0x300A,
    0x2137, 0x300B,
    0x2138, 0x300C,
    0x2139, 0x300D,
    0x213A, 0x300E,
    0x213B, 0x300F,
    0x213E, 0x3010,
    0x213F, 0x3011,
    0x217E, 0x3013,
    0x2132, 0x3014,
    0x2133, 0x3015,
    0x213C, 0x3016,
    0x213D, 0x3017,
    0x2421, 0x3041,
    0x2422, 0x3042,
    0x2423, 0x3043,
    0x2424, 0x3044,
    0x2425, 0x3045,
    0x2426, 0x3046,
    0x2427, 0x3047,
    0x2428, 0x3048,
    0x2429, 0x3049,
    0x242A, 0x304A,
    0x242B, 0x304B,
    0x242C, 0x304C,
    0x242D, 0x304D,
    0x242E, 0x304E,
    0x242F, 0x304F,
    0x2430, 0x3050,
    0x2431, 0x3051,
    0x2432, 0x3052,
    0x2433, 0x3053,
    0x2434, 0x3054,
    0x2435, 0x3055,
    0x2436, 0x3056,
    0x2437, 0x3057,
    0x2438, 0x3058,
    0x2439, 0x3059,
    0x243A, 0x305A,
    0x243B, 0x305B,
    0x243C, 0x305C,
    0x243D, 0x305D,
    0x243E, 0x305E,
    0x243F, 0x305F,
    0x2440, 0x3060,
    0x2441, 0x3061,
    0x2442, 0x3062,
    0x2443, 0x3063,
    0x2444, 0x3064,
    0x2445, 0x3065,
    0x2446, 0x3066,
    0x2447, 0x3067,
    0x2448, 0x3068,
    0x2449, 0x3069,
    0x244A, 0x306A,
    0x244B, 0x306B,
    0x244C, 0x306C,
    0x244D, 0x306D,
    0x244E, 0x306E,
    0x244F, 0x306F,
    0x2450, 0x3070,
    0x2451, 0x3071,
    0x2452, 0x3072,
    0x2453, 0x3073,
    0x2454, 0x3074,
    0x2455, 0x3075,
    0x2456, 0x3076,
    0x2457, 0x3077,
    0x2458, 0x3078,
    0x2459, 0x3079,
    0x245A, 0x307A,
    0x245B, 0x307B,
    0x245C, 0x307C,
    0x245D, 0x307D,
    0x245E, 0x307E,
    0x245F, 0x307F,
    0x2460, 0x3080,
    0x2461, 0x3081,
    0x2462, 0x3082,
    0x2463, 0x3083,
    0x2464, 0x3084,
    0x2465, 0x3085,
    0x2466, 0x3086,
    0x2467, 0x3087,
    0x2468, 0x3088,
    0x2469, 0x3089,
    0x246A, 0x308A,
    0x246B, 0x308B,
    0x246C, 0x308C,
    0x246D, 0x308D,
    0x246E, 0x308E,
    0x246F, 0x308F,
    0x2470, 0x3090,
    0x2471, 0x3091,
    0x2472, 0x3092,
    0x2473, 0x3093,
    0x2521, 0x30A1,
    0x2522, 0x30A2,
    0x2523, 0x30A3,
    0x2524, 0x30A4,
    0x2525, 0x30A5,
    0x2526, 0x30A6,
    0x2527, 0x30A7,
    0x2528, 0x30A8,
    0x2529, 0x30A9,
    0x252A, 0x30AA,
    0x252B, 0x30AB,
    0x252C, 0x30AC,
    0x252D, 0x30AD,
    0x252E, 0x30AE,
    0x252F, 0x30AF,
    0x2530, 0x30B0,
    0x2531, 0x30B1,
    0x2532, 0x30B2,
    0x2533, 0x30B3,
    0x2534, 0x30B4,
    0x2535, 0x30B5,
    0x2536, 0x30B6,
    0x2537, 0x30B7,
    0x2538, 0x30B8,
    0x2539, 0x30B9,
    0x253A, 0x30BA,
    0x253B, 0x30BB,
    0x253C, 0x30BC,
    0x253D, 0x30BD,
    0x253E, 0x30BE,
    0x253F, 0x30BF,
    0x2540, 0x30C0,
    0x2541, 0x30C1,
    0x2542, 0x30C2,
    0x2543, 0x30C3,
    0x2544, 0x30C4,
    0x2545, 0x30C5,
    0x2546, 0x30C6,
    0x2547, 0x30C7,
    0x2548, 0x30C8,
    0x2549, 0x30C9,
    0x254A, 0x30CA,
    0x254B, 0x30CB,
    0x254C, 0x30CC,
    0x254D, 0x30CD,
    0x254E, 0x30CE,
    0x254F, 0x30CF,
    0x2550, 0x30D0,
    0x2551, 0x30D1,
    0x2552, 0x30D2,
    0x2553, 0x30D3,
    0x2554, 0x30D4,
    0x2555, 0x30D5,
    0x2556, 0x30D6,
    0x2557, 0x30D7,
    0x2558, 0x30D8,
    0x2559, 0x30D9,
    0x255A, 0x30DA,
    0x255B, 0x30DB,
    0x255C, 0x30DC,
    0x255D, 0x30DD,
    0x255E, 0x30DE,
    0x255F, 0x30DF,
    0x2560, 0x30E0,
    0x2561, 0x30E1,
    0x2562, 0x30E2,
    0x2563, 0x30E3,
    0x2564, 0x30E4,
    0x2565, 0x30E5,
    0x2566, 0x30E6,
    0x2567, 0x30E7,
    0x2568, 0x30E8,
    0x2569, 0x30E9,
    0x256A, 0x30EA,
    0x256B, 0x30EB,
    0x256C, 0x30EC,
    0x256D, 0x30ED,
    0x256E, 0x30EE,
    0x256F, 0x30EF,
    0x2570, 0x30F0,
    0x2571, 0x30F1,
    0x2572, 0x30F2,
    0x2573, 0x30F3,
    0x2574, 0x30F4,
    0x2575, 0x30F5,
    0x2576, 0x30F6,
    0x2124, 0x30FB,
    0x2845, 0x3105,
    0x2846, 0x3106,
    0x2847, 0x3107,
    0x2848, 0x3108,
    0x2849, 0x3109,
    0x284A, 0x310A,
    0x284B, 0x310B,
    0x284C, 0x310C,
    0x284D, 0x310D,
    0x284E, 0x310E,
    0x284F, 0x310F,
    0x2850, 0x3110,
    0x2851, 0x3111,
    0x2852, 0x3112,
    0x2853, 0x3113,
    0x2854, 0x3114,
    0x2855, 0x3115,
    0x2856, 0x3116,
    0x2857, 0x3117,
    0x2858, 0x3118,
    0x2859, 0x3119,
    0x285A, 0x311A,
    0x285B, 0x311B,
    0x285C, 0x311C,
    0x285D, 0x311D,
    0x285E, 0x311E,
    0x285F, 0x311F,
    0x2860, 0x3120,
    0x2861, 0x3121,
    0x2862, 0x3122,
    0x2863, 0x3123,
    0x2864, 0x3124,
    0x2865, 0x3125,
    0x2866, 0x3126,
    0x2867, 0x3127,
    0x2868, 0x3128,
    0x2869, 0x3129,
    0x2265, 0x3220,
    0x2266, 0x3221,
    0x2267, 0x3222,
    0x2268, 0x3223,
    0x2269, 0x3224,
    0x226A, 0x3225,
    0x226B, 0x3226,
    0x226C, 0x3227,
    0x226D, 0x3228,
    0x226E, 0x3229,
    0x523B, 0x4E00,
    0x3621, 0x4E01,
    0x465F, 0x4E03,
    0x4D72, 0x4E07,
    0x5549, 0x4E08,
    0x487D, 0x4E09,
    0x494F, 0x4E0A,
    0x4F42, 0x4E0B,
    0x5822, 0x4E0C,
    0x323B, 0x4E0D,
    0x536B, 0x4E0E,
    0x5824, 0x4E10,
    0x3373, 0x4E11,
    0x5728, 0x4E13,
    0x4752, 0x4E14,
    0x5827, 0x4E15,
    0x4A40, 0x4E16,
    0x4770, 0x4E18,
    0x317B, 0x4E19,
    0x5235, 0x4E1A,
    0x3454, 0x4E1B,
    0x362B, 0x4E1C,
    0x4B3F, 0x4E1D,
    0x5829, 0x4E1E,
    0x362A, 0x4E22,
    0x413D, 0x4E24,
    0x514F, 0x4E25,
    0x4925, 0x4E27,
    0x582D, 0x4E28,
    0x3876, 0x4E2A,
    0x513E, 0x4E2B,
    0x635C, 0x4E2C,
    0x5650, 0x4E2D,
    0x3761, 0x4E30,
    0x342E, 0x4E32,
    0x4159, 0x4E34,
    0x583C, 0x4E36,
    0x4D68, 0x4E38,
    0x3524, 0x4E39,
    0x4E2A, 0x4E3A,
    0x5677, 0x4E3B,
    0x4076, 0x4E3D,
    0x3E59, 0x4E3E,
    0x582F, 0x4E3F,
    0x444B, 0x4E43,
    0x3E43, 0x4E45,
    0x5831, 0x4E47,
    0x4334, 0x4E48,
    0x5265, 0x4E49,
    0x562E, 0x4E4B,
    0x4E5A, 0x4E4C,
    0x5527, 0x4E4D,
    0x3A75, 0x4E4E,
    0x3726, 0x4E4F,
    0x4056, 0x4E50,
    0x4639, 0x4E52,
    0x4552, 0x4E53,
    0x4747, 0x4E54,
    0x3954, 0x4E56,
    0x334B, 0x4E58,
    0x5252, 0x4E59,
    0x583F, 0x4E5C,
    0x3E45, 0x4E5D,
    0x4672, 0x4E5E,
    0x5232, 0x4E5F,
    0x4F30, 0x4E60,
    0x4F67, 0x4E61,
    0x4A69, 0x4E66,
    0x5840, 0x4E69,
    0x4272, 0x4E70,
    0x4252, 0x4E71,
    0x4869, 0x4E73,
    0x472C, 0x4E7E,
    0x414B, 0x4E86,
    0x5368, 0x4E88,
    0x5579, 0x4E89,
    0x4A42, 0x4E8B,
    0x367E, 0x4E8C,
    0x5821, 0x4E8D,
    0x535A, 0x4E8E,
    0x3F77, 0x4E8F,
    0x5446, 0x4E91,
    0x3B25, 0x4E92,
    0x5841, 0x4E93,
    0x4E65, 0x4E94,
    0x3E2E, 0x4E95,
    0x5828, 0x4E98,
    0x5147, 0x4E9A,
    0x5029, 0x4E9B,
    0x583D, 0x4E9F,
    0x596F, 0x4EA0,
    0x4D76, 0x4EA1,
    0x3F3A, 0x4EA2,
    0x3D3B, 0x4EA4,
    0x3A25, 0x4EA5,
    0x5260, 0x4EA6,
    0x327A, 0x4EA7,
    0x3A60, 0x4EA8,
    0x4436, 0x4EA9,
    0x4F6D, 0x4EAB,
    0x3E29, 0x4EAC,
    0x4D24, 0x4EAD,
    0x4141, 0x4EAE,
    0x4757, 0x4EB2,
    0x5971, 0x4EB3,
    0x5974, 0x4EB5,
    0x484B, 0x4EBA,
    0x5869, 0x4EBB,
    0x525A, 0x4EBF,
    0x4A32, 0x4EC0,
    0x484A, 0x4EC1,
    0x586C, 0x4EC2,
    0x586A, 0x4EC3,
    0x5846, 0x4EC4,
    0x3D76, 0x4EC5,
    0x464D, 0x4EC6,
    0x3370, 0x4EC7,
    0x586B, 0x4EC9,
    0x3D71, 0x4ECA,
    0x3D69, 0x4ECB,
    0x4854, 0x4ECD,
    0x3453, 0x4ECE,
    0x4258, 0x4ED1,
    0x3256, 0x4ED3,
    0x5750, 0x4ED4,
    0x4A4B, 0x4ED5,
    0x4B7B, 0x4ED6,
    0x554C, 0x4ED7,
    0x3836, 0x4ED8,
    0x4F49, 0x4ED9,
    0x595A, 0x4EDD,
    0x5870, 0x4EDE,
    0x472A, 0x4EDF,
    0x586E, 0x4EE1,
    0x347A, 0x4EE3,
    0x416E, 0x4EE4,
    0x5254, 0x4EE5,
    0x586D, 0x4EE8,
    0x5247, 0x4EEA,
    0x586F, 0x4EEB,
    0x4347, 0x4EEC,
    0x5176, 0x4EF0,
    0x5659, 0x4EF2,
    0x5872, 0x4EF3,
    0x5875, 0x4EF5,
    0x3C7E, 0x4EF6,
    0x3C5B, 0x4EF7,
    0x484E, 0x4EFB,
    0x375D, 0x4EFD,
    0x3742, 0x4EFF,
    0x4673, 0x4F01,
    0x5878, 0x4F09,
    0x5241, 0x4F0A,
    0x4E69, 0x4F0D,
    0x3C3F, 0x4F0E,
    0x377C, 0x4F0F,
    0x3725, 0x4F10,
    0x505D, 0x4F11,
    0x565A, 0x4F17,
    0x5345, 0x4F18,
    0x3B6F, 0x4F19,
    0x3B61, 0x4F1A,
    0x5871, 0x4F1B,
    0x4921, 0x4F1E,
    0x4E30, 0x4F1F,
    0x342B, 0x4F20,
    0x5873, 0x4F22,
    0x494B, 0x4F24,
    0x5876, 0x4F25,
    0x4257, 0x4F26,
    0x5877, 0x4F27,
    0x4E31, 0x4F2A,
    0x5879, 0x4F2B,
    0x322E, 0x4F2F,
    0x3940, 0x4F30,
    0x5923, 0x4F32,
    0x3069, 0x4F34,
    0x4166, 0x4F36,
    0x496C, 0x4F38,
    0x4B45, 0x4F3A,
    0x4B46, 0x4F3C,
    0x5924, 0x4F3D,
    0x3568, 0x4F43,
    0x352B, 0x4F46,
    0x4E3B, 0x4F4D,
    0x354D, 0x4F4E,
    0x5721, 0x4F4F,
    0x5774, 0x4F50,
    0x5353, 0x4F51,
    0x4C65, 0x4F53,
    0x3A4E, 0x4F55,
    0x5922, 0x4F57,
    0x595C, 0x4F58,
    0x5360, 0x4F59,
    0x587D, 0x4F5A,
    0x3770, 0x4F5B,
    0x5777, 0x4F5C,
    0x587E, 0x4F5D,
    0x587A, 0x4F5E,
    0x5921, 0x4F5F,
    0x4463, 0x4F60,
    0x5336, 0x4F63,
    0x5874, 0x4F64,
    0x595D, 0x4F65,
    0x587B, 0x4F67,
    0x4565, 0x4F69,
    0x4050, 0x4F6C,
    0x5170, 0x4F6F,
    0x305B, 0x4F70,
    0x3C51, 0x4F73,
    0x5926, 0x4F74,
    0x5925, 0x4F76,
    0x592C, 0x4F7B,
    0x592E, 0x4F7C,
    0x592B, 0x4F7E,
    0x4A39, 0x4F7F,
    0x5929, 0x4F83,
    0x5636, 0x4F84,
    0x335E, 0x4F88,
    0x5928, 0x4F89,
    0x407D, 0x4F8B,
    0x4A4C, 0x4F8D,
    0x592A, 0x4F8F,
    0x5927, 0x4F91,
    0x5930, 0x4F94,
    0x3631, 0x4F97,
    0x3929, 0x4F9B,
    0x5240, 0x4F9D,
    0x4F40, 0x4FA0,
    0x4242, 0x4FA3,
    0x3D44, 0x4FA5,
    0x556C, 0x4FA6,
    0x3260, 0x4FA7,
    0x4748, 0x4FA8,
    0x3F6B, 0x4FA9,
    0x592D, 0x4FAA,
    0x592F, 0x4FAC,
    0x4E6A, 0x4FAE,
    0x3A6E, 0x4FAF,
    0x4756, 0x4FB5,
    0x3163, 0x4FBF,
    0x3459, 0x4FC3,
    0x366D, 0x4FC4,
    0x5934, 0x4FC5,
    0x3F21, 0x4FCA,
    0x595E, 0x4FCE,
    0x474E, 0x4FCF,
    0x407E, 0x4FD0,
    0x5938, 0x4FD1,
    0x4B57, 0x4FD7,
    0x377D, 0x4FD8,
    0x5935, 0x4FDA,
    0x5937, 0x4FDC,
    0x3123, 0x4FDD,
    0x5361, 0x4FDE,
    0x5939, 0x4FDF,
    0x5045, 0x4FE1,
    0x5936, 0x4FE3,
    0x5931, 0x4FE6,
    0x5932, 0x4FE8,
    0x4129, 0x4FE9,
    0x5933, 0x4FEA,
    0x3C73, 0x4FED,
    0x505E, 0x4FEE,
    0x3829, 0x4FEF,
    0x3E63, 0x4FF1,
    0x593D, 0x4FF3,
    0x593A, 0x4FF8,
    0x3033, 0x4FFA,
    0x5942, 0x4FFE,
    0x5944, 0x500C,
    0x3136, 0x500D,
    0x593F, 0x500F,
    0x3539, 0x5012,
    0x3E73, 0x5014,
    0x4C48, 0x5018,
    0x3A72, 0x5019,
    0x5250, 0x501A,
    0x5943, 0x501C,
    0x3D68, 0x501F,
    0x332B, 0x5021,
    0x5945, 0x5025,
    0x3E6B, 0x5026,
    0x5946, 0x5028,
    0x593B, 0x5029,
    0x445F, 0x502A,
    0x593E, 0x502C,
    0x5941, 0x502D,
    0x5940, 0x502E,
    0x552E, 0x503A,
    0x5635, 0x503C,
    0x4763, 0x503E,
    0x5948, 0x5043,
    0x3C59, 0x5047,
    0x594A, 0x5048,
    0x593C, 0x504C,
    0x594B, 0x504E,
    0x462B, 0x504F,
    0x5949, 0x5055,
    0x5776, 0x505A,
    0x4D23, 0x505C,
    0x3D21, 0x5065,
    0x594C, 0x506C,
    0x453C, 0x5076,
    0x4D35, 0x5077,
    0x594D, 0x507B,
    0x5947, 0x507E,
    0x3325, 0x507F,
    0x3F7E, 0x5080,
    0x3835, 0x5085,
    0x407C, 0x5088,
    0x3078, 0x508D,
    0x3476, 0x50A3,
    0x594E, 0x50A5,
    0x594F, 0x50A7,
    0x3422, 0x50A8,
    0x5950, 0x50A9,
    0x345F, 0x50AC,
    0x3041, 0x50B2,
    0x5951, 0x50BA,
    0x4935, 0x50BB,
    0x4F71, 0x50CF,
    0x5952, 0x50D6,
    0x4145, 0x50DA,
    0x5956, 0x50E6,
    0x492E, 0x50E7,
    0x5955, 0x50EC,
    0x5954, 0x50ED,
    0x5957, 0x50EE,
    0x4B5B, 0x50F3,
    0x3D29, 0x50F5,
    0x4627, 0x50FB,
    0x5953, 0x5106,
    0x5958, 0x5107,
    0x5959, 0x510B,
    0x4865, 0x5112,
    0x405C, 0x5121,
    0x3679, 0x513F,
    0x5823, 0x5140,
    0x544A, 0x5141,
    0x542A, 0x5143,
    0x5056, 0x5144,
    0x3364, 0x5145,
    0x5557, 0x5146,
    0x4F48, 0x5148,
    0x3962, 0x5149,
    0x3F4B, 0x514B,
    0x4362, 0x514D,
    0x3652, 0x5151,
    0x4D43, 0x5154,
    0x596E, 0x5155,
    0x5970, 0x5156,
    0x3533, 0x515A,
    0x3635, 0x515C,
    0x3E24, 0x5162,
    0x486B, 0x5165,
    0x482B, 0x5168,
    0x304B, 0x516B,
    0x392B, 0x516C,
    0x4179, 0x516D,
    0x5962, 0x516E,
    0x403C, 0x5170,
    0x3932, 0x5171,
    0x3958, 0x5173,
    0x504B, 0x5174,
    0x3178, 0x5175,
    0x4664, 0x5176,
    0x3E5F, 0x5177,
    0x3564, 0x5178,
    0x5748, 0x5179,
    0x5178, 0x517B,
    0x3C66, 0x517C,
    0x4A5E, 0x517D,
    0x3C3D, 0x5180,
    0x5966, 0x5181,
    0x5867, 0x5182,
    0x445A, 0x5185,
    0x3854, 0x5188,
    0x483D, 0x5189,
    0x3261, 0x518C,
    0x5459, 0x518D,
    0x4330, 0x5192,
    0x4361, 0x5195,
    0x5A22, 0x5196,
    0x485F, 0x5197,
    0x5034, 0x5199,
    0x3E7C, 0x519B,
    0x4529, 0x519C,
    0x395A, 0x51A0,
    0x5A23, 0x51A2,
    0x5429, 0x51A4,
    0x5A24, 0x51A5,
    0x597B, 0x51AB,
    0x362C, 0x51AC,
    0x376B, 0x51AF,
    0x3179, 0x51B0,
    0x597C, 0x51B1,
    0x3365, 0x51B2,
    0x3E76, 0x51B3,
    0x3F76, 0x51B5,
    0x5231, 0x51B6,
    0x4064, 0x51B7,
    0x3633, 0x51BB,
    0x597E, 0x51BC,
    0x597D, 0x51BD,
    0x3E3B, 0x51C0,
    0x4660, 0x51C4,
    0x573C, 0x51C6,
    0x5A21, 0x51C7,
    0x4139, 0x51C9,
    0x3572, 0x51CB,
    0x4168, 0x51CC,
    0x3C75, 0x51CF,
    0x3455, 0x51D1,
    0x415D, 0x51DB,
    0x447D, 0x51DD,
    0x3C38, 0x51E0,
    0x3732, 0x51E1,
    0x376F, 0x51E4,
    0x596C, 0x51EB,
    0x463E, 0x51ED,
    0x3F2D, 0x51EF,
    0x3B4B, 0x51F0,
    0x354A, 0x51F3,
    0x5B49, 0x51F5,
    0x5057, 0x51F6,
    0x4D39, 0x51F8,
    0x303C, 0x51F9,
    0x3376, 0x51FA,
    0x3B77, 0x51FB,
    0x5B4A, 0x51FC,
    0x3A2F, 0x51FD,
    0x5464, 0x51FF,
    0x3536, 0x5200,
    0x3573, 0x5201,
    0x5856, 0x5202,
    0x4850, 0x5203,
    0x3756, 0x5206,
    0x4750, 0x5207,
    0x5857, 0x5208,
    0x3F2F, 0x520A,
    0x5B3B, 0x520D,
    0x5858, 0x520E,
    0x504C, 0x5211,
    0x3B2E, 0x5212,
    0x6B3E, 0x5216,
    0x4150, 0x5217,
    0x4175, 0x5218,
    0x5472, 0x5219,
    0x3855, 0x521A,
    0x3434, 0x521B,
    0x3375, 0x521D,
    0x493E, 0x5220,
    0x4550, 0x5224,
    0x4559, 0x5228,
    0x407B, 0x5229,
    0x3170, 0x522B,
    0x5859, 0x522D,
    0x394E, 0x522E,
    0x353D, 0x5230,
    0x585A, 0x5233,
    0x5646, 0x5236,
    0x4B22, 0x5237,
    0x482F, 0x5238,
    0x4932, 0x5239,
    0x344C, 0x523A,
    0x3F4C, 0x523B,
    0x3974, 0x523D,
    0x585B, 0x523F,
    0x585C, 0x5240,
    0x3667, 0x5241,
    0x3C41, 0x5242,
    0x4C6A, 0x5243,
    0x4F77, 0x524A,
    0x585D, 0x524C,
    0x4730, 0x524D,
    0x3950, 0x5250,
    0x3D23, 0x5251,
    0x4C5E, 0x5254,
    0x464A, 0x5256,
    0x5860, 0x525C,
    0x585E, 0x525E,
    0x585F, 0x5261,
    0x307E, 0x5265,
    0x3E67, 0x5267,
    0x4A23, 0x5269,
    0x3C74, 0x526A,
    0x3831, 0x526F,
    0x386E, 0x5272,
    0x5862, 0x527D,
    0x3D4B, 0x527F,
    0x5864, 0x5281,
    0x5863, 0x5282,
    0x457C, 0x5288,
    0x5865, 0x5290,
    0x5866, 0x5293,
    0x4126, 0x529B,
    0x4830, 0x529D,
    0x306C, 0x529E,
    0x3926, 0x529F,
    0x3C53, 0x52A0,
    0x4E71, 0x52A1,
    0x5B3D, 0x52A2,
    0x4153, 0x52A3,
    0x362F, 0x52A8,
    0x567A, 0x52A9,
    0x452C, 0x52AA,
    0x3D59, 0x52AB,
    0x5B3E, 0x52AC,
    0x5B3F, 0x52AD,
    0x4078, 0x52B1,
    0x3E22, 0x52B2,
    0x404D, 0x52B3,
    0x5B40, 0x52BE,
    0x4A46, 0x52BF,
    0x322A, 0x52C3,
    0x5342, 0x52C7,
    0x4363, 0x52C9,
    0x512B, 0x52CB,
    0x5B42, 0x52D0,
    0x4055, 0x52D2,
    0x5B43, 0x52D6,
    0x3F31, 0x52D8,
    0x443C, 0x52DF,
    0x475A, 0x52E4,
    0x5B44, 0x52F0,
    0x5968, 0x52F9,
    0x4957, 0x52FA,
    0x3934, 0x52FE,
    0x4E70, 0x52FF,
    0x5448, 0x5300,
    0x307C, 0x5305,
    0x3452, 0x5306,
    0x5059, 0x5308,
    0x5969, 0x530D,
    0x5E4B, 0x530F,
    0x596B, 0x5310,
    0x5830, 0x5315,
    0x3B2F, 0x5316,
    0x3131, 0x5317,
    0x3357, 0x5319,
    0x584E, 0x531A,
    0x5451, 0x531D,
    0x3D33, 0x5320,
    0x3F6F, 0x5321,
    0x4F3B, 0x5323,
    0x5850, 0x5326,
    0x374B, 0x532A,
    0x5851, 0x532E,
    0x4625, 0x5339,
    0x4778, 0x533A,
    0x523D, 0x533B,
    0x5852, 0x533E,
    0x4464, 0x533F,
    0x4A2E, 0x5341,
    0x4727, 0x5343,
    0x5826, 0x5345,
    0x497D, 0x5347,
    0x4E67, 0x5348,
    0x3B5C, 0x5349,
    0x306B, 0x534A,
    0x3B2A, 0x534E,
    0x502D, 0x534F,
    0x3130, 0x5351,
    0x5764, 0x5352,
    0x573F, 0x5353,
    0x3525, 0x5355,
    0x4274, 0x5356,
    0x444F, 0x5357,
    0x3229, 0x535A,
    0x3237, 0x535C,
    0x3165, 0x535E,
    0x5F32, 0x535F,
    0x553C, 0x5360,
    0x3F28, 0x5361,
    0x422C, 0x5362,
    0x5855, 0x5363,
    0x4231, 0x5364,
    0x5854, 0x5366,
    0x4E54, 0x5367,
    0x5A60, 0x5369,
    0x4E40, 0x536B,
    0x5834, 0x536E,
    0x432E, 0x536F,
    0x5321, 0x5370,
    0x4E23, 0x5371,
    0x3C34, 0x5373,
    0x4834, 0x5374,
    0x4251, 0x5375,
    0x3E6D, 0x5377,
    0x5036, 0x5378,
    0x5A61, 0x537A,
    0x4764, 0x537F,
    0x3327, 0x5382,
    0x3672, 0x5384,
    0x4C7C, 0x5385,
    0x407A, 0x5386,
    0x4077, 0x5389,
    0x5139, 0x538B,
    0x5161, 0x538C,
    0x5847, 0x538D,
    0x325E, 0x5395,
    0x4065, 0x5398,
    0x3A71, 0x539A,
    0x5848, 0x539D,
    0x542D, 0x539F,
    0x4F61, 0x53A2,
    0x5849, 0x53A3,
    0x584A, 0x53A5,
    0x4F43, 0x53A6,
    0x3378, 0x53A8,
    0x3E47, 0x53A9,
    0x584B, 0x53AE,
    0x5B4C, 0x53B6,
    0x4825, 0x53BB,
    0x4F58, 0x53BF,
    0x487E, 0x53C1,
    0x324E, 0x53C2,
    0x5356, 0x53C8,
    0x3266, 0x53C9,
    0x3C30, 0x53CA,
    0x5351, 0x53CB,
    0x4B2B, 0x53CC,
    0x3734, 0x53CD,
    0x3722, 0x53D1,
    0x4A65, 0x53D4,
    0x4821, 0x53D6,
    0x4A5C, 0x53D7,
    0x3164, 0x53D8,
    0x5070, 0x53D9,
    0x4551, 0x53DB,
    0x5B45, 0x53DF,
    0x357E, 0x53E0,
    0x3F5A, 0x53E3,
    0x3945, 0x53E4,
    0x3E64, 0x53E5,
    0x416D, 0x53E6,
    0x5F36, 0x53E8,
    0x5F35, 0x53E9,
    0x563B, 0x53EA,
    0x3D50, 0x53EB,
    0x5559, 0x53EC,
    0x3048, 0x53ED,
    0x3623, 0x53EE,
    0x3F49, 0x53EF,
    0x4C28, 0x53F0,
    0x5F33, 0x53F1,
    0x4A37, 0x53F2,
    0x5352, 0x53F3,
    0x584F, 0x53F5,
    0x5236, 0x53F6,
    0x3A45, 0x53F7,
    0x4B3E, 0x53F8,
    0x4C3E, 0x53F9,
    0x5F37, 0x53FB,
    0x3570, 0x53FC,
    0x5F34, 0x53FD,
    0x5375, 0x5401,
    0x3354, 0x5403,
    0x3877, 0x5404,
    0x5F3A, 0x5406,
    0x3A4F, 0x5408,
    0x3C2A, 0x5409,
    0x3575, 0x540A,
    0x4D2C, 0x540C,
    0x437B, 0x540D,
    0x3A73, 0x540E,
    0x4074, 0x540F,
    0x4D42, 0x5410,
    0x4F72, 0x5411,
    0x5F38, 0x5412,
    0x4F45, 0x5413,
    0x4240, 0x5415,
    0x5F39, 0x5416,
    0x4270, 0x5417,
    0x3E7D, 0x541B,
    0x415F, 0x541D,
    0x4D4C, 0x541E,
    0x5277, 0x541F,
    0x374D, 0x5420,
    0x5F41, 0x5421,
    0x5F44, 0x5423,
    0x3771, 0x5426,
    0x3049, 0x5427,
    0x3656, 0x5428,
    0x3754, 0x5429,
    0x3A2C, 0x542B,
    0x4C7D, 0x542C,
    0x3F54, 0x542D,
    0x4B31, 0x542E,
    0x4674, 0x542F,
    0x5628, 0x5431,
    0x5F45, 0x5432,
    0x4E62, 0x5434,
    0x3333, 0x5435,
    0x4E7C, 0x5438,
    0x3435, 0x5439,
    0x4E47, 0x543B,
    0x3A70, 0x543C,
    0x4E61, 0x543E,
    0x513D, 0x5440,
    0x5F40, 0x5443,
    0x3474, 0x5446,
    0x334A, 0x5448,
    0x3866, 0x544A,
    0x5F3B, 0x544B,
    0x4445, 0x5450,
    0x5F3C, 0x5452,
    0x5F3D, 0x5453,
    0x5F3E, 0x5454,
    0x453B, 0x5455,
    0x5F3F, 0x5456,
    0x5F42, 0x5457,
    0x5431, 0x5458,
    0x5F43, 0x5459,
    0x473A, 0x545B,
    0x4E58, 0x545C,
    0x4458, 0x5462,
    0x5F4A, 0x5464,
    0x5F4F, 0x5466,
    0x565C, 0x5468,
    0x5F49, 0x5471,
    0x5F5A, 0x5472,
    0x4E36, 0x5473,
    0x3A47, 0x5475,
    0x5F4E, 0x5476,
    0x5F48, 0x5477,
    0x455E, 0x5478,
    0x496B, 0x547B,
    0x3A74, 0x547C,
    0x437C, 0x547D,
    0x3E57, 0x5480,
    0x5F46, 0x5482,
    0x5F4D, 0x5484,
    0x4558, 0x5486,
    0x5526, 0x548B,
    0x3A4D, 0x548C,
    0x3E4C, 0x548E,
    0x533D, 0x548F,
    0x3840, 0x5490,
    0x5664, 0x5492,
    0x5F47, 0x5494,
    0x393E, 0x5495,
    0x3F27, 0x5496,
    0x417C, 0x5499,
    0x5F4B, 0x549A,
    0x5F4C, 0x549B,
    0x5F50, 0x549D,
    0x5F5B, 0x54A3,
    0x5F65, 0x54A4,
    0x5F57, 0x54A6,
    0x5F56, 0x54A7,
    0x5749, 0x54A8,
    0x5F63, 0x54A9,
    0x5F64, 0x54AA,
    0x656B, 0x54AB,
    0x5227, 0x54AC,
    0x5F52, 0x54AD,
    0x3F29, 0x54AF,
    0x545B, 0x54B1,
    0x3F48, 0x54B3,
    0x5F54, 0x54B4,
    0x4F4C, 0x54B8,
    0x5F5D, 0x54BB,
    0x514A, 0x54BD,
    0x5F5E, 0x54BF,
    0x3027, 0x54C0,
    0x4637, 0x54C1,
    0x5F53, 0x54C2,
    0x3A65, 0x54C4,
    0x365F, 0x54C6,
    0x4D5B, 0x54C7,
    0x397E, 0x54C8,
    0x5455, 0x54C9,
    0x5F5F, 0x54CC,
    0x4F6C, 0x54CD,
    0x3025, 0x54CE,
    0x5F67, 0x54CF,
    0x5F51, 0x54D0,
    0x5146, 0x54D1,
    0x5F55, 0x54D2,
    0x5F58, 0x54D3,
    0x5F59, 0x54D4,
    0x5F5C, 0x54D5,
    0x3B29, 0x54D7,
    0x5F60, 0x54D9,
    0x5F61, 0x54DA,
    0x5F62, 0x54DC,
    0x5F66, 0x54DD,
    0x5F68, 0x54DE,
    0x5334, 0x54DF,
    0x3867, 0x54E5,
    0x4536, 0x54E6,
    0x5F6A, 0x54E7,
    0x495A, 0x54E8,
    0x4128, 0x54E9,
    0x4444, 0x54EA,
    0x3F5E, 0x54ED,
    0x4F78, 0x54EE,
    0x555C, 0x54F2,
    0x5F6E, 0x54F3,
    0x3238, 0x54FA,
    0x3A5F, 0x54FC,
    0x5F6C, 0x54FD,
    0x5B41, 0x54FF,
    0x5164, 0x5501,
    0x4B74, 0x5506,
    0x343D, 0x5507,
    0x3026, 0x5509,
    0x5F71, 0x550F,
    0x4C46, 0x5510,
    0x5F72, 0x5511,
    0x5F6D, 0x5514,
    0x5F69, 0x551B,
    0x5F6B, 0x5520,
    0x5F6F, 0x5522,
    0x5F70, 0x5523,
    0x3B3D, 0x5524,
    0x5F73, 0x5527,
    0x5F74, 0x552A,
    0x3B23, 0x552C,
    0x4A5B, 0x552E,
    0x4E28, 0x552F,
    0x6027, 0x5530,
    0x332A, 0x5531,
    0x6026, 0x5533,
    0x6021, 0x5537,
    0x5F7E, 0x553C,
    0x4D59, 0x553E,
    0x5F7C, 0x553F,
    0x5F7A, 0x5541,
    0x3F50, 0x5543,
    0x5744, 0x5544,
    0x494C, 0x5546,
    0x5F78, 0x5549,
    0x3021, 0x554A,
    0x5F7D, 0x5550,
    0x5F7B, 0x5555,
    0x6022, 0x5556,
    0x6028, 0x555C,
    0x3748, 0x5561,
    0x4621, 0x5564,
    0x4936, 0x5565,
    0x4032, 0x5566,
    0x5F75, 0x5567,
    0x453E, 0x556A,
    0x5844, 0x556C,
    0x5F79, 0x556D,
    0x4476, 0x556E,
    0x6023, 0x5575,
    0x6024, 0x5576,
    0x6025, 0x5577,
    0x5025, 0x5578,
    0x6034, 0x557B,
    0x4C64, 0x557C,
    0x6031, 0x557E,
    0x3F26, 0x5580,
    0x602F, 0x5581,
    0x4E39, 0x5582,
    0x602B, 0x5583,
    0x4946, 0x5584,
    0x402E, 0x5587,
    0x602E, 0x5588,
    0x3A6D, 0x5589,
    0x3A30, 0x558A,
    0x6029, 0x558B,
    0x5F76, 0x558F,
    0x6033, 0x5591,
    0x6038, 0x5594,
    0x342D, 0x5598,
    0x6039, 0x5599,
    0x4F32, 0x559C,
    0x3A48, 0x559D,
    0x6030, 0x559F,
    0x507A, 0x55A7,
    0x602C, 0x55B1,
    0x547B, 0x55B3,
    0x5F77, 0x55B5,
    0x4567, 0x55B7,
    0x602D, 0x55B9,
    0x5377, 0x55BB,
    0x6036, 0x55BD,
    0x6037, 0x55BE,
    0x6044, 0x55C4,
    0x5061, 0x55C5,
    0x603C, 0x55C9,
    0x6049, 0x55CC,
    0x604A, 0x55CD,
    0x603E, 0x55D1,
    0x602A, 0x55D2,
    0x4924, 0x55D3,
    0x6041, 0x55D4,
    0x6032, 0x55D6,
    0x4A48, 0x55DC,
    0x6043, 0x55DD,
    0x6035, 0x55DF,
    0x4E4B, 0x55E1,
    0x4B43, 0x55E3,
    0x604D, 0x55E4,
    0x6046, 0x55E5,
    0x6042, 0x55E6,
    0x604B, 0x55E8,
    0x603A, 0x55EA,
    0x603F, 0x55EB,
    0x6040, 0x55EC,
    0x6045, 0x55EF,
    0x6047, 0x55F2,
    0x6048, 0x55F3,
    0x604C, 0x55F5,
    0x603B, 0x55F7,
    0x4B54, 0x55FD,
    0x6055, 0x55FE,
    0x6056, 0x5600,
    0x6052, 0x5601,
    0x6050, 0x5608,
    0x3C4E, 0x5609,
    0x6051, 0x560C,
    0x3842, 0x560E,
    0x5845, 0x560F,
    0x506A, 0x5618,
    0x426F, 0x561B,
    0x604F, 0x561E,
    0x603D, 0x561F,
    0x6054, 0x5623,
    0x6053, 0x5624,
    0x6057, 0x5627,
    0x605C, 0x562C,
    0x6058, 0x562D,
    0x5676, 0x5631,
    0x3330, 0x5632,
    0x576C, 0x5634,
    0x4B3B, 0x5636,
    0x605A, 0x5639,
    0x4E7B, 0x563B,
    0x3A59, 0x563F,
    0x6061, 0x564C,
    0x605D, 0x564D,
    0x522D, 0x564E,
    0x6062, 0x5654,
    0x605B, 0x5657,
    0x6059, 0x5658,
    0x605F, 0x5659,
    0x6060, 0x565C,
    0x605E, 0x5662,
    0x6064, 0x5664,
    0x4677, 0x5668,
    0x582C, 0x5669,
    0x546B, 0x566A,
    0x6066, 0x566B,
    0x4A49, 0x566C,
    0x6065, 0x5671,
    0x3841, 0x5676,
    0x6067, 0x567B,
    0x6068, 0x567C,
    0x6069, 0x5685,
    0x6063, 0x5686,
    0x3A3F, 0x568E,
    0x4C67, 0x568F,
    0x606A, 0x5693,
    0x4F79, 0x56A3,
    0x606B, 0x56AF,
    0x4842, 0x56B7,
    0x3D40, 0x56BC,
    0x4452, 0x56CA,
    0x606C, 0x56D4,
    0x606D, 0x56D7,
    0x4774, 0x56DA,
    0x4B44, 0x56DB,
    0x606E, 0x56DD,
    0x3B58, 0x56DE,
    0x5836, 0x56DF,
    0x5272, 0x56E0,
    0x606F, 0x56E1,
    0x4D45, 0x56E2,
    0x365A, 0x56E4,
    0x6071, 0x56EB,
    0x5430, 0x56ED,
    0x4027, 0x56F0,
    0x3451, 0x56F1,
    0x4E27, 0x56F4,
    0x6070, 0x56F5,
    0x6072, 0x56F9,
    0x394C, 0x56FA,
    0x397A, 0x56FD,
    0x4D3C, 0x56FE,
    0x6073, 0x56FF,
    0x4654, 0x5703,
    0x6074, 0x5704,
    0x5432, 0x5706,
    0x4826, 0x5708,
    0x6076, 0x5709,
    0x6075, 0x570A,
    0x6077, 0x571C,
    0x4D41, 0x571F,
    0x4A25, 0x5723,
    0x545A, 0x5728,
    0x5B57, 0x5729,
    0x5B59, 0x572A,
    0x5B58, 0x572C,
    0x3967, 0x572D,
    0x5B5C, 0x572E,
    0x5B5D, 0x572F,
    0x3558, 0x5730,
    0x5B5A, 0x5733,
    0x5B5B, 0x5739,
    0x3321, 0x573A,
    0x5B5F, 0x573B,
    0x3B78, 0x573E,
    0x5637, 0x5740,
    0x5B60, 0x5742,
    0x3E79, 0x5747,
    0x373B, 0x574A,
    0x5B50, 0x574C,
    0x4C2E, 0x574D,
    0x3F32, 0x574E,
    0x3B35, 0x574F,
    0x5778, 0x5750,
    0x3F53, 0x5751,
    0x3F69, 0x5757,
    0x3C61, 0x575A,
    0x4C33, 0x575B,
    0x5B5E, 0x575C,
    0x3053, 0x575D,
    0x4E6B, 0x575E,
    0x3758, 0x575F,
    0x5739, 0x5760,
    0x4642, 0x5761,
    0x4024, 0x5764,
    0x4C39, 0x5766,
    0x5B67, 0x5768,
    0x5B61, 0x5769,
    0x463A, 0x576A,
    0x5B63, 0x576B,
    0x5B68, 0x576D,
    0x4577, 0x576F,
    0x5B6A, 0x5773,
    0x5B69, 0x5776,
    0x3F40, 0x5777,
    0x5B66, 0x577B,
    0x5B65, 0x577C,
    0x3439, 0x5782,
    0x402C, 0x5783,
    0x4222, 0x5784,
    0x5B62, 0x5785,
    0x5B64, 0x5786,
    0x504D, 0x578B,
    0x5B6D, 0x578C,
    0x405D, 0x5792,
    0x5B72, 0x5793,
    0x3662, 0x579B,
    0x5B73, 0x57A0,
    0x5B52, 0x57A1,
    0x3938, 0x57A2,
    0x542B, 0x57A3,
    0x5B6C, 0x57A4,
    0x3F51, 0x57A6,
    0x5B70, 0x57A7,
    0x5B51, 0x57A9,
    0x3566, 0x57AB,
    0x5B6B, 0x57AD,
    0x3F65, 0x57AE,
    0x5B6E, 0x57B2,
    0x5B71, 0x57B4,
    0x5B79, 0x57B8,
    0x3921, 0x57C2,
    0x3023, 0x57C3,
    0x4271, 0x57CB,
    0x3347, 0x57CE,
    0x5B6F, 0x57CF,
    0x5B78, 0x57D2,
    0x4652, 0x57D4,
    0x5B74, 0x57D5,
    0x5B75, 0x57D8,
    0x5B77, 0x57D9,
    0x5B76, 0x57DA,
    0x5B7E, 0x57DD,
    0x5372, 0x57DF,
    0x323A, 0x57E0,
    0x5B7D, 0x57E4,
    0x5C24, 0x57ED,
    0x5B7B, 0x57EF,
    0x5B7A, 0x57F4,
    0x5B7C, 0x57F8,
    0x4560, 0x57F9,
    0x3B79, 0x57FA,
    0x5C23, 0x57FD,
    0x5C25, 0x5800,
    0x4C43, 0x5802,
    0x3651, 0x5806,
    0x5D40, 0x5807,
    0x5C21, 0x580B,
    0x5C22, 0x580D,
    0x4735, 0x5811,
    0x3669, 0x5815,
    0x5C27, 0x5819,
    0x5C26, 0x581E,
    0x5C29, 0x5820,
    0x3124, 0x5821,
    0x354C, 0x5824,
    0x3F30, 0x582A,
    0x515F, 0x5830,
    0x3642, 0x5835,
    0x5C28, 0x5844,
    0x4B7A, 0x584C,
    0x6B73, 0x584D,
    0x4B5C, 0x5851,
    0x4B7E, 0x5854,
    0x4C41, 0x5858,
    0x487B, 0x585E,
    0x5C2A, 0x5865,
    0x4C6E, 0x586B,
    0x5C2B, 0x586C,
    0x5B53, 0x587E,
    0x5C2F, 0x5880,
    0x5C2C, 0x5881,
    0x3E33, 0x5883,
    0x4A7B, 0x5885,
    0x5C2D, 0x5889,
    0x494A, 0x5892,
    0x4439, 0x5893,
    0x473D, 0x5899,
    0x5C2E, 0x589A,
    0x5476, 0x589E,
    0x5066, 0x589F,
    0x442B, 0x58A8,
    0x3655, 0x58A9,
    0x5B54, 0x58BC,
    0x315A, 0x58C1,
    0x5B55, 0x58C5,
    0x5B56, 0x58D1,
    0x3A3E, 0x58D5,
    0x4840, 0x58E4,
    0x4A3F, 0x58EB,
    0x4849, 0x58EC,
    0x5733, 0x58EE,
    0x4979, 0x58F0,
    0x3F47, 0x58F3,
    0x3A78, 0x58F6,
    0x523C, 0x58F9,
    0x623A, 0x5902,
    0x3426, 0x5904,
    0x3138, 0x5907,
    0x3834, 0x590D,
    0x4F44, 0x590F,
    0x5967, 0x5914,
    0x4F26, 0x5915,
    0x4D62, 0x5916,
    0x596D, 0x5919,
    0x3660, 0x591A,
    0x5239, 0x591C,
    0x393B, 0x591F,
    0x6239, 0x5924,
    0x6237, 0x5925,
    0x3473, 0x5927,
    0x4C6C, 0x5929,
    0x4C2B, 0x592A,
    0x3772, 0x592B,
    0x5832, 0x592D,
    0x516B, 0x592E,
    0x3A3B, 0x592F,
    0x4A27, 0x5931,
    0x4D37, 0x5934,
    0x5244, 0x5937,
    0x3F64, 0x5938,
    0x3C50, 0x5939,
    0x3661, 0x593A,
    0x5E45, 0x593C,
    0x5E46, 0x5941,
    0x5B3C, 0x5942,
    0x5159, 0x5944,
    0x4666, 0x5947,
    0x444E, 0x5948,
    0x376E, 0x5949,
    0x375C, 0x594B,
    0x3F7C, 0x594E,
    0x5760, 0x594F,
    0x4675, 0x5951,
    0x313C, 0x5954,
    0x5E48, 0x5955,
    0x3D31, 0x5956,
    0x4C57, 0x5957,
    0x5E4A, 0x5958,
    0x5E49, 0x595A,
    0x356C, 0x5960,
    0x495D, 0x5962,
    0x3042, 0x5965,
    0x452E, 0x5973,
    0x452B, 0x5974,
    0x444C, 0x5976,
    0x3C69, 0x5978,
    0x4B7D, 0x5979,
    0x3A43, 0x597D,
    0x6579, 0x5981,
    0x4867, 0x5982,
    0x657A, 0x5983,
    0x4D7D, 0x5984,
    0x5731, 0x5986,
    0x383E, 0x5987,
    0x4268, 0x5988,
    0x4851, 0x598A,
    0x657B, 0x598D,
    0x364A, 0x5992,
    0x3C4B, 0x5993,
    0x517D, 0x5996,
    0x6621, 0x5997,
    0x436E, 0x5999,
    0x6624, 0x599E,
    0x657E, 0x59A3,
    0x6625, 0x59A4,
    0x4D57, 0x59A5,
    0x3741, 0x59A8,
    0x657C, 0x59A9,
    0x657D, 0x59AA,
    0x6623, 0x59AB,
    0x445D, 0x59AE,
    0x6628, 0x59AF,
    0x6627, 0x59B2,
    0x4343, 0x59B9,
    0x465E, 0x59BB,
    0x662A, 0x59BE,
    0x4437, 0x59C6,
    0x6622, 0x59CA,
    0x4A3C, 0x59CB,
    0x3D63, 0x59D0,
    0x3943, 0x59D1,
    0x6626, 0x59D2,
    0x5055, 0x59D3,
    0x4E2F, 0x59D4,
    0x6629, 0x59D7,
    0x6630, 0x59D8,
    0x5226, 0x59DA,
    0x3D2A, 0x59DC,
    0x662D, 0x59DD,
    0x662F, 0x59E3,
    0x4051, 0x59E5,
    0x524C, 0x59E8,
    0x3C27, 0x59EC,
    0x6631, 0x59F9,
    0x5276, 0x59FB,
    0x574B, 0x59FF,
    0x4D7E, 0x5A01,
    0x4D5E, 0x5A03,
    0x4226, 0x5A04,
    0x662B, 0x5A05,
    0x662C, 0x5A06,
    0x3D3F, 0x5A07,
    0x662E, 0x5A08,
    0x6633, 0x5A09,
    0x6632, 0x5A0C,
    0x6636, 0x5A11,
    0x6638, 0x5A13,
    0x446F, 0x5A18,
    0x4448, 0x5A1C,
    0x3E6A, 0x5A1F,
    0x496F, 0x5A20,
    0x6637, 0x5A23,
    0x3670, 0x5A25,
    0x4364, 0x5A29,
    0x5369, 0x5A31,
    0x6634, 0x5A32,
    0x6635, 0x5A34,
    0x4822, 0x5A36,
    0x663D, 0x5A3C,
    0x6639, 0x5A40,
    0x4645, 0x5A46,
    0x4D71, 0x5A49,
    0x663B, 0x5A4A,
    0x663C, 0x5A55,
    0x3B69, 0x5A5A,
    0x663E, 0x5A62,
    0x663A, 0x5A67,
    0x4037, 0x5A6A,
    0x5324, 0x5A74,
    0x663F, 0x5A75,
    0x4974, 0x5A76,
    0x6643, 0x5A77,
    0x6644, 0x5A7A,
    0x5076, 0x5A7F,
    0x433D, 0x5A92,
    0x4344, 0x5A9A,
    0x6642, 0x5A9B,
    0x6641, 0x5AAA,
    0x6647, 0x5AB2,
    0x4F31, 0x5AB3,
    0x6B74, 0x5AB5,
    0x664A, 0x5AB8,
    0x6645, 0x5ABE,
    0x3C5E, 0x5AC1,
    0x4929, 0x5AC2,
    0x3C35, 0x5AC9,
    0x4F53, 0x5ACC,
    0x6648, 0x5AD2,
    0x6649, 0x5AD4,
    0x664E, 0x5AD6,
    0x6650, 0x5AD8,
    0x6651, 0x5ADC,
    0x664B, 0x5AE0,
    0x3555, 0x5AE1,
    0x664C, 0x5AE3,
    0x664F, 0x5AE6,
    0x445B, 0x5AE9,
    0x6646, 0x5AEB,
    0x664D, 0x5AF1,
    0x6652, 0x5B09,
    0x6654, 0x5B16,
    0x6653, 0x5B17,
    0x6655, 0x5B32,
    0x5978, 0x5B34,
    0x6656, 0x5B37,
    0x6657, 0x5B40,
    0x5753, 0x5B50,
    0x665D, 0x5B51,
    0x665E, 0x5B53,
    0x3F57, 0x5B54,
    0x5450, 0x5B55,
    0x5756, 0x5B57,
    0x3466, 0x5B58,
    0x4B6F, 0x5B59,
    0x665A, 0x5B5A,
    0x5843, 0x5B5B,
    0x574E, 0x5B5C,
    0x5022, 0x5B5D,
    0x434F, 0x5B5F,
    0x665F, 0x5B62,
    0x3C3E, 0x5B63,
    0x3942, 0x5B64,
    0x665B, 0x5B65,
    0x5127, 0x5B66,
    0x3A22, 0x5B69,
    0x424F, 0x5B6A,
    0x582B, 0x5B6C,
    0x4A6B, 0x5B70,
    0x656E, 0x5B71,
    0x665C, 0x5B73,
    0x3775, 0x5B75,
    0x4866, 0x5B7A,
    0x4475, 0x5B7D,
    0x6532, 0x5B80,
    0x447E, 0x5B81,
    0x4B7C, 0x5B83,
    0x6533, 0x5B84,
    0x552C, 0x5B85,
    0x536E, 0x5B87,
    0x4A58, 0x5B88,
    0x3032, 0x5B89,
    0x4B4E, 0x5B8B,
    0x4D6A, 0x5B8C,
    0x3A6A, 0x5B8F,
    0x6535, 0x5B93,
    0x6534, 0x5B95,
    0x575A, 0x5B97,
    0x3959, 0x5B98,
    0x5666, 0x5B99,
    0x3628, 0x5B9A,
    0x4D70, 0x5B9B,
    0x524B, 0x5B9C,
    0x3126, 0x5B9D,
    0x4A35, 0x5B9E,
    0x3368, 0x5BA0,
    0x4973, 0x5BA1,
    0x3F4D, 0x5BA2,
    0x507B, 0x5BA3,
    0x4A52, 0x5BA4,
    0x6536, 0x5BA5,
    0x3B42, 0x5BA6,
    0x4F5C, 0x5BAA,
    0x392C, 0x5BAB,
    0x5457, 0x5BB0,
    0x3A26, 0x5BB3,
    0x5167, 0x5BB4,
    0x4F7C, 0x5BB5,
    0x3C52, 0x5BB6,
    0x6537, 0x5BB8,
    0x485D, 0x5BB9,
    0x3F6D, 0x5BBD,
    0x3176, 0x5BBE,
    0x4B5E, 0x5BBF,
    0x3C45, 0x5BC2,
    0x3C44, 0x5BC4,
    0x527A, 0x5BC5,
    0x435C, 0x5BC6,
    0x3F5C, 0x5BC7,
    0x383B, 0x5BCC,
    0x4342, 0x5BD0,
    0x3A2E, 0x5BD2,
    0x5422, 0x5BD3,
    0x475E, 0x5BDD,
    0x442F, 0x5BDE,
    0x326C, 0x5BDF,
    0x3951, 0x5BE1,
    0x653B, 0x5BE4,
    0x4148, 0x5BE5,
    0x552F, 0x5BE8,
    0x653C, 0x5BEE,
    0x653E, 0x5BF0,
    0x3467, 0x5BF8,
    0x3654, 0x5BF9,
    0x4B42, 0x5BFA,
    0x5130, 0x5BFB,
    0x353C, 0x5BFC,
    0x4A59, 0x5BFF,
    0x3762, 0x5C01,
    0x4964, 0x5C04,
    0x3D2B, 0x5C06,
    0x4E3E, 0x5C09,
    0x5770, 0x5C0A,
    0x5021, 0x5C0F,
    0x4959, 0x5C11,
    0x367B, 0x5C14,
    0x6658, 0x5C15,
    0x3C62, 0x5C16,
    0x333E, 0x5C18,
    0x4950, 0x5C1A,
    0x6659, 0x5C1C,
    0x3322, 0x5C1D,
    0x5E4C, 0x5C22,
    0x5348, 0x5C24,
    0x5E4D, 0x5C25,
    0x5222, 0x5C27,
    0x5E4E, 0x5C2C,
    0x3E4D, 0x5C31,
    0x5E4F, 0x5C34,
    0x4A2C, 0x5C38,
    0x527C, 0x5C39,
    0x335F, 0x5C3A,
    0x656A, 0x5C3B,
    0x4461, 0x5C3C,
    0x3E21, 0x5C3D,
    0x4E32, 0x5C3E,
    0x4472, 0x5C3F,
    0x3E56, 0x5C40,
    0x4628, 0x5C41,
    0x3263, 0x5C42,
    0x3E53, 0x5C45,
    0x477C, 0x5C48,
    0x4C6B, 0x5C49,
    0x3D6C, 0x5C4A,
    0x4E5D, 0x5C4B,
    0x4A3A, 0x5C4E,
    0x4641, 0x5C4F,
    0x656C, 0x5C50,
    0x503C, 0x5C51,
    0x5539, 0x5C55,
    0x656D, 0x5C59,
    0x4A74, 0x5C5E,
    0x4D40, 0x5C60,
    0x4245, 0x5C61,
    0x656F, 0x5C63,
    0x4244, 0x5C65,
    0x6570, 0x5C66,
    0x6578, 0x5C6E,
    0x4D4D, 0x5C6F,
    0x493D, 0x5C71,
    0x5259, 0x5C79,
    0x6128, 0x5C7A,
    0x536C, 0x5C7F,
    0x4B6A, 0x5C81,
    0x4671, 0x5C82,
    0x612C, 0x5C88,
    0x6127, 0x5C8C,
    0x6129, 0x5C8D,
    0x612A, 0x5C90,
    0x612F, 0x5C91,
    0x326D, 0x5C94,
    0x612B, 0x5C96,
    0x385A, 0x5C97,
    0x612D, 0x5C98,
    0x612E, 0x5C99,
    0x6130, 0x5C9A,
    0x353A, 0x5C9B,
    0x6131, 0x5C9C,
    0x6133, 0x5CA2,
    0x6138, 0x5CA3,
    0x5152, 0x5CA9,
    0x6136, 0x5CAB,
    0x6135, 0x5CAC,
    0x416B, 0x5CAD,
    0x6137, 0x5CB1,
    0x5440, 0x5CB3,
    0x6132, 0x5CB5,
    0x613A, 0x5CB7,
    0x3036, 0x5CB8,
    0x6134, 0x5CBD,
    0x3F79, 0x5CBF,
    0x6139, 0x5CC1,
    0x613B, 0x5CC4,
    0x613E, 0x5CCB,
    0x613C, 0x5CD2,
    0x5645, 0x5CD9,
    0x4F3F, 0x5CE1,
    0x613D, 0x5CE4,
    0x613F, 0x5CE5,
    0x424D, 0x5CE6,
    0x366B, 0x5CE8,
    0x5378, 0x5CEA,
    0x474D, 0x5CED,
    0x3765, 0x5CF0,
    0x3E7E, 0x5CFB,
    0x6140, 0x5D02,
    0x6141, 0x5D03,
    0x6147, 0x5D06,
    0x3367, 0x5D07,
    0x4669, 0x5D0E,
    0x345E, 0x5D14,
    0x5142, 0x5D16,
    0x6148, 0x5D1B,
    0x6146, 0x5D1E,
    0x6145, 0x5D24,
    0x6143, 0x5D26,
    0x6142, 0x5D27,
    0x3140, 0x5D29,
    0x5538, 0x5D2D,
    0x6144, 0x5D2E,
    0x614B, 0x5D34,
    0x614C, 0x5D3D,
    0x614A, 0x5D3E,
    0x6F7A, 0x5D47,
    0x6153, 0x5D4A,
    0x6152, 0x5D4B,
    0x4736, 0x5D4C,
    0x6149, 0x5D58,
    0x614E, 0x5D5B,
    0x6150, 0x5D5D,
    0x6154, 0x5D69,
    0x6151, 0x5D6B,
    0x614D, 0x5D6C,
    0x614F, 0x5D6F,
    0x6155, 0x5D74,
    0x6156, 0x5D82,
    0x6157, 0x5D99,
    0x6158, 0x5D9D,
    0x615A, 0x5DB7,
    0x615B, 0x5DC5,
    0x4E21, 0x5DCD,
    0x675D, 0x5DDB,
    0x3428, 0x5DDD,
    0x565D, 0x5DDE,
    0x5132, 0x5DE1,
    0x3332, 0x5DE2,
    0x3924, 0x5DE5,
    0x5773, 0x5DE6,
    0x4749, 0x5DE7,
    0x3E5E, 0x5DE8,
    0x392E, 0x5DE9,
    0x4E57, 0x5DEB,
    0x326E, 0x5DEE,
    0x5B4F, 0x5DEF,
    0x3C3A, 0x5DF1,
    0x5251, 0x5DF2,
    0x4B48, 0x5DF3,
    0x304D, 0x5DF4,
    0x4F6F, 0x5DF7,
    0x5963, 0x5DFD,
    0x3D6D, 0x5DFE,
    0x3152, 0x5E01,
    0x4A50, 0x5E02,
    0x323C, 0x5E03,
    0x4B27, 0x5E05,
    0x372B, 0x5E06,
    0x4A26, 0x5E08,
    0x4F23, 0x5E0C,
    0x6078, 0x5E0F,
    0x554A, 0x5E10,
    0x607B, 0x5E11,
    0x607A, 0x5E14,
    0x4541, 0x5E15,
    0x4C7B, 0x5E16,
    0x4131, 0x5E18,
    0x6079, 0x5E19,
    0x5663, 0x5E1A,
    0x322F, 0x5E1B,
    0x5644, 0x5E1C,
    0x355B, 0x5E1D,
    0x3478, 0x5E26,
    0x5621, 0x5E27,
    0x4F2F, 0x5E2D,
    0x306F, 0x5E2E,
    0x607C, 0x5E31,
    0x6121, 0x5E37,
    0x3323, 0x5E38,
    0x607D, 0x5E3B,
    0x607E, 0x5E3C,
    0x4331, 0x5E3D,
    0x435D, 0x5E42,
    0x6122, 0x5E44,
    0x3779, 0x5E45,
    0x3B4F, 0x5E4C,
    0x6123, 0x5E54,
    0x443B, 0x5E55,
    0x6124, 0x5E5B,
    0x6125, 0x5E5E,
    0x6126, 0x5E61,
    0x3431, 0x5E62,
    0x3849, 0x5E72,
    0x463D, 0x5E73,
    0x446A, 0x5E74,
    0x3222, 0x5E76,
    0x5052, 0x5E78,
    0x675B, 0x5E7A,
    0x3B43, 0x5E7B,
    0x5357, 0x5E7C,
    0x5344, 0x5E7D,
    0x3963, 0x5E7F,
    0x624F, 0x5E80,
    0x572F, 0x5E84,
    0x476C, 0x5E86,
    0x3153, 0x5E87,
    0x3432, 0x5E8A,
    0x6251, 0x5E8B,
    0x5072, 0x5E8F,
    0x422E, 0x5E90,
    0x6250, 0x5E91,
    0x3F62, 0x5E93,
    0x5326, 0x5E94,
    0x3557, 0x5E95,
    0x6252, 0x5E96,
    0x356A, 0x5E97,
    0x436D, 0x5E99,
    0x387D, 0x5E9A,
    0x382E, 0x5E9C,
    0x4553, 0x5E9E,
    0x374F, 0x5E9F,
    0x6254, 0x5EA0,
    0x6253, 0x5EA5,
    0x3648, 0x5EA6,
    0x5779, 0x5EA7,
    0x4D25, 0x5EAD,
    0x6258, 0x5EB3,
    0x6256, 0x5EB5,
    0x4A7C, 0x5EB6,
    0x3F35, 0x5EB7,
    0x5339, 0x5EB8,
    0x6255, 0x5EB9,
    0x6257, 0x5EBE,
    0x412E, 0x5EC9,
    0x4048, 0x5ECA,
    0x625B, 0x5ED1,
    0x625A, 0x5ED2,
    0x402A, 0x5ED3,
    0x414E, 0x5ED6,
    0x625C, 0x5EDB,
    0x625D, 0x5EE8,
    0x625E, 0x5EEA,
    0x5B48, 0x5EF4,
    0x5153, 0x5EF6,
    0x4D22, 0x5EF7,
    0x3D28, 0x5EFA,
    0x5E43, 0x5EFE,
    0x5825, 0x5EFF,
    0x3F2A, 0x5F00,
    0x5B4D, 0x5F01,
    0x526C, 0x5F02,
    0x467A, 0x5F03,
    0x452A, 0x5F04,
    0x5E44, 0x5F08,
    0x3157, 0x5F0A,
    0x5F2E, 0x5F0B,
    0x4A3D, 0x5F0F,
    0x5F31, 0x5F11,
    0x392D, 0x5F13,
    0x527D, 0x5F15,
    0x3825, 0x5F17,
    0x3A6B, 0x5F18,
    0x335A, 0x5F1B,
    0x355C, 0x5F1F,
    0x5545, 0x5F20,
    0x4356, 0x5F25,
    0x4F52, 0x5F26,
    0x3B21, 0x5F27,
    0x6573, 0x5F29,
    0x6572, 0x5F2A,
    0x6574, 0x5F2D,
    0x4D64, 0x5F2F,
    0x4875, 0x5F31,
    0x352F, 0x5F39,
    0x473F, 0x5F3A,
    0x6576, 0x5F3C,
    0x6C30, 0x5F40,
    0x6566, 0x5F50,
    0x3969, 0x5F52,
    0x3531, 0x5F53,
    0x423C, 0x5F55,
    0x6568, 0x5F56,
    0x6567, 0x5F57,
    0x6569, 0x5F58,
    0x524D, 0x5F5D,
    0x616A, 0x5F61,
    0x504E, 0x5F62,
    0x4D2E, 0x5F64,
    0x5165, 0x5F66,
    0x324A, 0x5F69,
    0x316B, 0x5F6A,
    0x3172, 0x5F6C,
    0x456D, 0x5F6D,
    0x5543, 0x5F70,
    0x5330, 0x5F71,
    0x615C, 0x5F73,
    0x615D, 0x5F77,
    0x525B, 0x5F79,
    0x3339, 0x5F7B,
    0x314B, 0x5F7C,
    0x4D79, 0x5F80,
    0x5577, 0x5F81,
    0x615E, 0x5F82,
    0x3E36, 0x5F84,
    0x347D, 0x5F85,
    0x615F, 0x5F87,
    0x3A5C, 0x5F88,
    0x6160, 0x5F89,
    0x3B32, 0x5F8A,
    0x4249, 0x5F8B,
    0x6161, 0x5F8C,
    0x506C, 0x5F90,
    0x4D3D, 0x5F92,
    0x6162, 0x5F95,
    0x3543, 0x5F97,
    0x4547, 0x5F98,
    0x6163, 0x5F99,
    0x6164, 0x5F9C,
    0x5379, 0x5FA1,
    0x6165, 0x5FA8,
    0x512D, 0x5FAA,
    0x6166, 0x5FAD,
    0x4E22, 0x5FAE,
    0x6167, 0x5FB5,
    0x3542, 0x5FB7,
    0x6168, 0x5FBC,
    0x3B55, 0x5FBD,
    0x5044, 0x5FC3,
    0x6260, 0x5FC4,
    0x3158, 0x5FC5,
    0x5264, 0x5FC6,
    0x6261, 0x5FC9,
    0x3C49, 0x5FCC,
    0x484C, 0x5FCD,
    0x6263, 0x5FCF,
    0x6C7E, 0x5FD0,
    0x6C7D, 0x5FD1,
    0x5F2F, 0x5FD2,
    0x6262, 0x5FD6,
    0x563E, 0x5FD7,
    0x4D7C, 0x5FD8,
    0x4326, 0x5FD9,
    0x6343, 0x5FDD,
    0x5652, 0x5FE0,
    0x6267, 0x5FE1,
    0x6268, 0x5FE4,
    0x5347, 0x5FE7,
    0x626C, 0x5FEA,
    0x3F6C, 0x5FEB,
    0x626D, 0x5FED,
    0x6265, 0x5FEE,
    0x3340, 0x5FF1,
    0x446E, 0x5FF5,
    0x626E, 0x5FF8,
    0x5043, 0x5FFB,
    0x3A76, 0x5FFD,
    0x6269, 0x5FFE,
    0x375E, 0x5FFF,
    0x3B33, 0x6000,
    0x4C2C, 0x6001,
    0x4B4B, 0x6002,
    0x6264, 0x6003,
    0x6266, 0x6004,
    0x626A, 0x6005,
    0x626B, 0x6006,
    0x6277, 0x600A,
    0x6274, 0x600D,
    0x5475, 0x600E,
    0x6273, 0x600F,
    0x452D, 0x6012,
    0x557A, 0x6014,
    0x4542, 0x6015,
    0x3240, 0x6016,
    0x626F, 0x6019,
    0x6272, 0x601B,
    0x412F, 0x601C,
    0x4B3C, 0x601D,
    0x3521, 0x6020,
    0x6279, 0x6021,
    0x3C31, 0x6025,
    0x6271, 0x6026,
    0x5054, 0x6027,
    0x5439, 0x6028,
    0x6275, 0x6029,
    0x3956, 0x602A,
    0x6276, 0x602B,
    0x4753, 0x602F,
    0x6270, 0x6035,
    0x575C, 0x603B,
    0x6D21, 0x603C,
    0x6278, 0x603F,
    0x6D25, 0x6041,
    0x627E, 0x6042,
    0x4A51, 0x6043,
    0x4135, 0x604B,
    0x3B50, 0x604D,
    0x3F56, 0x6050,
    0x3A63, 0x6052,
    0x4B21, 0x6055,
    0x6D26, 0x6059,
    0x6D23, 0x605A,
    0x6D22, 0x605D,
    0x3B56, 0x6062,
    0x6D27, 0x6063,
    0x5074, 0x6064,
    0x6D24, 0x6067,
    0x3A5E, 0x6068,
    0x3677, 0x6069,
    0x6321, 0x606A,
    0x3632, 0x606B,
    0x4C71, 0x606C,
    0x3927, 0x606D,
    0x4F22, 0x606F,
    0x4721, 0x6070,
    0x3F52, 0x6073,
    0x3671, 0x6076,
    0x627A, 0x6078,
    0x627B, 0x6079,
    0x627D, 0x607A,
    0x627C, 0x607B,
    0x4455, 0x607C,
    0x6322, 0x607D,
    0x5341, 0x607F,
    0x6327, 0x6083,
    0x4744, 0x6084,
    0x4F24, 0x6089,
    0x6329, 0x608C,
    0x3A37, 0x608D,
    0x6328, 0x6092,
    0x3B5A, 0x6094,
    0x6323, 0x6096,
    0x6324, 0x609A,
    0x632A, 0x609B,
    0x6326, 0x609D,
    0x4E72, 0x609F,
    0x5346, 0x60A0,
    0x3B3C, 0x60A3,
    0x5443, 0x60A6,
    0x447A, 0x60A8,
    0x6D28, 0x60AB,
    0x507C, 0x60AC,
    0x6325, 0x60AD,
    0x4375, 0x60AF,
    0x632D, 0x60B1,
    0x312F, 0x60B2,
    0x6332, 0x60B4,
    0x3C42, 0x60B8,
    0x632C, 0x60BB,
    0x353F, 0x60BC,
    0x4769, 0x60C5,
    0x6330, 0x60C6,
    0x3E2A, 0x60CA,
    0x4D6F, 0x60CB,
    0x3B73, 0x60D1,
    0x4C68, 0x60D5,
    0x632F, 0x60D8,
    0x6331, 0x60DA,
    0x4F27, 0x60DC,
    0x632E, 0x60DD,
    0x4E29, 0x60DF,
    0x3B5D, 0x60E0,
    0x356B, 0x60E6,
    0x3E65, 0x60E7,
    0x3252, 0x60E8,
    0x334D, 0x60E9,
    0x3139, 0x60EB,
    0x632B, 0x60EC,
    0x3251, 0x60ED,
    0x352C, 0x60EE,
    0x395F, 0x60EF,
    0x3668, 0x60F0,
    0x4F6B, 0x60F3,
    0x6337, 0x60F4,
    0x3B4C, 0x60F6,
    0x4847, 0x60F9,
    0x504A, 0x60FA,
    0x6338, 0x6100,
    0x336E, 0x6101,
    0x6D29, 0x6106,
    0x537A, 0x6108,
    0x5364, 0x6109,
    0x6D2A, 0x610D,
    0x6339, 0x610E,
    0x5262, 0x610F,
    0x6335, 0x6115,
    0x535E, 0x611A,
    0x3850, 0x611F,
    0x6333, 0x6120,
    0x6336, 0x6123,
    0x375F, 0x6124,
    0x6334, 0x6126,
    0x4022, 0x6127,
    0x633A, 0x612B,
    0x5438, 0x613F,
    0x3448, 0x6148,
    0x633B, 0x614A,
    0x3B45, 0x614C,
    0x4977, 0x614E,
    0x4965, 0x6151,
    0x443D, 0x6155,
    0x6D2B, 0x615D,
    0x427D, 0x6162,
    0x3B5B, 0x6167,
    0x3F2E, 0x6168,
    0x4E3F, 0x6170,
    0x633C, 0x6175,
    0x3F36, 0x6177,
    0x316F, 0x618B,
    0x5477, 0x618E,
    0x633E, 0x6194,
    0x6D2D, 0x619D,
    0x633F, 0x61A7,
    0x3A29, 0x61A8,
    0x6D2C, 0x61A9,
    0x633D, 0x61AC,
    0x6340, 0x61B7,
    0x3A36, 0x61BE,
    0x362E, 0x61C2,
    0x5038, 0x61C8,
    0x3043, 0x61CA,
    0x6D2E, 0x61CB,
    0x6D2F, 0x61D1,
    0x4041, 0x61D2,
    0x6341, 0x61D4,
    0x4533, 0x61E6,
    0x6342, 0x61F5,
    0x5C32, 0x61FF,
    0x6D30, 0x6206,
    0x386A, 0x6208,
    0x4E6C, 0x620A,
    0x6A27, 0x620B,
    0x5067, 0x620C,
    0x4A79, 0x620D,
    0x4856, 0x620E,
    0x4F37, 0x620F,
    0x3349, 0x6210,
    0x4E52, 0x6211,
    0x3D64, 0x6212,
    0x635E, 0x6215,
    0x3B72, 0x6216,
    0x6A28, 0x6217,
    0x553D, 0x6218,
    0x465D, 0x621A,
    0x6A29, 0x621B,
    0x6A2A, 0x621F,
    0x6A2C, 0x6221,
    0x6A2B, 0x6222,
    0x6A2E, 0x6224,
    0x6A2D, 0x6225,
    0x3D58, 0x622A,
    0x6A2F, 0x622C,
    0x423E, 0x622E,
    0x3441, 0x6233,
    0x3477, 0x6234,
    0x3B27, 0x6237,
    0x6C66, 0x623D,
    0x6C65, 0x623E,
    0x373F, 0x623F,
    0x4B79, 0x6240,
    0x3162, 0x6241,
    0x6C67, 0x6243,
    0x4948, 0x6247,
    0x6C68, 0x6248,
    0x6C69, 0x6249,
    0x4A56, 0x624B,
    0x5E50, 0x624C,
    0x3245, 0x624D,
    0x547A, 0x624E,
    0x464B, 0x6251,
    0x3047, 0x6252,
    0x3472, 0x6253,
    0x4853, 0x6254,
    0x4D50, 0x6258,
    0x3F38, 0x625B,
    0x3F5B, 0x6263,
    0x4724, 0x6266,
    0x5634, 0x6267,
    0x4029, 0x6269,
    0x5E51, 0x626A,
    0x4928, 0x626B,
    0x516F, 0x626C,
    0x4524, 0x626D,
    0x3067, 0x626E,
    0x3336, 0x626F,
    0x4845, 0x6270,
    0x3062, 0x6273,
    0x3776, 0x6276,
    0x457A, 0x6279,
    0x3673, 0x627C,
    0x5552, 0x627E,
    0x3350, 0x627F,
    0x3C3C, 0x6280,
    0x332D, 0x6284,
    0x3E71, 0x6289,
    0x3051, 0x628A,
    0x5256, 0x6291,
    0x4A63, 0x6292,
    0x5725, 0x6293,
    0x4D36, 0x6295,
    0x3636, 0x6296,
    0x3F39, 0x6297,
    0x555B, 0x6298,
    0x3827, 0x629A,
    0x4557, 0x629B,
    0x5E52, 0x629F,
    0x3F59, 0x62A0,
    0x4255, 0x62A1,
    0x4740, 0x62A2,
    0x3B24, 0x62A4,
    0x3128, 0x62A5,
    0x456A, 0x62A8,
    0x457B, 0x62AB,
    0x4C27, 0x62AC,
    0x3127, 0x62B1,
    0x3556, 0x62B5,
    0x4428, 0x62B9,
    0x5E53, 0x62BB,
    0x513A, 0x62BC,
    0x3369, 0x62BD,
    0x4372, 0x62BF,
    0x3777, 0x62C2,
    0x5674, 0x62C4,
    0x3523, 0x62C5,
    0x3270, 0x62C6,
    0x4434, 0x62C7,
    0x4469, 0x62C8,
    0x402D, 0x62C9,
    0x5E54, 0x62CA,
    0x3068, 0x62CC,
    0x4544, 0x62CD,
    0x4160, 0x62CE,
    0x3955, 0x62D0,
    0x3E5C, 0x62D2,
    0x4D58, 0x62D3,
    0x304E, 0x62D4,
    0x4D4F, 0x62D6,
    0x5E56, 0x62D7,
    0x3E50, 0x62D8,
    0x573E, 0x62D9,
    0x5E55, 0x62DA,
    0x5550, 0x62DB,
    0x305D, 0x62DC,
    0x4462, 0x62DF,
    0x4223, 0x62E2,
    0x3C70, 0x62E3,
    0x5335, 0x62E5,
    0x4039, 0x62E6,
    0x4521, 0x62E7,
    0x3226, 0x62E8,
    0x5471, 0x62E9,
    0x4028, 0x62EC,
    0x4A43, 0x62ED,
    0x5E57, 0x62EE,
    0x557C, 0x62EF,
    0x3930, 0x62F1,
    0x482D, 0x62F3,
    0x4B29, 0x62F4,
    0x5E59, 0x62F6,
    0x3F3D, 0x62F7,
    0x4634, 0x62FC,
    0x5727, 0x62FD,
    0x4A30, 0x62FE,
    0x4443, 0x62FF,
    0x3356, 0x6301,
    0x3952, 0x6302,
    0x5638, 0x6307,
    0x6A7C, 0x6308,
    0x3034, 0x6309,
    0x3F66, 0x630E,
    0x4C74, 0x6311,
    0x4D5A, 0x6316,
    0x563F, 0x631A,
    0x424E, 0x631B,
    0x4E4E, 0x631D,
    0x4C22, 0x631E,
    0x502E, 0x631F,
    0x4453, 0x6320,
    0x3532, 0x6321,
    0x5E58, 0x6322,
    0x5575, 0x6323,
    0x3C37, 0x6324,
    0x3B53, 0x6325,
    0x3024, 0x6328,
    0x4532, 0x632A,
    0x346C, 0x632B,
    0x5571, 0x632F,
    0x6A7D, 0x6332,
    0x5E5A, 0x6339,
    0x4D26, 0x633A,
    0x4D6C, 0x633D,
    0x4E66, 0x6342,
    0x5E5C, 0x6343,
    0x4D31, 0x6345,
    0x4026, 0x6346,
    0x573D, 0x6349,
    0x5E5B, 0x634B,
    0x3046, 0x634C,
    0x3A34, 0x634D,
    0x4953, 0x634E,
    0x4473, 0x634F,
    0x3E68, 0x6350,
    0x3236, 0x6355,
    0x404C, 0x635E,
    0x4B70, 0x635F,
    0x3C71, 0x6361,
    0x3B3B, 0x6362,
    0x3537, 0x6363,
    0x4575, 0x6367,
    0x5E66, 0x6369,
    0x5E63, 0x636D,
    0x3E5D, 0x636E,
    0x5E5F, 0x6371,
    0x3437, 0x6376,
    0x3D5D, 0x6377,
    0x5E60, 0x637A,
    0x446D, 0x637B,
    0x4F46, 0x6380,
    0x3560, 0x6382,
    0x365E, 0x6387,
    0x4A5A, 0x6388,
    0x3574, 0x6389,
    0x5E65, 0x638A,
    0x5546, 0x638C,
    0x5E61, 0x638E,
    0x4C4D, 0x638F,
    0x467E, 0x6390,
    0x4545, 0x6392,
    0x5234, 0x6396,
    0x3E72, 0x6398,
    0x4253, 0x63A0,
    0x4C3D, 0x63A2,
    0x3338, 0x63A3,
    0x3D53, 0x63A5,
    0x3F58, 0x63A7,
    0x4D46, 0x63A8,
    0x515A, 0x63A9,
    0x346B, 0x63AA,
    0x5E64, 0x63AC,
    0x5E5D, 0x63AD,
    0x5E67, 0x63AE,
    0x6A7E, 0x63B0,
    0x4230, 0x63B3,
    0x5E62, 0x63B4,
    0x5640, 0x63B7,
    0x3527, 0x63B8,
    0x3274, 0x63BA,
    0x5E68, 0x63BC,
    0x5E72, 0x63BE,
    0x5E6D, 0x63C4,
    0x5E71, 0x63C6,
    0x4860, 0x63C9,
    0x5761, 0x63CD,
    0x5E6F, 0x63CE,
    0x4368, 0x63CF,
    0x4C61, 0x63D0,
    0x3265, 0x63D2,
    0x523E, 0x63D6,
    0x5E6E, 0x63DE,
    0x5E6B, 0x63E0,
    0x4E55, 0x63E1,
    0x3427, 0x63E3,
    0x3F2B, 0x63E9,
    0x3E3E, 0x63EA,
    0x3D52, 0x63ED,
    0x5E69, 0x63F2,
    0x542E, 0x63F4,
    0x5E5E, 0x63F6,
    0x5E6A, 0x63F8,
    0x403F, 0x63FD,
    0x5E6C, 0x63FF,
    0x3273, 0x6400,
    0x3869, 0x6401,
    0x4227, 0x6402,
    0x3D41, 0x6405,
    0x5E75, 0x640B,
    0x5E78, 0x640C,
    0x322B, 0x640F,
    0x3424, 0x6410,
    0x346A, 0x6413,
    0x4926, 0x6414,
    0x5E76, 0x641B,
    0x4B51, 0x641C,
    0x3863, 0x641E,
    0x5E77, 0x6420,
    0x5E7A, 0x6421,
    0x5E79, 0x6426,
    0x4C42, 0x642A,
    0x3061, 0x642C,
    0x346E, 0x642D,
    0x653A, 0x6434,
    0x502F, 0x643A,
    0x326B, 0x643D,
    0x6B21, 0x643F,
    0x5E74, 0x6441,
    0x4963, 0x6444,
    0x5E73, 0x6445,
    0x305A, 0x6446,
    0x5221, 0x6447,
    0x3177, 0x6448,
    0x4C2F, 0x644A,
    0x5E70, 0x6452,
    0x4B24, 0x6454,
    0x552A, 0x6458,
    0x5E7B, 0x645E,
    0x345D, 0x6467,
    0x4426, 0x6469,
    0x5E7D, 0x646D,
    0x437E, 0x6478,
    0x4421, 0x6479,
    0x5F21, 0x647A,
    0x414C, 0x6482,
    0x5E7C, 0x6484,
    0x3E6F, 0x6485,
    0x4632, 0x6487,
    0x3345, 0x6491,
    0x4876, 0x6492,
    0x4B3A, 0x6495,
    0x5E7E, 0x6496,
    0x5F24, 0x6499,
    0x5732, 0x649E,
    0x3337, 0x64A4,
    0x4143, 0x64A9,
    0x474B, 0x64AC,
    0x3225, 0x64AD,
    0x3469, 0x64AE,
    0x572B, 0x64B0,
    0x446C, 0x64B5,
    0x5F22, 0x64B7,
    0x5F23, 0x64B8,
    0x5F25, 0x64BA,
    0x3A33, 0x64BC,
    0x5F26, 0x64C0,
    0x405E, 0x64C2,
    0x4943, 0x64C5,
    0x3259, 0x64CD,
    0x4766, 0x64CE,
    0x5F27, 0x64D0,
    0x475C, 0x64D2,
    0x5F28, 0x64D7,
    0x6B22, 0x64D8,
    0x4B53, 0x64DE,
    0x5F2A, 0x64E2,
    0x5F29, 0x64E4,
    0x3241, 0x64E6,
    0x454A, 0x6500,
    0x5F2B, 0x6509,
    0x545C, 0x6512,
    0x4841, 0x6518,
    0x5F2C, 0x6525,
    0x3E70, 0x652B,
    0x5F2D, 0x652E,
    0x5627, 0x652F,
    0x6A37, 0x6534,
    0x6B36, 0x6535,
    0x4A55, 0x6536,
    0x587C, 0x6538,
    0x3844, 0x6539,
    0x3925, 0x653B,
    0x3745, 0x653E,
    0x557E, 0x653F,
    0x394A, 0x6545,
    0x5027, 0x6548,
    0x744D, 0x6549,
    0x3550, 0x654C,
    0x4374, 0x654F,
    0x3E48, 0x6551,
    0x6B37, 0x6555,
    0x303D, 0x6556,
    0x3D4C, 0x6559,
    0x4132, 0x655B,
    0x3156, 0x655D,
    0x3328, 0x655E,
    0x3852, 0x6562,
    0x4922, 0x6563,
    0x3658, 0x6566,
    0x6B38, 0x656B,
    0x3E34, 0x656C,
    0x4A7D, 0x6570,
    0x4743, 0x6572,
    0x557B, 0x6574,
    0x3773, 0x6577,
    0x4E44, 0x6587,
    0x552B, 0x658B,
    0x3173, 0x658C,
    0x6C33, 0x6590,
    0x305F, 0x6591,
    0x6C35, 0x6593,
    0x3637, 0x6597,
    0x414F, 0x6599,
    0x757A, 0x659B,
    0x5031, 0x659C,
    0x5565, 0x659F,
    0x4E53, 0x65A1,
    0x3D6F, 0x65A4,
    0x3362, 0x65A5,
    0x382B, 0x65A7,
    0x5536, 0x65A9,
    0x6D3D, 0x65AB,
    0x364F, 0x65AD,
    0x4B39, 0x65AF,
    0x5042, 0x65B0,
    0x373D, 0x65B9,
    0x6C36, 0x65BC,
    0x4A29, 0x65BD,
    0x4554, 0x65C1,
    0x6C39, 0x65C3,
    0x6C38, 0x65C4,
    0x4243, 0x65C5,
    0x6C37, 0x65C6,
    0x507D, 0x65CB,
    0x6C3A, 0x65CC,
    0x6C3B, 0x65CE,
    0x5765, 0x65CF,
    0x6C3C, 0x65D2,
    0x6C3D, 0x65D6,
    0x466C, 0x65D7,
    0x4E5E, 0x65E0,
    0x3C48, 0x65E2,
    0x4855, 0x65E5,
    0x3529, 0x65E6,
    0x3E49, 0x65E7,
    0x563C, 0x65E8,
    0x5467, 0x65E9,
    0x512E, 0x65EC,
    0x5071, 0x65ED,
    0x6A38, 0x65EE,
    0x6A39, 0x65EF,
    0x6A3A, 0x65F0,
    0x3A35, 0x65F1,
    0x4A31, 0x65F6,
    0x3F75, 0x65F7,
    0x4D7A, 0x65FA,
    0x6A40, 0x6600,
    0x303A, 0x6602,
    0x6A3E, 0x6603,
    0x4025, 0x6606,
    0x6A3B, 0x660A,
    0x327D, 0x660C,
    0x4377, 0x660E,
    0x3B68, 0x660F,
    0x5257, 0x6613,
    0x4E74, 0x6614,
    0x6A3F, 0x6615,
    0x6A3C, 0x6619,
    0x6A43, 0x661D,
    0x5047, 0x661F,
    0x5333, 0x6620,
    0x343A, 0x6625,
    0x4341, 0x6627,
    0x5772, 0x6628,
    0x5551, 0x662D,
    0x4A47, 0x662F,
    0x6A45, 0x6631,
    0x6A44, 0x6634,
    0x6A47, 0x6635,
    0x6A46, 0x6636,
    0x5667, 0x663C,
    0x4F54, 0x663E,
    0x6A4B, 0x6641,
    0x3B4E, 0x6643,
    0x3D7A, 0x664B,
    0x494E, 0x664C,
    0x6A4C, 0x664F,
    0x4939, 0x6652,
    0x4F7E, 0x6653,
    0x6A4A, 0x6654,
    0x544E, 0x6655,
    0x6A4D, 0x6656,
    0x6A4F, 0x6657,
    0x4D6D, 0x665A,
    0x6A49, 0x665F,
    0x6A4E, 0x6661,
    0x4E6E, 0x6664,
    0x3B5E, 0x6666,
    0x333F, 0x6668,
    0x4655, 0x666E,
    0x3E30, 0x666F,
    0x4E7A, 0x6670,
    0x4767, 0x6674,
    0x3E27, 0x6676,
    0x6A50, 0x6677,
    0x5647, 0x667A,
    0x4140, 0x667E,
    0x545D, 0x6682,
    0x6A51, 0x6684,
    0x4F3E, 0x6687,
    0x6A52, 0x668C,
    0x4A6E, 0x6691,
    0x452F, 0x6696,
    0x3035, 0x6697,
    0x6A54, 0x669D,
    0x6A53, 0x66A7,
    0x745F, 0x66A8,
    0x443A, 0x66AE,
    0x3129, 0x66B4,
    0x655F, 0x66B9,
    0x6A55, 0x66BE,
    0x4A6F, 0x66D9,
    0x6A56, 0x66DB,
    0x6A57, 0x66DC,
    0x4658, 0x66DD,
    0x6A58, 0x66E6,
    0x6A59, 0x66E9,
    0x543B, 0x66F0,
    0x477A, 0x66F2,
    0x5237, 0x66F3,
    0x387C, 0x66F4,
    0x6A42, 0x66F7,
    0x325C, 0x66F9,
    0x427C, 0x66FC,
    0x5478, 0x66FE,
    0x4C66, 0x66FF,
    0x576E, 0x6700,
    0x5442, 0x6708,
    0x5350, 0x6709,
    0x6B43, 0x670A,
    0x4573, 0x670B,
    0x377E, 0x670D,
    0x6B54, 0x6710,
    0x4B37, 0x6714,
    0x6B5E, 0x6715,
    0x404A, 0x6717,
    0x4D7B, 0x671B,
    0x332F, 0x671D,
    0x465A, 0x671F,
    0x6B7C, 0x6726,
    0x443E, 0x6728,
    0x4E34, 0x672A,
    0x4429, 0x672B,
    0x313E, 0x672C,
    0x547D, 0x672D,
    0x4A75, 0x672F,
    0x566C, 0x6731,
    0x4653, 0x6734,
    0x3664, 0x6735,
    0x3B7A, 0x673A,
    0x5060, 0x673D,
    0x4931, 0x6740,
    0x5453, 0x6742,
    0x4828, 0x6743,
    0x384B, 0x6746,
    0x683E, 0x6748,
    0x493C, 0x6749,
    0x683B, 0x674C,
    0x406E, 0x674E,
    0x5053, 0x674F,
    0x3244, 0x6750,
    0x3465, 0x6751,
    0x683C, 0x6753,
    0x5548, 0x6756,
    0x3645, 0x675C,
    0x683D, 0x675E,
    0x4A78, 0x675F,
    0x385C, 0x6760,
    0x4C75, 0x6761,
    0x4034, 0x6765,
    0x516E, 0x6768,
    0x683F, 0x6769,
    0x6842, 0x676A,
    0x3A3C, 0x676D,
    0x312D, 0x676F,
    0x3D5C, 0x6770,
    0x6A3D, 0x6772,
    0x6843, 0x6773,
    0x6846, 0x6775,
    0x684B, 0x6777,
    0x684C, 0x677C,
    0x4B49, 0x677E,
    0x3065, 0x677F,
    0x3C2B, 0x6781,
    0x3939, 0x6784,
    0x6841, 0x6787,
    0x4D77, 0x6789,
    0x684A, 0x678B,
    0x4E76, 0x6790,
    0x556D, 0x6795,
    0x4156, 0x6797,
    0x6844, 0x6798,
    0x4336, 0x679A,
    0x397B, 0x679C,
    0x5626, 0x679D,
    0x6848, 0x679E,
    0x4A60, 0x67A2,
    0x5466, 0x67A3,
    0x6840, 0x67A5,
    0x6845, 0x67A7,
    0x6847, 0x67A8,
    0x4739, 0x67AA,
    0x3763, 0x67AB,
    0x6849, 0x67AD,
    0x3F5D, 0x67AF,
    0x6852, 0x67B0,
    0x6857, 0x67B3,
    0x6855, 0x67B5,
    0x3C5C, 0x67B6,
    0x3C4F, 0x67B7,
    0x685B, 0x67B8,
    0x685E, 0x67C1,
    0x685A, 0x67C3,
    0x317A, 0x67C4,
    0x3058, 0x67CF,
    0x4433, 0x67D0,
    0x384C, 0x67D1,
    0x4662, 0x67D2,
    0x483E, 0x67D3,
    0x4861, 0x67D4,
    0x684F, 0x67D8,
    0x6854, 0x67D9,
    0x6856, 0x67DA,
    0x3971, 0x67DC,
    0x6858, 0x67DD,
    0x5775, 0x67DE,
    0x447B, 0x67E0,
    0x685C, 0x67E2,
    0x3269, 0x67E5,
    0x6851, 0x67E9,
    0x3C6D, 0x67EC,
    0x3F42, 0x67EF,
    0x684D, 0x67F0,
    0x5679, 0x67F1,
    0x4178, 0x67F3,
    0x3271, 0x67F4,
    0x685F, 0x67FD,
    0x4A41, 0x67FF,
    0x6859, 0x6800,
    0x5524, 0x6805,
    0x316A, 0x6807,
    0x553B, 0x6808,
    0x684E, 0x6809,
    0x6850, 0x680A,
    0x3630, 0x680B,
    0x6853, 0x680C,
    0x685D, 0x680E,
    0x4038, 0x680F,
    0x4A77, 0x6811,
    0x4B28, 0x6813,
    0x465C, 0x6816,
    0x4075, 0x6817,
    0x6869, 0x681D,
    0x5023, 0x6821,
    0x6872, 0x6829,
    0x566A, 0x682A,
    0x6860, 0x6832,
    0x6861, 0x6833,
    0x5179, 0x6837,
    0x3A4B, 0x6838,
    0x3879, 0x6839,
    0x3871, 0x683C,
    0x5454, 0x683D,
    0x686F, 0x683E,
    0x686E, 0x6840,
    0x686C, 0x6841,
    0x3970, 0x6842,
    0x4C52, 0x6843,
    0x6866, 0x6844,
    0x4E26, 0x6845,
    0x3F72, 0x6846,
    0x3038, 0x6848,
    0x6871, 0x6849,
    0x6870, 0x684A,
    0x5740, 0x684C,
    0x6864, 0x684E,
    0x4D29, 0x6850,
    0x4923, 0x6851,
    0x3B38, 0x6853,
    0x3D5B, 0x6854,
    0x686A, 0x6855,
    0x6862, 0x6860,
    0x6863, 0x6861,
    0x6865, 0x6862,
    0x3535, 0x6863,
    0x6867, 0x6864,
    0x4745, 0x6865,
    0x686B, 0x6866,
    0x686D, 0x6867,
    0x3D30, 0x6868,
    0x572E, 0x6869,
    0x6878, 0x686B,
    0x6875, 0x6874,
    0x4D30, 0x6876,
    0x6876, 0x6877,
    0x413A, 0x6881,
    0x6868, 0x6883,
    0x4337, 0x6885,
    0x3070, 0x6886,
    0x6874, 0x688F,
    0x6877, 0x6893,
    0x3923, 0x6897,
    0x4952, 0x68A2,
    0x434E, 0x68A6,
    0x4E60, 0x68A7,
    0x4066, 0x68A8,
    0x4B73, 0x68AD,
    0x4C5D, 0x68AF,
    0x5035, 0x68B0,
    0x4A61, 0x68B3,
    0x6873, 0x68B5,
    0x3C6C, 0x68C0,
    0x6879, 0x68C2,
    0x435E, 0x68C9,
    0x4665, 0x68CB,
    0x3977, 0x68CD,
    0x3074, 0x68D2,
    0x5758, 0x68D5,
    0x3C2C, 0x68D8,
    0x456F, 0x68DA,
    0x4C44, 0x68E0,
    0x6926, 0x68E3,
    0x492D, 0x68EE,
    0x6922, 0x68F0,
    0x4062, 0x68F1,
    0x3F43, 0x68F5,
    0x687E, 0x68F9,
    0x3957, 0x68FA,
    0x687B, 0x68FC,
    0x6924, 0x6901,
    0x524E, 0x6905,
    0x6923, 0x690B,
    0x5632, 0x690D,
    0x5735, 0x690E,
    0x6927, 0x6910,
    0x3D37, 0x6912,
    0x687C, 0x691F,
    0x687D, 0x6920,
    0x6921, 0x6924,
    0x4D56, 0x692D,
    0x522C, 0x6930,
    0x6932, 0x6934,
    0x6929, 0x6939,
    0x342A, 0x693D,
    0x343B, 0x693F,
    0x692B, 0x6942,
    0x5028, 0x6954,
    0x6925, 0x6957,
    0x337E, 0x695A,
    0x692C, 0x695D,
    0x4063, 0x695E,
    0x692A, 0x6960,
    0x6939, 0x6963,
    0x6938, 0x6966,
    0x692E, 0x696B,
    0x687A, 0x696E,
    0x6928, 0x6971,
    0x3F2C, 0x6977,
    0x6931, 0x6978,
    0x693A, 0x6979,
    0x4225, 0x697C,
    0x692F, 0x6980,
    0x3845, 0x6982,
    0x692D, 0x6984,
    0x535C, 0x6986,
    0x6934, 0x6987,
    0x6935, 0x6988,
    0x6937, 0x6989,
    0x6947, 0x698D,
    0x4046, 0x6994,
    0x6945, 0x6995,
    0x6930, 0x6998,
    0x693B, 0x699B,
    0x3071, 0x699C,
    0x693C, 0x69A7,
    0x5525, 0x69A8,
    0x693E, 0x69AB,
    0x693F, 0x69AD,
    0x6941, 0x69B1,
    0x4171, 0x69B4,
    0x4836, 0x69B7,
    0x693D, 0x69BB,
    0x6942, 0x69C1,
    0x6943, 0x69CA,
    0x6933, 0x69CC,
    0x6936, 0x69CE,
    0x3B31, 0x69D0,
    0x6940, 0x69D4,
    0x3C77, 0x69DB,
    0x6944, 0x69DF,
    0x6946, 0x69E0,
    0x694A, 0x69ED,
    0x694E, 0x69F2,
    0x325B, 0x69FD,
    0x6948, 0x69FF,
    0x372E, 0x6A0A,
    0x694B, 0x6A17,
    0x694C, 0x6A18,
    0x5541, 0x6A1F,
    0x4423, 0x6A21,
    0x6958, 0x6A28,
    0x3A61, 0x6A2A,
    0x6949, 0x6A2F,
    0x5323, 0x6A31,
    0x6954, 0x6A35,
    0x6957, 0x6A3D,
    0x6950, 0x6A3E,
    0x694F, 0x6A44,
    0x4741, 0x6A47,
    0x6952, 0x6A50,
    0x6959, 0x6A58,
    0x3348, 0x6A59,
    0x6953, 0x6A5B,
    0x4F70, 0x6A61,
    0x694D, 0x6A65,
    0x3377, 0x6A71,
    0x6956, 0x6A79,
    0x695A, 0x6A7C,
    0x4C34, 0x6A80,
    0x4F2D, 0x6A84,
    0x6955, 0x6A8E,
    0x695C, 0x6A90,
    0x695B, 0x6A91,
    0x695E, 0x6A97,
    0x6951, 0x6AA0,
    0x695D, 0x6AA9,
    0x695F, 0x6AAB,
    0x434A, 0x6AAC,
    0x4737, 0x6B20,
    0x344E, 0x6B21,
    0x3B36, 0x6B22,
    0x5040, 0x6B23,
    0x6C23, 0x6B24,
    0x4537, 0x6B27,
    0x537B, 0x6B32,
    0x6C24, 0x6B37,
    0x6C25, 0x6B39,
    0x465B, 0x6B3A,
    0x3F6E, 0x6B3E,
    0x6C26, 0x6B43,
    0x6C27, 0x6B46,
    0x502A, 0x6B47,
    0x4738, 0x6B49,
    0x3868, 0x6B4C,
    0x6C28, 0x6B59,
    0x5639, 0x6B62,
    0x557D, 0x6B63,
    0x344B, 0x6B64,
    0x323D, 0x6B65,
    0x4E64, 0x6B66,
    0x4667, 0x6B67,
    0x4D61, 0x6B6A,
    0x3475, 0x6B79,
    0x4B40, 0x6B7B,
    0x3C5F, 0x6B7C,
    0x6962, 0x6B81,
    0x6963, 0x6B82,
    0x516A, 0x6B83,
    0x6965, 0x6B84,
    0x3479, 0x6B86,
    0x6964, 0x6B87,
    0x5133, 0x6B89,
    0x4A62, 0x6B8A,
    0x3250, 0x6B8B,
    0x6968, 0x6B8D,
    0x6966, 0x6B92,
    0x6967, 0x6B93,
    0x5633, 0x6B96,
    0x6969, 0x6B9A,
    0x696A, 0x6B9B,
    0x696B, 0x6BA1,
    0x696C, 0x6BAA,
    0x6C2F, 0x6BB3,
    0x4539, 0x6BB4,
    0x364E, 0x6BB5,
    0x5273, 0x6BB7,
    0x356E, 0x6BBF,
    0x3B59, 0x6BC1,
    0x6C31, 0x6BC2,
    0x5263, 0x6BC5,
    0x4E63, 0x6BCB,
    0x4438, 0x6BCD,
    0x433F, 0x6BCF,
    0x363E, 0x6BD2,
    0x5839, 0x6BD3,
    0x3148, 0x6BD4,
    0x314F, 0x6BD5,
    0x3151, 0x6BD6,
    0x457E, 0x6BD7,
    0x3150, 0x6BD9,
    0x432B, 0x6BDB,
    0x5531, 0x6BE1,
    0x6B24, 0x6BEA,
    0x3A41, 0x6BEB,
    0x4C3A, 0x6BEF,
    0x6B25, 0x6BF3,
    0x6B27, 0x6BF5,
    0x6B28, 0x6BF9,
    0x6B26, 0x6BFD,
    0x6B29, 0x6C05,
    0x6B2B, 0x6C06,
    0x6B2A, 0x6C07,
    0x6B2C, 0x6C0D,
    0x4A4F, 0x6C0F,
    0x5835, 0x6C10,
    0x4371, 0x6C11,
    0x4325, 0x6C13,
    0x4678, 0x6C14,
    0x6B2D, 0x6C15,
    0x444A, 0x6C16,
    0x6B2E, 0x6C18,
    0x6B2F, 0x6C19,
    0x6B30, 0x6C1A,
    0x3755, 0x6C1B,
    0x377A, 0x6C1F,
    0x6B31, 0x6C21,
    0x4762, 0x6C22,
    0x6B33, 0x6C24,
    0x3A24, 0x6C26,
    0x5175, 0x6C27,
    0x3031, 0x6C28,
    0x6B32, 0x6C29,
    0x6B34, 0x6C2A,
    0x352A, 0x6C2E,
    0x4248, 0x6C2F,
    0x4768, 0x6C30,
    0x6B35, 0x6C32,
    0x4B2E, 0x6C34,
    0x635F, 0x6C35,
    0x5340, 0x6C38,
    0x595B, 0x6C3D,
    0x4D21, 0x6C40,
    0x562D, 0x6C41,
    0x4773, 0x6C42,
    0x5960, 0x6C46,
    0x3B63, 0x6C47,
    0x3A3A, 0x6C49,
    0x6362, 0x6C4A,
    0x4F2B, 0x6C50,
    0x6360, 0x6C54,
    0x4947, 0x6C55,
    0x3A39, 0x6C57,
    0x5134, 0x6C5B,
    0x6361, 0x6C5C,
    0x486A, 0x6C5D,
    0x392F, 0x6C5E,
    0x3D2D, 0x6C5F,
    0x3358, 0x6C60,
    0x4E5B, 0x6C61,
    0x4C40, 0x6C64,
    0x6368, 0x6C68,
    0x6369, 0x6C69,
    0x4D74, 0x6C6A,
    0x4C2D, 0x6C70,
    0x3C33, 0x6C72,
    0x636A, 0x6C74,
    0x636B, 0x6C76,
    0x505A, 0x6C79,
    0x467B, 0x6C7D,
    0x375A, 0x6C7E,
    0x475F, 0x6C81,
    0x524A, 0x6C82,
    0x4E56, 0x6C83,
    0x6364, 0x6C85,
    0x636C, 0x6C86,
    0x4972, 0x6C88,
    0x3341, 0x6C89,
    0x6367, 0x6C8C,
    0x4663, 0x6C8F,
    0x6365, 0x6C90,
    0x6D33, 0x6C93,
    0x6366, 0x6C94,
    0x4933, 0x6C99,
    0x4566, 0x6C9B,
    0x3935, 0x6C9F,
    0x433B, 0x6CA1,
    0x6363, 0x6CA3,
    0x453D, 0x6CA4,
    0x4124, 0x6CA5,
    0x4259, 0x6CA6,
    0x3257, 0x6CA7,
    0x636D, 0x6CA9,
    0x3B26, 0x6CAA,
    0x442D, 0x6CAB,
    0x6370, 0x6CAD,
    0x3E5A, 0x6CAE,
    0x637B, 0x6CB1,
    0x6375, 0x6CB2,
    0x3A53, 0x6CB3,
    0x3750, 0x6CB8,
    0x534D, 0x6CB9,
    0x564E, 0x6CBB,
    0x5553, 0x6CBC,
    0x3941, 0x6CBD,
    0x5534, 0x6CBE,
    0x5158, 0x6CBF,
    0x5039, 0x6CC4,
    0x4776, 0x6CC5,
    0x482A, 0x6CC9,
    0x3234, 0x6CCA,
    0x435A, 0x6CCC,
    0x636E, 0x6CD0,
    0x637C, 0x6CD3,
    0x636F, 0x6CD4,
    0x3728, 0x6CD5,
    0x6377, 0x6CD6,
    0x6374, 0x6CD7,
    0x373A, 0x6CDB,
    0x4522, 0x6CDE,
    0x6376, 0x6CE0,
    0x455D, 0x6CE1,
    0x3228, 0x6CE2,
    0x467C, 0x6CE3,
    0x4460, 0x6CE5,
    0x5722, 0x6CE8,
    0x4061, 0x6CEA,
    0x6379, 0x6CEB,
    0x637A, 0x6CEE,
    0x637D, 0x6CEF,
    0x4C29, 0x6CF0,
    0x6373, 0x6CF1,
    0x533E, 0x6CF3,
    0x3143, 0x6CF5,
    0x6D34, 0x6CF6,
    0x6371, 0x6CF7,
    0x6372, 0x6CF8,
    0x6378, 0x6CFA,
    0x503A, 0x6CFB,
    0x4643, 0x6CFC,
    0x5473, 0x6CFD,
    0x637E, 0x6CFE,
    0x3D60, 0x6D01,
    0x6427, 0x6D04,
    0x6426, 0x6D07,
    0x5173, 0x6D0B,
    0x6423, 0x6D0C,
    0x6429, 0x6D0E,
    0x4877, 0x6D12,
    0x4F34, 0x6D17,
    0x6428, 0x6D19,
    0x642E, 0x6D1A,
    0x4265, 0x6D1B,
    0x3634, 0x6D1E,
    0x3D72, 0x6D25,
    0x6422, 0x6D27,
    0x3A69, 0x6D2A,
    0x642A, 0x6D2B,
    0x642C, 0x6D2E,
    0x367D, 0x6D31,
    0x565E, 0x6D32,
    0x6432, 0x6D33,
    0x642D, 0x6D35,
    0x6421, 0x6D39,
    0x3B6E, 0x6D3B,
    0x4D5D, 0x6D3C,
    0x4722, 0x6D3D,
    0x4549, 0x6D3E,
    0x4177, 0x6D41,
    0x6424, 0x6D43,
    0x4733, 0x6D45,
    0x3D2C, 0x6D46,
    0x3D3D, 0x6D47,
    0x6425, 0x6D48,
    0x5747, 0x6D4A,
    0x3262, 0x6D4B,
    0x642B, 0x6D4D,
    0x3C43, 0x6D4E,
    0x642F, 0x6D4F,
    0x3B6B, 0x6D51,
    0x6430, 0x6D52,
    0x4528, 0x6D53,
    0x6431, 0x6D54,
    0x5563, 0x6D59,
    0x3F23, 0x6D5A,
    0x643A, 0x6D5C,
    0x6437, 0x6D5E,
    0x643B, 0x6D60,
    0x643D, 0x6D63,
    0x4656, 0x6D66,
    0x3A46, 0x6D69,
    0x404B, 0x6D6A,
    0x3821, 0x6D6E,
    0x6434, 0x6D6F,
    0x5421, 0x6D74,
    0x3A23, 0x6D77,
    0x3D7E, 0x6D78,
    0x643C, 0x6D7C,
    0x4D3F, 0x6D82,
    0x4479, 0x6D85,
    0x4F7B, 0x6D88,
    0x4966, 0x6D89,
    0x533F, 0x6D8C,
    0x4F51, 0x6D8E,
    0x6433, 0x6D91,
    0x6438, 0x6D93,
    0x6439, 0x6D94,
    0x4C69, 0x6D95,
    0x4C4E, 0x6D9B,
    0x4054, 0x6D9D,
    0x6435, 0x6D9E,
    0x4130, 0x6D9F,
    0x6436, 0x6DA0,
    0x4E50, 0x6DA1,
    0x3B41, 0x6DA3,
    0x3553, 0x6DA4,
    0x4873, 0x6DA6,
    0x3D27, 0x6DA7,
    0x5547, 0x6DA8,
    0x492C, 0x6DA9,
    0x3822, 0x6DAA,
    0x644A, 0x6DAB,
    0x644C, 0x6DAE,
    0x5144, 0x6DAF,
    0x523A, 0x6DB2,
    0x3A2D, 0x6DB5,
    0x3A54, 0x6DB8,
    0x6443, 0x6DBF,
    0x356D, 0x6DC0,
    0x574D, 0x6DC4,
    0x6440, 0x6DC5,
    0x4F7D, 0x6DC6,
    0x643F, 0x6DC7,
    0x415C, 0x6DCB,
    0x4C4A, 0x6DCC,
    0x4A67, 0x6DD1,
    0x4457, 0x6DD6,
    0x4C54, 0x6DD8,
    0x6448, 0x6DD9,
    0x6447, 0x6DDD,
    0x6441, 0x6DDE,
    0x6444, 0x6DE0,
    0x352D, 0x6DE1,
    0x5359, 0x6DE4,
    0x6446, 0x6DE6,
    0x5279, 0x6DEB,
    0x3463, 0x6DEC,
    0x3B34, 0x6DEE,
    0x496E, 0x6DF1,
    0x343E, 0x6DF3,
    0x3B6C, 0x6DF7,
    0x514D, 0x6DF9,
    0x4C6D, 0x6DFB,
    0x6D35, 0x6DFC,
    0x4765, 0x6E05,
    0x5428, 0x6E0A,
    0x644B, 0x6E0C,
    0x5755, 0x6E0D,
    0x6442, 0x6E0E,
    0x3D25, 0x6E10,
    0x6445, 0x6E11,
    0x5366, 0x6E14,
    0x6449, 0x6E16,
    0x4978, 0x6E17,
    0x643E, 0x6E1A,
    0x5365, 0x6E1D,
    0x477E, 0x6E20,
    0x3649, 0x6E21,
    0x547C, 0x6E23,
    0x3233, 0x6E24,
    0x6457, 0x6E25,
    0x4E42, 0x6E29,
    0x644D, 0x6E2B,
    0x4E3C, 0x6E2D,
    0x385B, 0x6E2F,
    0x6456, 0x6E32,
    0x3F4A, 0x6E34,
    0x534E, 0x6E38,
    0x436C, 0x6E3A,
    0x4548, 0x6E43,
    0x6458, 0x6E44,
    0x4D44, 0x6E4D,
    0x644F, 0x6E4E,
    0x6454, 0x6E53,
    0x6455, 0x6E54,
    0x3A7E, 0x6E56,
    0x4F66, 0x6E58,
    0x553F, 0x6E5B,
    0x6452, 0x6E5F,
    0x6450, 0x6E6B,
    0x644E, 0x6E6E,
    0x4D65, 0x6E7E,
    0x4A2A, 0x6E7F,
    0x4023, 0x6E83,
    0x3D26, 0x6E85,
    0x6453, 0x6E86,
    0x3848, 0x6E89,
    0x6467, 0x6E8F,
    0x5434, 0x6E90,
    0x645B, 0x6E98,
    0x416F, 0x6E9C,
    0x6469, 0x6E9F,
    0x5267, 0x6EA2,
    0x645F, 0x6EA5,
    0x6460, 0x6EA7,
    0x4F2A, 0x6EAA,
    0x4B5D, 0x6EAF,
    0x645A, 0x6EB1,
    0x6451, 0x6EB2,
    0x6465, 0x6EB4,
    0x485C, 0x6EB6,
    0x6463, 0x6EB7,
    0x4467, 0x6EBA,
    0x6462, 0x6EBB,
    0x6461, 0x6EBD,
    0x337C, 0x6EC1,
    0x6468, 0x6EC2,
    0x3561, 0x6EC7,
    0x574C, 0x6ECB,
    0x6466, 0x6ECF,
    0x3B2C, 0x6ED1,
    0x5752, 0x6ED3,
    0x4C4F, 0x6ED4,
    0x6B78, 0x6ED5,
    0x6464, 0x6ED7,
    0x3976, 0x6EDA,
    0x564D, 0x6EDE,
    0x6459, 0x6EDF,
    0x645C, 0x6EE0,
    0x427A, 0x6EE1,
    0x645E, 0x6EE2,
    0x424B, 0x6EE4,
    0x4044, 0x6EE5,
    0x4250, 0x6EE6,
    0x3175, 0x6EE8,
    0x4C32, 0x6EE9,
    0x354E, 0x6EF4,
    0x646F, 0x6EF9,
    0x462F, 0x6F02,
    0x4661, 0x6F06,
    0x6475, 0x6F09,
    0x4229, 0x6F0F,
    0x406C, 0x6F13,
    0x515D, 0x6F14,
    0x646E, 0x6F15,
    0x442E, 0x6F20,
    0x646D, 0x6F24,
    0x6476, 0x6F29,
    0x6474, 0x6F2A,
    0x427E, 0x6F2B,
    0x645D, 0x6F2D,
    0x6470, 0x6F2F,
    0x4A7E, 0x6F31,
    0x5544, 0x6F33,
    0x6471, 0x6F36,
    0x517A, 0x6F3E,
    0x646B, 0x6F46,
    0x646C, 0x6F47,
    0x6472, 0x6F4B,
    0x4E2B, 0x6F4D,
    0x454B, 0x6F58,
    0x4731, 0x6F5C,
    0x423A, 0x6F5E,
    0x646A, 0x6F62,
    0x414A, 0x6F66,
    0x4C36, 0x6F6D,
    0x3331, 0x6F6E,
    0x647B, 0x6F72,
    0x6473, 0x6F74,
    0x647A, 0x6F78,
    0x647D, 0x6F7A,
    0x647C, 0x6F7C,
    0x334E, 0x6F84,
    0x333A, 0x6F88,
    0x6477, 0x6F89,
    0x6479, 0x6F8C,
    0x6478, 0x6F8D,
    0x456C, 0x6F8E,
    0x403D, 0x6F9C,
    0x5468, 0x6FA1,
    0x6522, 0x6FA7,
    0x3044, 0x6FB3,
    0x6524, 0x6FB6,
    0x6523, 0x6FB9,
    0x3C24, 0x6FC0,
    0x6525, 0x6FC2,
    0x6521, 0x6FC9,
    0x647E, 0x6FD1,
    0x3174, 0x6FD2,
    0x6528, 0x6FDE,
    0x6529, 0x6FE0,
    0x6526, 0x6FE1,
    0x6527, 0x6FEE,
    0x652A, 0x6FEF,
    0x4659, 0x7011,
    0x652B, 0x701A,
    0x652D, 0x701B,
    0x652C, 0x7023,
    0x652F, 0x7035,
    0x652E, 0x7039,
    0x3960, 0x704C,
    0x6530, 0x704F,
    0x6531, 0x705E,
    0x3B70, 0x706B,
    0x6C61, 0x706C,
    0x4370, 0x706D,
    0x3546, 0x706F,
    0x3B52, 0x7070,
    0x4169, 0x7075,
    0x546E, 0x7076,
    0x3E44, 0x7078,
    0x5746, 0x707C,
    0x5456, 0x707E,
    0x3253, 0x707F,
    0x6C3E, 0x7080,
    0x6A41, 0x7085,
    0x422F, 0x7089,
    0x3436, 0x708A,
    0x5157, 0x708E,
    0x3334, 0x7092,
    0x4832, 0x7094,
    0x3F3B, 0x7095,
    0x6C40, 0x7096,
    0x564B, 0x7099,
    0x6C3F, 0x709C,
    0x6C41, 0x709D,
    0x6C45, 0x70AB,
    0x3E66, 0x70AC,
    0x4C3F, 0x70AD,
    0x455A, 0x70AE,
    0x3E3C, 0x70AF,
    0x6C46, 0x70B1,
    0x317E, 0x70B3,
    0x6C44, 0x70B7,
    0x5528, 0x70B8,
    0x3563, 0x70B9,
    0x6C42, 0x70BB,
    0x4136, 0x70BC,
    0x3363, 0x70BD,
    0x6C43, 0x70C0,
    0x4B38, 0x70C1,
    0x4043, 0x70C2,
    0x4C7E, 0x70C3,
    0x4152, 0x70C8,
    0x6C48, 0x70CA,
    0x3A66, 0x70D8,
    0x4053, 0x70D9,
    0x5672, 0x70DB,
    0x514C, 0x70DF,
    0x3F3E, 0x70E4,
    0x3733, 0x70E6,
    0x4955, 0x70E7,
    0x6C47, 0x70E8,
    0x3B62, 0x70E9,
    0x4C4C, 0x70EB,
    0x3D7D, 0x70EC,
    0x4848, 0x70ED,
    0x4F29, 0x70EF,
    0x4D69, 0x70F7,
    0x456B, 0x70F9,
    0x3769, 0x70FD,
    0x5149, 0x7109,
    0x3A38, 0x710A,
    0x6C49, 0x7110,
    0x6C4A, 0x7113,
    0x3B40, 0x7115,
    0x6C4B, 0x7116,
    0x6C62, 0x7118,
    0x313A, 0x7119,
    0x3759, 0x711A,
    0x3D39, 0x7126,
    0x6C4C, 0x712F,
    0x5166, 0x7130,
    0x6C4D, 0x7131,
    0x483B, 0x7136,
    0x6C51, 0x7145,
    0x6C53, 0x714A,
    0x3B4D, 0x714C,
    0x3C65, 0x714E,
    0x6C4F, 0x715C,
    0x4937, 0x715E,
    0x433A, 0x7164,
    0x6C63, 0x7166,
    0x5555, 0x7167,
    0x6C50, 0x7168,
    0x5673, 0x716E,
    0x6C52, 0x7172,
    0x6C4E, 0x7173,
    0x6C54, 0x7178,
    0x6C55, 0x717A,
    0x493F, 0x717D,
    0x4F28, 0x7184,
    0x505C, 0x718A,
    0x512C, 0x718F,
    0x485B, 0x7194,
    0x6C56, 0x7198,
    0x4E75, 0x7199,
    0x4A6C, 0x719F,
    0x6C5A, 0x71A0,
    0x6C59, 0x71A8,
    0x303E, 0x71AC,
    0x6C57, 0x71B3,
    0x6C58, 0x71B5,
    0x6C64, 0x71B9,
    0x483C, 0x71C3,
    0x4147, 0x71CE,
    0x6C5C, 0x71D4,
    0x5160, 0x71D5,
    0x6C5B, 0x71E0,
    0x546F, 0x71E5,
    0x6C5D, 0x71E7,
    0x5B46, 0x71EE,
    0x6C5E, 0x71F9,
    0x312C, 0x7206,
    0x6C5F, 0x721D,
    0x6C60, 0x7228,
    0x5726, 0x722A,
    0x4540, 0x722C,
    0x6B3C, 0x7230,
    0x302E, 0x7231,
    0x3E74, 0x7235,
    0x3838, 0x7236,
    0x522F, 0x7237,
    0x3056, 0x7238,
    0x3579, 0x7239,
    0x5833, 0x723B,
    0x4B2C, 0x723D,
    0x635D, 0x723F,
    0x462C, 0x7247,
    0x3066, 0x7248,
    0x4546, 0x724C,
    0x6B39, 0x724D,
    0x6B3A, 0x7252,
    0x6B3B, 0x7256,
    0x5140, 0x7259,
    0x4523, 0x725B,
    0x6A72, 0x725D,
    0x4432, 0x725F,
    0x4435, 0x7261,
    0x404E, 0x7262,
    0x6A73, 0x7266,
    0x4441, 0x7267,
    0x4E6F, 0x7269,
    0x6A70, 0x726E,
    0x6A74, 0x726F,
    0x497C, 0x7272,
    0x4723, 0x7275,
    0x4C58, 0x7279,
    0x4E7E, 0x727A,
    0x6A75, 0x727E,
    0x6A76, 0x727F,
    0x4F2C, 0x7280,
    0x4067, 0x7281,
    0x6A77, 0x7284,
    0x363F, 0x728A,
    0x6A78, 0x728B,
    0x6A79, 0x728D,
    0x6A7A, 0x728F,
    0x6A7B, 0x7292,
    0x6A71, 0x729F,
    0x482E, 0x72AC,
    0x616B, 0x72AD,
    0x3738, 0x72AF,
    0x616C, 0x72B0,
    0x616D, 0x72B4,
    0x5734, 0x72B6,
    0x616E, 0x72B7,
    0x616F, 0x72B8,
    0x534C, 0x72B9,
    0x6171, 0x72C1,
    0x3F71, 0x72C2,
    0x6170, 0x72C3,
    0x3552, 0x72C4,
    0x3137, 0x72C8,
    0x6173, 0x72CD,
    0x6172, 0x72CE,
    0x3A7C, 0x72D0,
    0x6174, 0x72D2,
    0x3937, 0x72D7,
    0x3E51, 0x72D9,
    0x447C, 0x72DE,
    0x3A5D, 0x72E0,
    0x3D46, 0x72E1,
    0x6175, 0x72E8,
    0x6177, 0x72E9,
    0x3640, 0x72EC,
    0x4F41, 0x72ED,
    0x4A28, 0x72EE,
    0x6176, 0x72EF,
    0x5578, 0x72F0,
    0x537C, 0x72F1,
    0x6178, 0x72F2,
    0x617C, 0x72F3,
    0x6179, 0x72F4,
    0x617A, 0x72F7,
    0x406A, 0x72F8,
    0x617E, 0x72FA,
    0x6221, 0x72FB,
    0x4047, 0x72FC,
    0x617B, 0x7301,
    0x617D, 0x7303,
    0x6225, 0x730A,
    0x4154, 0x730E,
    0x6223, 0x7313,
    0x6228, 0x7315,
    0x327E, 0x7316,
    0x6222, 0x7317,
    0x434D, 0x731B,
    0x3242, 0x731C,
    0x6227, 0x731D,
    0x6226, 0x731E,
    0x6224, 0x7321,
    0x6229, 0x7322,
    0x622B, 0x7325,
    0x5049, 0x7329,
    0x566D, 0x732A,
    0x4328, 0x732B,
    0x622C, 0x732C,
    0x4F57, 0x732E,
    0x622E, 0x7331,
    0x3A6F, 0x7334,
    0x6960, 0x7337,
    0x622D, 0x7338,
    0x622A, 0x7339,
    0x3B2B, 0x733E,
    0x5433, 0x733F,
    0x6230, 0x734D,
    0x622F, 0x7350,
    0x6961, 0x7352,
    0x6231, 0x7357,
    0x6232, 0x7360,
    0x6233, 0x736C,
    0x4C21, 0x736D,
    0x6234, 0x736F,
    0x6235, 0x737E,
    0x507E, 0x7384,
    0x424A, 0x7387,
    0x5371, 0x7389,
    0x4D75, 0x738B,
    0x6760, 0x738E,
    0x6761, 0x7391,
    0x3E41, 0x7396,
    0x426A, 0x739B,
    0x6764, 0x739F,
    0x6763, 0x73A2,
    0x4D66, 0x73A9,
    0x4335, 0x73AB,
    0x6762, 0x73AE,
    0x3B37, 0x73AF,
    0x4F56, 0x73B0,
    0x4161, 0x73B2,
    0x6769, 0x73B3,
    0x6768, 0x73B7,
    0x6774, 0x73BA,
    0x3223, 0x73BB,
    0x676A, 0x73C0,
    0x6766, 0x73C2,
    0x676C, 0x73C8,
    0x676B, 0x73C9,
    0x493A, 0x73CA,
    0x5564, 0x73CD,
    0x6765, 0x73CF,
    0x3729, 0x73D0,
    0x6767, 0x73D1,
    0x676E, 0x73D9,
    0x6773, 0x73DE,
    0x5669, 0x73E0,
    0x676D, 0x73E5,
    0x6772, 0x73E7,
    0x6771, 0x73E9,
    0x3060, 0x73ED,
    0x6775, 0x73F2,
    0x4772, 0x7403,
    0x4045, 0x7405,
    0x406D, 0x7406,
    0x4170, 0x7409,
    0x6770, 0x740A,
    0x6776, 0x740F,
    0x4B76, 0x7410,
    0x6822, 0x741A,
    0x6821, 0x741B,
    0x5741, 0x7422,
    0x677A, 0x7425,
    0x6779, 0x7426,
    0x677B, 0x7428,
    0x6777, 0x742A,
    0x677E, 0x742C,
    0x677D, 0x742E,
    0x677C, 0x7430,
    0x4155, 0x7433,
    0x4759, 0x7434,
    0x457D, 0x7435,
    0x4543, 0x7436,
    0x476D, 0x743C,
    0x6823, 0x7441,
    0x6826, 0x7455,
    0x6825, 0x7457,
    0x6827, 0x7459,
    0x3A77, 0x745A,
    0x6778, 0x745B,
    0x6824, 0x745C,
    0x4870, 0x745E,
    0x492A, 0x745F,
    0x6829, 0x746D,
    0x3965, 0x7470,
    0x517E, 0x7476,
    0x6828, 0x7477,
    0x682A, 0x747E,
    0x682D, 0x7480,
    0x682E, 0x7481,
    0x4127, 0x7483,
    0x682F, 0x7487,
    0x6830, 0x748B,
    0x682C, 0x748E,
    0x6834, 0x7490,
    0x682B, 0x749C,
    0x6831, 0x749E,
    0x6835, 0x74A7,
    0x6832, 0x74A8,
    0x6833, 0x74A9,
    0x6837, 0x74BA,
    0x6836, 0x74D2,
    0x394F, 0x74DC,
    0x702C, 0x74DE,
    0x702D, 0x74E0,
    0x4630, 0x74E2,
    0x306A, 0x74E3,
    0x483F, 0x74E4,
    0x4D5F, 0x74E6,
    0x4E4D, 0x74EE,
    0x6A31, 0x74EF,
    0x6A32, 0x74F4,
    0x463F, 0x74F6,
    0x3449, 0x74F7,
    0x6A33, 0x74FF,
    0x5567, 0x7504,
    0x5D79, 0x750D,
    0x6A34, 0x750F,
    0x6A35, 0x7511,
    0x6A36, 0x7513,
    0x384A, 0x7518,
    0x5F30, 0x7519,
    0x4975, 0x751A,
    0x4C70, 0x751C,
    0x497A, 0x751F,
    0x497B, 0x7525,
    0x5343, 0x7528,
    0x4B26, 0x7529,
    0x3826, 0x752B,
    0x702E, 0x752C,
    0x3142, 0x752D,
    0x6538, 0x752F,
    0x4C6F, 0x7530,
    0x5349, 0x7531,
    0x3C57, 0x7532,
    0x496A, 0x7533,
    0x3567, 0x7535,
    0x4450, 0x7537,
    0x3569, 0x7538,
    0x6E2E, 0x753A,
    0x3B2D, 0x753B,
    0x675E, 0x753E,
    0x6E2F, 0x7540,
    0x3329, 0x7545,
    0x6E32, 0x7548,
    0x6E31, 0x754B,
    0x3D67, 0x754C,
    0x6E30, 0x754E,
    0x4E37, 0x754F,
    0x454F, 0x7554,
    0x4174, 0x7559,
    0x5B4E, 0x755A,
    0x6E33, 0x755B,
    0x5073, 0x755C,
    0x4254, 0x7565,
    0x4668, 0x7566,
    0x372C, 0x756A,
    0x6E34, 0x7572,
    0x336B, 0x7574,
    0x3B7B, 0x7578,
    0x6E35, 0x7579,
    0x675C, 0x757F,
    0x6E36, 0x7583,
    0x3D2E, 0x7586,
    0x7162, 0x758B,
    0x4A68, 0x758F,
    0x5249, 0x7591,
    0x705A, 0x7592,
    0x705B, 0x7594,
    0x705C, 0x7596,
    0x4146, 0x7597,
    0x386D, 0x7599,
    0x3E4E, 0x759A,
    0x705E, 0x759D,
    0x4531, 0x759F,
    0x705D, 0x75A0,
    0x5171, 0x75A1,
    0x7060, 0x75A3,
    0x304C, 0x75A4,
    0x3D6A, 0x75A5,
    0x525F, 0x75AB,
    0x705F, 0x75AC,
    0x342F, 0x75AE,
    0x3768, 0x75AF,
    0x7066, 0x75B0,
    0x7065, 0x75B1,
    0x4623, 0x75B2,
    0x7061, 0x75B3,
    0x7062, 0x75B4,
    0x3443, 0x75B5,
    0x7063, 0x75B8,
    0x556E, 0x75B9,
    0x4C5B, 0x75BC,
    0x3E52, 0x75BD,
    0x3C32, 0x75BE,
    0x7068, 0x75C2,
    0x7067, 0x75C3,
    0x7064, 0x75C4,
    0x3221, 0x75C5,
    0x5622, 0x75C7,
    0x5338, 0x75C8,
    0x3E37, 0x75C9,
    0x482C, 0x75CA,
    0x706A, 0x75CD,
    0x5177, 0x75D2,
    0x564C, 0x75D4,
    0x3A5B, 0x75D5,
    0x7069, 0x75D6,
    0x363B, 0x75D8,
    0x4D34, 0x75DB,
    0x4626, 0x75DE,
    0x4121, 0x75E2,
    0x706B, 0x75E3,
    0x706E, 0x75E4,
    0x706D, 0x75E6,
    0x7070, 0x75E7,
    0x706C, 0x75E8,
    0x3B3E, 0x75EA,
    0x706F, 0x75EB,
    0x4C35, 0x75F0,
    0x7072, 0x75F1,
    0x3355, 0x75F4,
    0x3154, 0x75F9,
    0x7073, 0x75FC,
    0x7074, 0x75FF,
    0x7076, 0x7600,
    0x3461, 0x7601,
    0x7071, 0x7603,
    0x7077, 0x7605,
    0x707A, 0x760A,
    0x7078, 0x760C,
    0x7075, 0x7610,
    0x707D, 0x7615,
    0x7079, 0x7617,
    0x707C, 0x7618,
    0x707E, 0x7619,
    0x7121, 0x761B,
    0x4E41, 0x761F,
    0x7124, 0x7620,
    0x7123, 0x7622,
    0x4176, 0x7624,
    0x707B, 0x7625,
    0x4A5D, 0x7626,
    0x3471, 0x7629,
    0x3171, 0x762A,
    0x4C31, 0x762B,
    0x7126, 0x762D,
    0x7127, 0x7630,
    0x712C, 0x7633,
    0x554E, 0x7634,
    0x7129, 0x7635,
    0x4833, 0x7638,
    0x7122, 0x763C,
    0x712B, 0x763E,
    0x7128, 0x763F,
    0x7125, 0x7640,
    0x712A, 0x7643,
    0x3029, 0x764C,
    0x712D, 0x764D,
    0x712F, 0x7654,
    0x7131, 0x7656,
    0x7130, 0x765C,
    0x712E, 0x765E,
    0x5122, 0x7663,
    0x7132, 0x766B,
    0x7133, 0x766F,
    0x396F, 0x7678,
    0x3547, 0x767B,
    0x3057, 0x767D,
    0x3059, 0x767E,
    0x546D, 0x7682,
    0x3544, 0x7684,
    0x3D54, 0x7686,
    0x3B4A, 0x7687,
    0x7027, 0x7688,
    0x385E, 0x768B,
    0x7028, 0x768E,
    0x3028, 0x7691,
    0x7029, 0x7693,
    0x4D6E, 0x7696,
    0x702A, 0x7699,
    0x702B, 0x76A4,
    0x4624, 0x76AE,
    0x5665, 0x76B1,
    0x7164, 0x76B2,
    0x7165, 0x76B4,
    0x4373, 0x76BF,
    0x535B, 0x76C2,
    0x5651, 0x76C5,
    0x4568, 0x76C6,
    0x532F, 0x76C8,
    0x5266, 0x76CA,
    0x6E41, 0x76CD,
    0x303B, 0x76CE,
    0x5535, 0x76CF,
    0x514E, 0x76D0,
    0x3C60, 0x76D1,
    0x3A50, 0x76D2,
    0x3F78, 0x76D4,
    0x3847, 0x76D6,
    0x3541, 0x76D7,
    0x454C, 0x76D8,
    0x4A22, 0x76DB,
    0x434B, 0x76DF,
    0x6E42, 0x76E5,
    0x443F, 0x76EE,
    0x3622, 0x76EF,
    0x6D6C, 0x76F1,
    0x4324, 0x76F2,
    0x5631, 0x76F4,
    0x4F60, 0x76F8,
    0x6D6F, 0x76F9,
    0x454E, 0x76FC,
    0x365C, 0x76FE,
    0x4A21, 0x7701,
    0x6D6D, 0x7704,
    0x6D70, 0x7707,
    0x6D71, 0x7708,
    0x433C, 0x7709,
    0x3F34, 0x770B,
    0x6D6E, 0x770D,
    0x6D74, 0x7719,
    0x6D72, 0x771A,
    0x5566, 0x771F,
    0x435F, 0x7720,
    0x6D73, 0x7722,
    0x6D76, 0x7726,
    0x5523, 0x7728,
    0x5123, 0x7729,
    0x6D75, 0x772D,
    0x4350, 0x772F,
    0x6D77, 0x7735,
    0x3F74, 0x7736,
    0x3E6C, 0x7737,
    0x6D78, 0x7738,
    0x4C77, 0x773A,
    0x515B, 0x773C,
    0x5745, 0x7740,
    0x5576, 0x7741,
    0x6D7C, 0x7743,
    0x6D7B, 0x7747,
    0x6D79, 0x7750,
    0x6D7A, 0x7751,
    0x6D7D, 0x775A,
    0x3E26, 0x775B,
    0x4B2F, 0x7761,
    0x6E21, 0x7762,
    0x363D, 0x7763,
    0x6E22, 0x7765,
    0x4440, 0x7766,
    0x6D7E, 0x7768,
    0x3D5E, 0x776B,
    0x3247, 0x776C,
    0x3643, 0x7779,
    0x6E25, 0x777D,
    0x583A, 0x777E,
    0x6E23, 0x777F,
    0x6E26, 0x7780,
    0x4369, 0x7784,
    0x3372, 0x7785,
    0x6E27, 0x778C,
    0x6E24, 0x778D,
    0x4F39, 0x778E,
    0x6E28, 0x7791,
    0x4277, 0x7792,
    0x6E29, 0x779F,
    0x6E2A, 0x77A0,
    0x5E2B, 0x77A2,
    0x4633, 0x77A5,
    0x4746, 0x77A7,
    0x5675, 0x77A9,
    0x3549, 0x77AA,
    0x4B32, 0x77AC,
    0x6E2B, 0x77B0,
    0x4D2B, 0x77B3,
    0x6E2C, 0x77B5,
    0x5530, 0x77BB,
    0x6E2D, 0x77BD,
    0x7644, 0x77BF,
    0x5B47, 0x77CD,
    0x3423, 0x77D7,
    0x432C, 0x77DB,
    0x7166, 0x77DC,
    0x4A38, 0x77E2,
    0x5253, 0x77E3,
    0x562A, 0x77E5,
    0x6F72, 0x77E7,
    0x3E58, 0x77E9,
    0x3D43, 0x77EB,
    0x6F73, 0x77EC,
    0x364C, 0x77ED,
    0x302B, 0x77EE,
    0x4A2F, 0x77F3,
    0x6D36, 0x77F6,
    0x6D37, 0x77F8,
    0x4E79, 0x77FD,
    0x372F, 0x77FE,
    0x3F73, 0x77FF,
    0x6D38, 0x7800,
    0x426B, 0x7801,
    0x4930, 0x7802,
    0x6D39, 0x7809,
    0x4676, 0x780C,
    0x3F33, 0x780D,
    0x6D3C, 0x7811,
    0x4578, 0x7812,
    0x5150, 0x7814,
    0x5729, 0x7816,
    0x6D3A, 0x7817,
    0x6D3B, 0x7818,
    0x5162, 0x781A,
    0x6D3F, 0x781C,
    0x6D40, 0x781D,
    0x6D44, 0x781F,
    0x6D48, 0x7823,
    0x6D46, 0x7825,
    0x6D4E, 0x7826,
    0x5568, 0x7827,
    0x6D49, 0x7829,
    0x6D47, 0x782C,
    0x6D3E, 0x782D,
    0x4569, 0x7830,
    0x4646, 0x7834,
    0x4969, 0x7837,
    0x5452, 0x7838,
    0x6D41, 0x7839,
    0x6D42, 0x783A,
    0x6D43, 0x783B,
    0x6D45, 0x783C,
    0x4079, 0x783E,
    0x3421, 0x7840,
    0x3968, 0x7845,
    0x6D50, 0x7847,
    0x6D51, 0x784C,
    0x6D4A, 0x784E,
    0x6D4F, 0x7850,
    0x4E78, 0x7852,
    0x4B36, 0x7855,
    0x6D4C, 0x7856,
    0x6D4D, 0x7857,
    0x4F75, 0x785D,
    0x6D52, 0x786A,
    0x4172, 0x786B,
    0x5332, 0x786C,
    0x6D4B, 0x786D,
    0x4837, 0x786E,
    0x3C6F, 0x7877,
    0x4570, 0x787C,
    0x6D56, 0x7887,
    0x356F, 0x7889,
    0x4235, 0x788C,
    0x302D, 0x788D,
    0x4B69, 0x788E,
    0x312E, 0x7891,
    0x6D54, 0x7893,
    0x4D6B, 0x7897,
    0x3562, 0x7898,
    0x6D55, 0x789A,
    0x6D53, 0x789B,
    0x6D57, 0x789C,
    0x357A, 0x789F,
    0x6D58, 0x78A1,
    0x6D59, 0x78A3,
    0x6D5C, 0x78A5,
    0x314C, 0x78A7,
    0x4576, 0x78B0,
    0x3C6E, 0x78B1,
    0x6D5A, 0x78B2,
    0x4C3C, 0x78B3,
    0x326A, 0x78B4,
    0x6D5B, 0x78B9,
    0x446B, 0x78BE,
    0x3445, 0x78C1,
    0x3075, 0x78C5,
    0x6D5F, 0x78C9,
    0x405A, 0x78CA,
    0x3468, 0x78CB,
    0x454D, 0x78D0,
    0x6D5D, 0x78D4,
    0x3F44, 0x78D5,
    0x6D5E, 0x78D9,
    0x4425, 0x78E8,
    0x6D60, 0x78EC,
    0x6D61, 0x78F2,
    0x6D63, 0x78F4,
    0x4157, 0x78F7,
    0x3B47, 0x78FA,
    0x3D38, 0x7901,
    0x6D62, 0x7905,
    0x6D64, 0x7913,
    0x6D66, 0x791E,
    0x6D65, 0x7924,
    0x6D67, 0x7934,
    0x4A3E, 0x793A,
    0x6C6A, 0x793B,
    0x4071, 0x793C,
    0x4967, 0x793E,
    0x6C6B, 0x7940,
    0x466E, 0x7941,
    0x6C6C, 0x7946,
    0x466D, 0x7948,
    0x6C6D, 0x7949,
    0x6C70, 0x7953,
    0x5766, 0x7956,
    0x6C73, 0x7957,
    0x6C71, 0x795A,
    0x6C6E, 0x795B,
    0x6C6F, 0x795C,
    0x5723, 0x795D,
    0x4971, 0x795E,
    0x4B6E, 0x795F,
    0x6C74, 0x7960,
    0x6C72, 0x7962,
    0x4F69, 0x7965,
    0x6C76, 0x7967,
    0x4631, 0x7968,
    0x3C40, 0x796D,
    0x6C75, 0x796F,
    0x353B, 0x7977,
    0x3B76, 0x7978,
    0x6C77, 0x797A,
    0x5977, 0x7980,
    0x3D7B, 0x7981,
    0x423B, 0x7984,
    0x6C78, 0x7985,
    0x6C79, 0x798A,
    0x3823, 0x798F,
    0x6C7A, 0x799A,
    0x6C7B, 0x79A7,
    0x6C7C, 0x79B3,
    0x536D, 0x79B9,
    0x582E, 0x79BA,
    0x406B, 0x79BB,
    0x475D, 0x79BD,
    0x3A4C, 0x79BE,
    0x5063, 0x79C0,
    0x4B3D, 0x79C1,
    0x4D3A, 0x79C3,
    0x3851, 0x79C6,
    0x317C, 0x79C9,
    0x476F, 0x79CB,
    0x5656, 0x79CD,
    0x3F46, 0x79D1,
    0x436B, 0x79D2,
    0x6F75, 0x79D5,
    0x4358, 0x79D8,
    0x5762, 0x79DF,
    0x6F77, 0x79E3,
    0x3353, 0x79E4,
    0x4758, 0x79E6,
    0x516D, 0x79E7,
    0x5648, 0x79E9,
    0x6F78, 0x79EB,
    0x6F76, 0x79ED,
    0x3B7D, 0x79EF,
    0x3346, 0x79F0,
    0x3D55, 0x79F8,
    0x5246, 0x79FB,
    0x3B60, 0x79FD,
    0x4F21, 0x7A00,
    0x6F7C, 0x7A02,
    0x6F7B, 0x7A03,
    0x6F79, 0x7A06,
    0x334C, 0x7A0B,
    0x4954, 0x7A0D,
    0x4B30, 0x7A0E,
    0x6F7E, 0x7A14,
    0x305E, 0x7A17,
    0x5649, 0x7A1A,
    0x6F7D, 0x7A1E,
    0x336D, 0x7A20,
    0x7655, 0x7A23,
    0x4E48, 0x7A33,
    0x7022, 0x7A37,
    0x7021, 0x7A39,
    0x353E, 0x7A3B,
    0x3C5A, 0x7A3C,
    0x3B7C, 0x7A3D,
    0x3865, 0x7A3F,
    0x4442, 0x7A46,
    0x7023, 0x7A51,
    0x4B6B, 0x7A57,
    0x7026, 0x7A70,
    0x5128, 0x7A74,
    0x3E3F, 0x7A76,
    0x476E, 0x7A77,
    0x7136, 0x7A78,
    0x7137, 0x7A79,
    0x3F55, 0x7A7A,
    0x3429, 0x7A7F,
    0x7138, 0x7A80,
    0x4D3B, 0x7A81,
    0x4754, 0x7A83,
    0x552D, 0x7A84,
    0x7139, 0x7A86,
    0x713A, 0x7A88,
    0x474F, 0x7A8D,
    0x5224, 0x7A91,
    0x564F, 0x7A92,
    0x713B, 0x7A95,
    0x3D51, 0x7A96,
    0x3430, 0x7A97,
    0x3E3D, 0x7A98,
    0x345C, 0x7A9C,
    0x4E51, 0x7A9D,
    0x3F5F, 0x7A9F,
    0x713D, 0x7AA0,
    0x3F7A, 0x7AA5,
    0x713C, 0x7AA6,
    0x713F, 0x7AA8,
    0x713E, 0x7AAC,
    0x7140, 0x7AAD,
    0x7141, 0x7AB3,
    0x417E, 0x7ABF,
    0x4122, 0x7ACB,
    0x4A7A, 0x7AD6,
    0x553E, 0x7AD9,
    0x3E3A, 0x7ADE,
    0x3E39, 0x7ADF,
    0x5542, 0x7AE0,
    0x3F22, 0x7AE3,
    0x4D2F, 0x7AE5,
    0x7135, 0x7AE6,
    0x3D5F, 0x7AED,
    0x364B, 0x7AEF,
    0x5671, 0x7AF9,
    0x7343, 0x7AFA,
    0x7344, 0x7AFD,
    0x384D, 0x7AFF,
    0x7346, 0x7B03,
    0x7347, 0x7B04,
    0x304A, 0x7B06,
    0x7345, 0x7B08,
    0x7349, 0x7B0A,
    0x4B71, 0x7B0B,
    0x734B, 0x7B0F,
    0x5026, 0x7B11,
    0x314A, 0x7B14,
    0x7348, 0x7B15,
    0x734F, 0x7B19,
    0x3551, 0x7B1B,
    0x7357, 0x7B1E,
    0x7352, 0x7B20,
    0x7354, 0x7B24,
    0x7353, 0x7B25,
    0x377B, 0x7B26,
    0x313F, 0x7B28,
    0x734E, 0x7B2A,
    0x734A, 0x7B2B,
    0x355A, 0x7B2C,
    0x7350, 0x7B2E,
    0x7351, 0x7B31,
    0x7355, 0x7B33,
    0x734D, 0x7B38,
    0x3C63, 0x7B3A,
    0x417D, 0x7B3C,
    0x7356, 0x7B3E,
    0x735A, 0x7B45,
    0x734C, 0x7B47,
    0x3548, 0x7B49,
    0x3D6E, 0x7B4B,
    0x735C, 0x7B4C,
    0x3724, 0x7B4F,
    0x3F70, 0x7B50,
    0x567E, 0x7B51,
    0x4D32, 0x7B52,
    0x3470, 0x7B54,
    0x325F, 0x7B56,
    0x7358, 0x7B58,
    0x7359, 0x7B5A,
    0x4938, 0x7B5B,
    0x735D, 0x7B5D,
    0x735E, 0x7B60,
    0x7361, 0x7B62,
    0x735F, 0x7B6E,
    0x7363, 0x7B71,
    0x7362, 0x7B72,
    0x735B, 0x7B75,
    0x3F6A, 0x7B77,
    0x336F, 0x7B79,
    0x7360, 0x7B7B,
    0x4729, 0x7B7E,
    0x3C72, 0x7B80,
    0x736B, 0x7B85,
    0x393F, 0x7B8D,
    0x7364, 0x7B90,
    0x322D, 0x7B94,
    0x3B7E, 0x7B95,
    0x4B63, 0x7B97,
    0x736D, 0x7B9C,
    0x7369, 0x7B9D,
    0x395C, 0x7BA1,
    0x736E, 0x7BA2,
    0x7365, 0x7BA6,
    0x7366, 0x7BA7,
    0x736A, 0x7BA8,
    0x4261, 0x7BA9,
    0x736C, 0x7BAA,
    0x736F, 0x7BAB,
    0x7368, 0x7BAC,
    0x3C7D, 0x7BAD,
    0x4F64, 0x7BB1,
    0x7370, 0x7BB4,
    0x7367, 0x7BB8,
    0x7372, 0x7BC1,
    0x572D, 0x7BC6,
    0x462A, 0x7BC7,
    0x7373, 0x7BCC,
    0x7371, 0x7BD1,
    0x4228, 0x7BD3,
    0x385D, 0x7BD9,
    0x7375, 0x7BDA,
    0x7374, 0x7BDD,
    0x345B, 0x7BE1,
    0x7376, 0x7BE5,
    0x7377, 0x7BE6,
    0x7378, 0x7BEA,
    0x403A, 0x7BEE,
    0x4069, 0x7BF1,
    0x4571, 0x7BF7,
    0x737B, 0x7BFC,
    0x737A, 0x7BFE,
    0x3458, 0x7C07,
    0x737E, 0x7C0B,
    0x7379, 0x7C0C,
    0x737C, 0x7C0F,
    0x737D, 0x7C16,
    0x7421, 0x7C1F,
    0x7423, 0x7C26,
    0x3B49, 0x7C27,
    0x7422, 0x7C2A,
    0x7424, 0x7C38,
    0x323E, 0x7C3F,
    0x7426, 0x7C40,
    0x7425, 0x7C41,
    0x3C2E, 0x7C4D,
    0x4357, 0x7C73,
    0x5961, 0x7C74,
    0x4060, 0x7C7B,
    0x744C, 0x7C7C,
    0x5751, 0x7C7D,
    0x375B, 0x7C89,
    0x744E, 0x7C91,
    0x4123, 0x7C92,
    0x4649, 0x7C95,
    0x3456, 0x7C97,
    0x5533, 0x7C98,
    0x7450, 0x7C9C,
    0x744F, 0x7C9D,
    0x7451, 0x7C9E,
    0x4B5A, 0x7C9F,
    0x7452, 0x7CA2,
    0x5441, 0x7CA4,
    0x5660, 0x7CA5,
    0x3760, 0x7CAA,
    0x4138, 0x7CAE,
    0x413B, 0x7CB1,
    0x7453, 0x7CB2,
    0x3E2C, 0x7CB3,
    0x3462, 0x7CB9,
    0x7454, 0x7CBC,
    0x7455, 0x7CBD,
    0x3E2B, 0x7CBE,
    0x7456, 0x7CC1,
    0x745B, 0x7CC5,
    0x7457, 0x7CC7,
    0x745A, 0x7CC8,
    0x3A7D, 0x7CCA,
    0x7458, 0x7CCC,
    0x7459, 0x7CCD,
    0x3862, 0x7CD5,
    0x4C47, 0x7CD6,
    0x745C, 0x7CD7,
    0x325A, 0x7CD9,
    0x4353, 0x7CDC,
    0x5463, 0x7CDF,
    0x3F37, 0x7CE0,
    0x745D, 0x7CE8,
    0x4534, 0x7CEF,
    0x7469, 0x7CF8,
    0x4F35, 0x7CFB,
    0x4E49, 0x7D0A,
    0x4B58, 0x7D20,
    0x4B77, 0x7D22,
    0x3D74, 0x7D27,
    0x574F, 0x7D2B,
    0x405B, 0x7D2F,
    0x5075, 0x7D6E,
    0x746A, 0x7D77,
    0x746B, 0x7DA6,
    0x746C, 0x7DAE,
    0x7763, 0x7E3B,
    0x3731, 0x7E41,
    0x746D, 0x7E47,
    0x576B, 0x7E82,
    0x746E, 0x7E9B,
    0x6679, 0x7E9F,
    0x3E40, 0x7EA0,
    0x667A, 0x7EA1,
    0x3A6C, 0x7EA2,
    0x667B, 0x7EA3,
    0x4F4B, 0x7EA4,
    0x667C, 0x7EA5,
    0x543C, 0x7EA6,
    0x3C36, 0x7EA7,
    0x667D, 0x7EA8,
    0x667E, 0x7EA9,
    0x3C4D, 0x7EAA,
    0x4852, 0x7EAB,
    0x4E33, 0x7EAC,
    0x6721, 0x7EAD,
    0x343F, 0x7EAF,
    0x6722, 0x7EB0,
    0x4934, 0x7EB1,
    0x3859, 0x7EB2,
    0x4449, 0x7EB3,
    0x575D, 0x7EB5,
    0x425A, 0x7EB6,
    0x3757, 0x7EB7,
    0x563D, 0x7EB8,
    0x4E46, 0x7EB9,
    0x3744, 0x7EBA,
    0x4526, 0x7EBD,
    0x6723, 0x7EBE,
    0x4F5F, 0x7EBF,
    0x6724, 0x7EC0,
    0x6725, 0x7EC1,
    0x6726, 0x7EC2,
    0x4137, 0x7EC3,
    0x5769, 0x7EC4,
    0x4970, 0x7EC5,
    0x4F38, 0x7EC6,
    0x562F, 0x7EC7,
    0x5655, 0x7EC8,
    0x6727, 0x7EC9,
    0x306D, 0x7ECA,
    0x6728, 0x7ECB,
    0x6729, 0x7ECC,
    0x495C, 0x7ECD,
    0x526F, 0x7ECE,
    0x3E2D, 0x7ECF,
    0x672A, 0x7ED0,
    0x3073, 0x7ED1,
    0x485E, 0x7ED2,
    0x3D61, 0x7ED3,
    0x672B, 0x7ED4,
    0x4846, 0x7ED5,
    0x672C, 0x7ED7,
    0x3B66, 0x7ED8,
    0x3878, 0x7ED9,
    0x5124, 0x7EDA,
    0x672D, 0x7EDB,
    0x4267, 0x7EDC,
    0x3E78, 0x7EDD,
    0x3D4A, 0x7EDE,
    0x4D33, 0x7EDF,
    0x672E, 0x7EE0,
    0x672F, 0x7EE1,
    0x3E6E, 0x7EE2,
    0x5065, 0x7EE3,
    0x4B67, 0x7EE5,
    0x4C50, 0x7EE6,
    0x3C4C, 0x7EE7,
    0x6730, 0x7EE8,
    0x3C28, 0x7EE9,
    0x5077, 0x7EEA,
    0x6731, 0x7EEB,
    0x5078, 0x7EED,
    0x6732, 0x7EEE,
    0x6733, 0x7EEF,
    0x3442, 0x7EF0,
    0x6734, 0x7EF1,
    0x6735, 0x7EF2,
    0x497E, 0x7EF3,
    0x4E2C, 0x7EF4,
    0x4360, 0x7EF5,
    0x6737, 0x7EF6,
    0x3141, 0x7EF7,
    0x3371, 0x7EF8,
    0x6738, 0x7EFA,
    0x6739, 0x7EFB,
    0x575B, 0x7EFC,
    0x5540, 0x7EFD,
    0x673A, 0x7EFE,
    0x424C, 0x7EFF,
    0x573A, 0x7F00,
    0x673B, 0x7F01,
    0x673C, 0x7F02,
    0x673D, 0x7F03,
    0x3C6A, 0x7F04,
    0x4365, 0x7F05,
    0x4042, 0x7F06,
    0x673E, 0x7F07,
    0x673F, 0x7F08,
    0x3C29, 0x7F09,
    0x6740, 0x7F0B,
    0x6741, 0x7F0C,
    0x6736, 0x7F0D,
    0x3650, 0x7F0E,
    0x6742, 0x7F0F,
    0x6743, 0x7F11,
    0x6744, 0x7F12,
    0x3B3A, 0x7F13,
    0x355E, 0x7F14,
    0x4246, 0x7F15,
    0x3160, 0x7F16,
    0x6745, 0x7F17,
    0x5435, 0x7F18,
    0x6746, 0x7F19,
    0x383F, 0x7F1A,
    0x6748, 0x7F1B,
    0x6747, 0x7F1C,
    0x376C, 0x7F1D,
    0x6749, 0x7F1F,
    0x3278, 0x7F20,
    0x674A, 0x7F21,
    0x674B, 0x7F22,
    0x674C, 0x7F23,
    0x674D, 0x7F24,
    0x674E, 0x7F25,
    0x674F, 0x7F26,
    0x6750, 0x7F27,
    0x5327, 0x7F28,
    0x4B75, 0x7F29,
    0x6751, 0x7F2A,
    0x6752, 0x7F2B,
    0x6753, 0x7F2C,
    0x6754, 0x7F2D,
    0x4949, 0x7F2E,
    0x6755, 0x7F2F,
    0x6756, 0x7F30,
    0x6757, 0x7F31,
    0x6758, 0x7F32,
    0x6759, 0x7F33,
    0x3D49, 0x7F34,
    0x675A, 0x7F35,
    0x733E, 0x7F36,
    0x3857, 0x7F38,
    0x4831, 0x7F3A,
    0x733F, 0x7F42,
    0x7340, 0x7F44,
    0x7341, 0x7F45,
    0x395E, 0x7F50,
    0x4D78, 0x7F51,
    0x5868, 0x7F54,
    0x3A31, 0x7F55,
    0x425E, 0x7F57,
    0x6E37, 0x7F58,
    0x3723, 0x7F5A,
    0x6E39, 0x7F5F,
    0x6E38, 0x7F61,
    0x3055, 0x7F62,
    0x6E3B, 0x7F68,
    0x5556, 0x7F69,
    0x576F, 0x7F6A,
    0x5643, 0x7F6E,
    0x6E3D, 0x7F71,
    0x4A70, 0x7F72,
    0x6E3C, 0x7F74,
    0x6E3E, 0x7F79,
    0x6E40, 0x7F7E,
    0x6E3F, 0x7F81,
    0x5172, 0x7F8A,
    0x473C, 0x7F8C,
    0x4340, 0x7F8E,
    0x3861, 0x7F94,
    0x4167, 0x7F9A,
    0x7446, 0x7F9D,
    0x505F, 0x7F9E,
    0x7447, 0x7F9F,
    0x4F5B, 0x7FA1,
    0x483A, 0x7FA4,
    0x7448, 0x7FA7,
    0x7449, 0x7FAF,
    0x744A, 0x7FB0,
    0x744B, 0x7FB2,
    0x597A, 0x7FB8,
    0x387E, 0x7FB9,
    0x6571, 0x7FBC,
    0x5370, 0x7FBD,
    0x7460, 0x7FBF,
    0x4E4C, 0x7FC1,
    0x3361, 0x7FC5,
    0x7134, 0x7FCA,
    0x526E, 0x7FCC,
    0x7461, 0x7FCE,
    0x4F68, 0x7FD4,
    0x7462, 0x7FD5,
    0x474C, 0x7FD8,
    0x3554, 0x7FDF,
    0x3464, 0x7FE0,
    0x7464, 0x7FE1,
    0x7463, 0x7FE5,
    0x7465, 0x7FE6,
    0x7466, 0x7FE9,
    0x7467, 0x7FEE,
    0x3A32, 0x7FF0,
    0x303F, 0x7FF1,
    0x7468, 0x7FF3,
    0x372D, 0x7FFB,
    0x526D, 0x7FFC,
    0x522B, 0x8000,
    0x404F, 0x8001,
    0x3F3C, 0x8003,
    0x6B23, 0x8004,
    0x555F, 0x8005,
    0x6A48, 0x8006,
    0x7173, 0x800B,
    0x3678, 0x800C,
    0x4B23, 0x800D,
    0x444D, 0x8010,
    0x7167, 0x8012,
    0x7168, 0x8014,
    0x387B, 0x8015,
    0x7169, 0x8016,
    0x3A44, 0x8017,
    0x5445, 0x8018,
    0x3052, 0x8019,
    0x716A, 0x801C,
    0x716B, 0x8020,
    0x716C, 0x8022,
    0x716D, 0x8025,
    0x716E, 0x8026,
    0x716F, 0x8027,
    0x7171, 0x8028,
    0x7170, 0x8029,
    0x4555, 0x802A,
    0x7172, 0x8031,
    0x367A, 0x8033,
    0x7174, 0x8035,
    0x522E, 0x8036,
    0x5E47, 0x8037,
    0x4B4A, 0x8038,
    0x335C, 0x803B,
    0x3522, 0x803D,
    0x3922, 0x803F,
    0x4474, 0x8042,
    0x7175, 0x8043,
    0x7176, 0x8046,
    0x4144, 0x804A,
    0x417B, 0x804B,
    0x5630, 0x804C,
    0x7177, 0x804D,
    0x7178, 0x8052,
    0x412A, 0x8054,
    0x4638, 0x8058,
    0x3E5B, 0x805A,
    0x7179, 0x8069,
    0x344F, 0x806A,
    0x717A, 0x8071,
    0x6D32, 0x807F,
    0x6D31, 0x8080,
    0x4B60, 0x8083,
    0x525E, 0x8084,
    0x4B41, 0x8086,
    0x5558, 0x8087,
    0x4862, 0x8089,
    0x405F, 0x808B,
    0x3C21, 0x808C,
    0x6B41, 0x8093,
    0x5024, 0x8096,
    0x5662, 0x8098,
    0x3647, 0x809A,
    0x3858, 0x809B,
    0x6B40, 0x809C,
    0x384E, 0x809D,
    0x6B3F, 0x809F,
    0x3326, 0x80A0,
    0x3949, 0x80A1,
    0x562B, 0x80A2,
    0x3774, 0x80A4,
    0x374A, 0x80A5,
    0x3C67, 0x80A9,
    0x373E, 0x80AA,
    0x6B46, 0x80AB,
    0x6B47, 0x80AD,
    0x3039, 0x80AE,
    0x3F4F, 0x80AF,
    0x6B45, 0x80B1,
    0x537D, 0x80B2,
    0x6B48, 0x80B4,
    0x6B49, 0x80B7,
    0x374E, 0x80BA,
    0x6B42, 0x80BC,
    0x6B44, 0x80BD,
    0x4976, 0x80BE,
    0x5657, 0x80BF,
    0x554D, 0x80C0,
    0x5032, 0x80C1,
    0x6B4F, 0x80C2,
    0x4E38, 0x80C3,
    0x6B50, 0x80C4,
    0x3528, 0x80C6,
    0x3133, 0x80CC,
    0x6B52, 0x80CD,
    0x4C25, 0x80CE,
    0x4556, 0x80D6,
    0x6B53, 0x80D7,
    0x6B51, 0x80D9,
    0x455F, 0x80DA,
    0x6B4E, 0x80DB,
    0x4A24, 0x80DC,
    0x6B55, 0x80DD,
    0x307B, 0x80DE,
    0x3A7A, 0x80E1,
    0x5837, 0x80E4,
    0x7163, 0x80E5,
    0x6B4A, 0x80E7,
    0x6B4B, 0x80E8,
    0x6B4C, 0x80E9,
    0x6B4D, 0x80EA,
    0x6B56, 0x80EB,
    0x6640, 0x80EC,
    0x6B59, 0x80ED,
    0x3F68, 0x80EF,
    0x5248, 0x80F0,
    0x6B57, 0x80F1,
    0x6B5C, 0x80F2,
    0x386C, 0x80F3,
    0x6B58, 0x80F4,
    0x3D3A, 0x80F6,
    0x5058, 0x80F8,
    0x3037, 0x80FA,
    0x6B5D, 0x80FC,
    0x445C, 0x80FD,
    0x562C, 0x8102,
    0x3460, 0x8106,
    0x4276, 0x8109,
    0x3C39, 0x810A,
    0x6B5A, 0x810D,
    0x6B5B, 0x810E,
    0x5460, 0x810F,
    0x466A, 0x8110,
    0x4454, 0x8111,
    0x6B5F, 0x8112,
    0x4527, 0x8113,
    0x5975, 0x8114,
    0x3231, 0x8116,
    0x6B64, 0x8118,
    0x3D45, 0x811A,
    0x6B62, 0x811E,
    0x6B63, 0x812C,
    0x382C, 0x812F,
    0x4D51, 0x8131,
    0x6B65, 0x8132,
    0x6B61, 0x8136,
    0x4133, 0x8138,
    0x4622, 0x813E,
    0x4C73, 0x8146,
    0x6B66, 0x8148,
    0x4030, 0x814A,
    0x5238, 0x814B,
    0x6B67, 0x814C,
    0x382F, 0x8150,
    0x382D, 0x8151,
    0x6B68, 0x8153,
    0x473B, 0x8154,
    0x4D73, 0x8155,
    0x6B6A, 0x8159,
    0x6B6B, 0x815A,
    0x6B6D, 0x8160,
    0x5048, 0x8165,
    0x6B72, 0x8167,
    0x6B6E, 0x8169,
    0x6B71, 0x816D,
    0x4879, 0x816E,
    0x517C, 0x8170,
    0x6B6C, 0x8171,
    0x6B69, 0x8174,
    0x3839, 0x8179,
    0x4F59, 0x817A,
    0x4465, 0x817B,
    0x6B6F, 0x817C,
    0x6B70, 0x817D,
    0x4C5A, 0x817E,
    0x4D48, 0x817F,
    0x3072, 0x8180,
    0x6B76, 0x8182,
    0x6B75, 0x8188,
    0x3232, 0x818A,
    0x3860, 0x818F,
    0x6B77, 0x8191,
    0x316C, 0x8198,
    0x4C45, 0x819B,
    0x4424, 0x819C,
    0x4F25, 0x819D,
    0x6B79, 0x81A3,
    0x6C22, 0x81A6,
    0x4572, 0x81A8,
    0x6B7A, 0x81AA,
    0x4945, 0x81B3,
    0x625F, 0x81BA,
    0x6B7E, 0x81BB,
    0x4D4E, 0x81C0,
    0x6C21, 0x81C1,
    0x315B, 0x81C2,
    0x5337, 0x81C3,
    0x525C, 0x81C6,
    0x6B7D, 0x81CA,
    0x6B7B, 0x81CC,
    0x333C, 0x81E3,
    0x6A30, 0x81E7,
    0x5754, 0x81EA,
    0x742B, 0x81EC,
    0x3374, 0x81ED,
    0x5641, 0x81F3,
    0x5642, 0x81F4,
    0x5569, 0x81FB,
    0x3E4A, 0x81FC,
    0x7427, 0x81FE,
    0x5228, 0x8200,
    0x7428, 0x8201,
    0x7429, 0x8202,
    0x742A, 0x8204,
    0x3E4B, 0x8205,
    0x535F, 0x8206,
    0x4960, 0x820C,
    0x4961, 0x820D,
    0x7342, 0x8210,
    0x4A66, 0x8212,
    0x4C72, 0x8214,
    0x6236, 0x821B,
    0x4B34, 0x821C,
    0x4E68, 0x821E,
    0x565B, 0x821F,
    0x742D, 0x8221,
    0x742E, 0x8222,
    0x742F, 0x8223,
    0x7432, 0x8228,
    0x3A3D, 0x822A,
    0x7433, 0x822B,
    0x3063, 0x822C,
    0x7430, 0x822D,
    0x7431, 0x822F,
    0x3D22, 0x8230,
    0x3255, 0x8231,
    0x7436, 0x8233,
    0x7437, 0x8234,
    0x3666, 0x8235,
    0x3230, 0x8236,
    0x4F4F, 0x8237,
    0x7434, 0x8238,
    0x342C, 0x8239,
    0x7435, 0x823B,
    0x7438, 0x823E,
    0x7439, 0x8244,
    0x4D27, 0x8247,
    0x743A, 0x8249,
    0x743B, 0x824B,
    0x743C, 0x824F,
    0x4B52, 0x8258,
    0x743D, 0x825A,
    0x743E, 0x825F,
    0x743F, 0x8268,
    0x745E, 0x826E,
    0x413C, 0x826F,
    0x3C68, 0x8270,
    0x492B, 0x8272,
    0x515E, 0x8273,
    0x6575, 0x8274,
    0x5C33, 0x8279,
    0x5255, 0x827A,
    0x5C34, 0x827D,
    0x302C, 0x827E,
    0x5C35, 0x827F,
    0x3D5A, 0x8282,
    0x5C39, 0x8284,
    0x5842, 0x8288,
    0x5C37, 0x828A,
    0x5373, 0x828B,
    0x4956, 0x828D,
    0x5C3A, 0x828E,
    0x5C36, 0x828F,
    0x5C3B, 0x8291,
    0x4322, 0x8292,
    0x5C3C, 0x8297,
    0x5C45, 0x8298,
    0x5C3D, 0x8299,
    0x4E5F, 0x829C,
    0x5625, 0x829D,
    0x5C4F, 0x829F,
    0x5C4D, 0x82A1,
    0x5C52, 0x82A4,
    0x3D66, 0x82A5,
    0x422B, 0x82A6,
    0x5C38, 0x82A8,
    0x5C4B, 0x82A9,
    0x5C4E, 0x82AA,
    0x5C3E, 0x82AB,
    0x3752, 0x82AC,
    0x3045, 0x82AD,
    0x5C47, 0x82AE,
    0x503E, 0x82AF,
    0x5C41, 0x82B0,
    0x3B28, 0x82B1,
    0x373C, 0x82B3,
    0x5C4C, 0x82B4,
    0x5C46, 0x82B7,
    0x5C3F, 0x82B8,
    0x475B, 0x82B9,
    0x513F, 0x82BD,
    0x5C40, 0x82BE,
    0x5C4A, 0x82C1,
    0x5C50, 0x82C4,
    0x4E2D, 0x82C7,
    0x5C42, 0x82C8,
    0x5C43, 0x82CA,
    0x5C48, 0x82CB,
    0x5C49, 0x82CC,
    0x3254, 0x82CD,
    0x5C51, 0x82CE,
    0x4B55, 0x82CF,
    0x5437, 0x82D1,
    0x5C5B, 0x82D2,
    0x5C5F, 0x82D3,
    0x4C26, 0x82D4,
    0x5C66, 0x82D5,
    0x4367, 0x82D7,
    0x5C5C, 0x82D8,
    0x3F41, 0x82DB,
    0x5C59, 0x82DC,
    0x307A, 0x82DE,
    0x3936, 0x82DF,
    0x5C65, 0x82E0,
    0x5C53, 0x82E1,
    0x5C44, 0x82E3,
    0x5C56, 0x82E4,
    0x4874, 0x82E5,
    0x3F60, 0x82E6,
    0x493B, 0x82EB,
    0x313D, 0x82EF,
    0x5322, 0x82F1,
    0x5C5A, 0x82F4,
    0x5C55, 0x82F7,
    0x463B, 0x82F9,
    0x5C5E, 0x82FB,
    0x5742, 0x8301,
    0x432F, 0x8302,
    0x3736, 0x8303,
    0x4751, 0x8304,
    0x4329, 0x8305,
    0x5C62, 0x8306,
    0x5C58, 0x8307,
    0x5C6B, 0x8308,
    0x5C54, 0x8309,
    0x5C5D, 0x830C,
    0x3E25, 0x830E,
    0x5C57, 0x830F,
    0x5C60, 0x8311,
    0x5C63, 0x8314,
    0x5C64, 0x8315,
    0x5C78, 0x8317,
    0x5C61, 0x831A,
    0x5D22, 0x831B,
    0x5C67, 0x831C,
    0x3C6B, 0x8327,
    0x3444, 0x8328,
    0x4323, 0x832B,
    0x3267, 0x832C,
    0x5C7A, 0x832D,
    0x5C72, 0x832F,
    0x5C6F, 0x8331,
    0x5C7C, 0x8333,
    0x5C6E, 0x8334,
    0x5270, 0x8335,
    0x3268, 0x8336,
    0x4857, 0x8338,
    0x4863, 0x8339,
    0x5C7B, 0x833A,
    0x5C6D, 0x833C,
    0x5C77, 0x8340,
    0x5C75, 0x8343,
    0x3E23, 0x8346,
    0x5C74, 0x8347,
    0x325D, 0x8349,
    0x5C73, 0x834F,
    0x3C76, 0x8350,
    0x5C68, 0x8351,
    0x3B44, 0x8352,
    0x4073, 0x8354,
    0x3C54, 0x835A,
    0x5C69, 0x835B,
    0x5C6A, 0x835C,
    0x5C71, 0x835E,
    0x5C76, 0x835F,
    0x5C79, 0x8360,
    0x3534, 0x8361,
    0x4859, 0x8363,
    0x3B67, 0x8364,
    0x5C7E, 0x8365,
    0x5C7D, 0x8366,
    0x532B, 0x8367,
    0x5D21, 0x8368,
    0x5D23, 0x8369,
    0x5D25, 0x836A,
    0x5271, 0x836B,
    0x5D24, 0x836C,
    0x5D26, 0x836D,
    0x5D27, 0x836E,
    0x5229, 0x836F,
    0x3A49, 0x8377,
    0x5D29, 0x8378,
    0x5D36, 0x837B,
    0x5D31, 0x837C,
    0x5D34, 0x837D,
    0x5D30, 0x8385,
    0x464E, 0x8386,
    0x4072, 0x8389,
    0x492F, 0x838E,
    0x5C6C, 0x8392,
    0x5D2E, 0x8393,
    0x5D37, 0x8398,
    0x5C70, 0x839B,
    0x5D2F, 0x839C,
    0x5D38, 0x839E,
    0x5D2C, 0x83A0,
    0x5D39, 0x83A8,
    0x5D33, 0x83A9,
    0x5D2D, 0x83AA,
    0x442A, 0x83AB,
    0x5D28, 0x83B0,
    0x4033, 0x83B1,
    0x412B, 0x83B2,
    0x5D2A, 0x83B3,
    0x5D2B, 0x83B4,
    0x5D32, 0x83B6,
    0x3B71, 0x83B7,
    0x5D35, 0x83B8,
    0x5328, 0x83B9,
    0x5D3A, 0x83BA,
    0x5D3B, 0x83BC,
    0x4327, 0x83BD,
    0x5D52, 0x83C0,
    0x5D3C, 0x83C1,
    0x5D51, 0x83C5,
    0x393D, 0x83C7,
    0x3E55, 0x83CA,
    0x3E7A, 0x83CC,
    0x3A4A, 0x83CF,
    0x5D4A, 0x83D4,
    0x5D45, 0x83D6,
    0x5D3F, 0x83D8,
    0x324B, 0x83DC,
    0x5D43, 0x83DD,
    0x5D4B, 0x83DF,
    0x3224, 0x83E0,
    0x5D55, 0x83E1,
    0x5D3E, 0x83E5,
    0x4650, 0x83E9,
    0x5D50, 0x83EA,
    0x5D54, 0x83F0,
    0x4162, 0x83F1,
    0x3746, 0x83F2,
    0x5D4E, 0x83F8,
    0x5D4F, 0x83F9,
    0x5D44, 0x83FD,
    0x5D3D, 0x8401,
    0x5D4D, 0x8403,
    0x4C51, 0x8404,
    0x5D49, 0x8406,
    0x5D42, 0x840B,
    0x4348, 0x840C,
    0x463C, 0x840D,
    0x4E2E, 0x840E,
    0x5D4C, 0x840F,
    0x5D48, 0x8411,
    0x5D41, 0x8418,
    0x5D46, 0x841C,
    0x425C, 0x841D,
    0x5329, 0x8424,
    0x532A, 0x8425,
    0x5D53, 0x8426,
    0x4F74, 0x8427,
    0x4878, 0x8428,
    0x5D66, 0x8431,
    0x5D47, 0x8438,
    0x5D60, 0x843C,
    0x4264, 0x843D,
    0x5D61, 0x8446,
    0x5D57, 0x8451,
    0x5678, 0x8457,
    0x5D59, 0x8459,
    0x5D58, 0x845A,
    0x3870, 0x845B,
    0x5D56, 0x845C,
    0x464F, 0x8461,
    0x362D, 0x8463,
    0x5D62, 0x8469,
    0x3A79, 0x846B,
    0x5461, 0x846C,
    0x5D67, 0x846D,
    0x3450, 0x8471,
    0x5D5A, 0x8473,
    0x3F7B, 0x8475,
    0x5D63, 0x8476,
    0x5D5F, 0x8478,
    0x5D5D, 0x847A,
    0x3559, 0x8482,
    0x5D5B, 0x8487,
    0x5D5C, 0x8488,
    0x5D5E, 0x8489,
    0x3D2F, 0x848B,
    0x5D64, 0x848C,
    0x5D65, 0x848E,
    0x5D75, 0x8497,
    0x4349, 0x8499,
    0x4B62, 0x849C,
    0x5D72, 0x84A1,
    0x5861, 0x84AF,
    0x4651, 0x84B2,
    0x5D74, 0x84B4,
    0x5574, 0x84B8,
    0x5D73, 0x84B9,
    0x5D70, 0x84BA,
    0x5D6C, 0x84BD,
    0x5D6F, 0x84BF,
    0x5D68, 0x84C1,
    0x506E, 0x84C4,
    0x4858, 0x84C9,
    0x5D6E, 0x84CA,
    0x5D69, 0x84CD,
    0x5D6A, 0x84D0,
    0x4B72, 0x84D1,
    0x5D6D, 0x84D3,
    0x314D, 0x84D6,
    0x4036, 0x84DD,
    0x3C3B, 0x84DF,
    0x5D71, 0x84E0,
    0x5D77, 0x84E3,
    0x5D76, 0x84E5,
    0x5D6B, 0x84E6,
    0x456E, 0x84EC,
    0x5D7B, 0x84F0,
    0x5E24, 0x84FC,
    0x5E23, 0x84FF,
    0x5D78, 0x850C,
    0x436F, 0x8511,
    0x427B, 0x8513,
    0x5561, 0x8517,
    0x4E35, 0x851A,
    0x5D7D, 0x851F,
    0x324C, 0x8521,
    0x4468, 0x852B,
    0x4A5F, 0x852C,
    0x473E, 0x8537,
    0x5D7A, 0x8538,
    0x5D7C, 0x8539,
    0x5D7E, 0x853A,
    0x5E22, 0x853B,
    0x302A, 0x853C,
    0x314E, 0x853D,
    0x5E2C, 0x8543,
    0x5E26, 0x8548,
    0x3D36, 0x8549,
    0x486F, 0x854A,
    0x5E21, 0x8556,
    0x5E25, 0x8559,
    0x5E29, 0x855E,
    0x5E28, 0x8564,
    0x5E27, 0x8568,
    0x5E2D, 0x8572,
    0x544C, 0x8574,
    0x5E33, 0x8579,
    0x5E2A, 0x857A,
    0x5E2E, 0x857B,
    0x4059, 0x857E,
    0x3121, 0x8584,
    0x5E36, 0x8585,
    0x5E31, 0x8587,
    0x5E32, 0x858F,
    0x5126, 0x859B,
    0x5E35, 0x859C,
    0x5E2F, 0x85A4,
    0x5E30, 0x85A8,
    0x503D, 0x85AA,
    0x5E34, 0x85AE,
    0x4A6D, 0x85AF,
    0x5E39, 0x85B0,
    0x5E38, 0x85B7,
    0x5E37, 0x85B9,
    0x5E3B, 0x85C1,
    0x3D65, 0x85C9,
    0x3258, 0x85CF,
    0x436A, 0x85D0,
    0x5E3A, 0x85D3,
    0x453A, 0x85D5,
    0x5E3C, 0x85DC,
    0x4C59, 0x85E4,
    0x372A, 0x85E9,
    0x5465, 0x85FB,
    0x5E3D, 0x85FF,
    0x5E3F, 0x8605,
    0x4422, 0x8611,
    0x5E41, 0x8616,
    0x5E3E, 0x8627,
    0x5E40, 0x8629,
    0x553A, 0x8638,
    0x5E42, 0x863C,
    0x722E, 0x864D,
    0x3B22, 0x864E,
    0x4232, 0x864F,
    0x4530, 0x8650,
    0x4247, 0x8651,
    0x722F, 0x8654,
    0x5069, 0x865A,
    0x535D, 0x865E,
    0x6B3D, 0x8662,
    0x3366, 0x866B,
    0x7230, 0x866C,
    0x7231, 0x866E,
    0x4A2D, 0x8671,
    0x3A67, 0x8679,
    0x7233, 0x867A,
    0x7235, 0x867B,
    0x7234, 0x867C,
    0x4B64, 0x867D,
    0x4F3A, 0x867E,
    0x7232, 0x867F,
    0x4A34, 0x8680,
    0x524F, 0x8681,
    0x426C, 0x8682,
    0x4E43, 0x868A,
    0x7238, 0x868B,
    0x3076, 0x868C,
    0x7237, 0x868D,
    0x723E, 0x8693,
    0x324F, 0x8695,
    0x5141, 0x869C,
    0x723A, 0x869D,
    0x723C, 0x86A3,
    0x5469, 0x86A4,
    0x723B, 0x86A7,
    0x7236, 0x86A8,
    0x723F, 0x86A9,
    0x723D, 0x86AA,
    0x7239, 0x86AC,
    0x7247, 0x86AF,
    0x7244, 0x86B0,
    0x7246, 0x86B1,
    0x724A, 0x86B4,
    0x7242, 0x86B5,
    0x7240, 0x86B6,
    0x7245, 0x86BA,
    0x567B, 0x86C0,
    0x7241, 0x86C4,
    0x4779, 0x86C6,
    0x495F, 0x86C7,
    0x7248, 0x86C9,
    0x3946, 0x86CA,
    0x3530, 0x86CB,
    0x7243, 0x86CE,
    0x7249, 0x86CF,
    0x7250, 0x86D0,
    0x7256, 0x86D1,
    0x3B57, 0x86D4,
    0x7255, 0x86D8,
    0x4D5C, 0x86D9,
    0x566B, 0x86DB,
    0x7252, 0x86DE,
    0x7254, 0x86DF,
    0x3872, 0x86E4,
    0x724B, 0x86E9,
    0x724E, 0x86ED,
    0x4279, 0x86EE,
    0x555D, 0x86F0,
    0x724C, 0x86F1,
    0x724D, 0x86F2,
    0x724F, 0x86F3,
    0x7253, 0x86F4,
    0x7259, 0x86F8,
    0x533C, 0x86F9,
    0x366A, 0x86FE,
    0x4A71, 0x8700,
    0x3764, 0x8702,
    0x7257, 0x8703,
    0x7258, 0x8707,
    0x725A, 0x8708,
    0x725D, 0x8709,
    0x725B, 0x870A,
    0x725C, 0x870D,
    0x5151, 0x8712,
    0x7251, 0x8713,
    0x4D49, 0x8715,
    0x4E4F, 0x8717,
    0x5629, 0x8718,
    0x7263, 0x871A,
    0x435B, 0x871C,
    0x7260, 0x871E,
    0x402F, 0x8721,
    0x726C, 0x8722,
    0x725E, 0x8723,
    0x7261, 0x8725,
    0x7268, 0x8729,
    0x7262, 0x872E,
    0x7267, 0x8731,
    0x7266, 0x8734,
    0x7269, 0x8737,
    0x725F, 0x873B,
    0x7264, 0x873E,
    0x726A, 0x873F,
    0x532C, 0x8747,
    0x7265, 0x8748,
    0x3275, 0x8749,
    0x7272, 0x874C,
    0x502B, 0x874E,
    0x7275, 0x8753,
    0x3B48, 0x8757,
    0x7279, 0x8759,
    0x7270, 0x8760,
    0x7276, 0x8763,
    0x7278, 0x8764,
    0x727A, 0x8765,
    0x7273, 0x876E,
    0x7271, 0x8770,
    0x3A7B, 0x8774,
    0x357B, 0x8776,
    0x726F, 0x877B,
    0x7277, 0x877C,
    0x726D, 0x877D,
    0x726E, 0x877E,
    0x726B, 0x8782,
    0x7326, 0x8783,
    0x7323, 0x8785,
    0x7322, 0x8788,
    0x7274, 0x878B,
    0x485A, 0x878D,
    0x727B, 0x8793,
    0x7325, 0x8797,
    0x4378, 0x879F,
    0x727D, 0x87A8,
    0x7327, 0x87AB,
    0x7329, 0x87AC,
    0x7324, 0x87AD,
    0x727C, 0x87AF,
    0x732B, 0x87B3,
    0x732A, 0x87B5,
    0x425D, 0x87BA,
    0x732E, 0x87BD,
    0x7330, 0x87C0,
    0x7321, 0x87C6,
    0x7331, 0x87CA,
    0x732C, 0x87CB,
    0x732F, 0x87D1,
    0x727E, 0x87D2,
    0x732D, 0x87D3,
    0x7332, 0x87DB,
    0x7334, 0x87E0,
    0x7328, 0x87E5,
    0x7333, 0x87EA,
    0x7335, 0x87EE,
    0x5037, 0x87F9,
    0x7338, 0x87FE,
    0x5979, 0x8803,
    0x7339, 0x880A,
    0x7337, 0x8813,
    0x4864, 0x8815,
    0x7336, 0x8816,
    0x733A, 0x881B,
    0x733B, 0x8821,
    0x3440, 0x8822,
    0x6E43, 0x8832,
    0x733C, 0x8839,
    0x733D, 0x883C,
    0x512A, 0x8840,
    0x742C, 0x8844,
    0x5046, 0x8845,
    0x5050, 0x884C,
    0x515C, 0x884D,
    0x4F4E, 0x8854,
    0x3D56, 0x8857,
    0x5143, 0x8859,
    0x3A62, 0x8861,
    0x6169, 0x8862,
    0x5242, 0x8863,
    0x7142, 0x8864,
    0x3239, 0x8865,
    0x316D, 0x8868,
    0x7143, 0x8869,
    0x4940, 0x886B,
    0x3344, 0x886C,
    0x5972, 0x886E,
    0x4B25, 0x8870,
    0x7144, 0x8872,
    0x5654, 0x8877,
    0x7145, 0x887D,
    0x7440, 0x887E,
    0x7146, 0x887F,
    0x542C, 0x8881,
    0x7147, 0x8882,
    0x3040, 0x8884,
    0x7441, 0x8885,
    0x7442, 0x8888,
    0x347C, 0x888B,
    0x455B, 0x888D,
    0x4C3B, 0x8892,
    0x5064, 0x8896,
    0x4D60, 0x889C,
    0x7148, 0x88A2,
    0x5973, 0x88A4,
    0x313B, 0x88AB,
    0x4F2E, 0x88AD,
    0x3824, 0x88B1,
    0x714A, 0x88B7,
    0x714B, 0x88BC,
    0x3243, 0x88C1,
    0x4151, 0x88C2,
    0x5730, 0x88C5,
    0x7149, 0x88C6,
    0x714C, 0x88C9,
    0x714E, 0x88CE,
    0x5976, 0x88D2,
    0x5261, 0x88D4,
    0x5423, 0x88D5,
    0x7443, 0x88D8,
    0x4839, 0x88D9,
    0x7444, 0x88DF,
    0x714D, 0x88E2,
    0x714F, 0x88E3,
    0x3F63, 0x88E4,
    0x7150, 0x88E5,
    0x7154, 0x88E8,
    0x7156, 0x88F0,
    0x7151, 0x88F1,
    0x4951, 0x88F3,
    0x4561, 0x88F4,
    0x4263, 0x88F8,
    0x397C, 0x88F9,
    0x7153, 0x88FC,
    0x7155, 0x88FE,
    0x3953, 0x8902,
    0x715B, 0x890A,
    0x3A56, 0x8910,
    0x307D, 0x8912,
    0x7159, 0x8913,
    0x7158, 0x8919,
    0x7152, 0x891A,
    0x715A, 0x891B,
    0x7157, 0x8921,
    0x486C, 0x8925,
    0x4D4A, 0x892A,
    0x715D, 0x892B,
    0x653D, 0x8930,
    0x715C, 0x8934,
    0x715E, 0x8936,
    0x715F, 0x8941,
    0x4F65, 0x8944,
    0x7445, 0x895E,
    0x3D73, 0x895F,
    0x7160, 0x8966,
    0x7161, 0x897B,
    0x4E77, 0x897F,
    0x522A, 0x8981,
    0x717B, 0x8983,
    0x3832, 0x8986,
    0x3C7B, 0x89C1,
    0x395B, 0x89C2,
    0x3966, 0x89C4,
    0x4359, 0x89C5,
    0x4A53, 0x89C6,
    0x6A68, 0x89C7,
    0x4040, 0x89C8,
    0x3E75, 0x89C9,
    0x6A69, 0x89CA,
    0x6A6A, 0x89CB,
    0x6A6B, 0x89CC,
    0x6A6C, 0x89CE,
    0x6A6D, 0x89CF,
    0x6A6E, 0x89D0,
    0x6A6F, 0x89D1,
    0x3D47, 0x89D2,
    0x757B, 0x89D6,
    0x757D, 0x89DA,
    0x757E, 0x89DC,
    0x757C, 0x89DE,
    0x3D62, 0x89E3,
    0x7621, 0x89E5,
    0x3425, 0x89E6,
    0x7622, 0x89EB,
    0x7623, 0x89EF,
    0x6C32, 0x89F3,
    0x5154, 0x8A00,
    0x596A, 0x8A07,
    0x7624, 0x8A3E,
    0x6E3A, 0x8A48,
    0x5532, 0x8A79,
    0x537E, 0x8A89,
    0x4C5C, 0x8A8A,
    0x4A44, 0x8A93,
    0x6540, 0x8B07,
    0x7625, 0x8B26,
    0x3E2F, 0x8B66,
    0x4629, 0x8B6C,
    0x5A25, 0x8BA0,
    0x3C46, 0x8BA1,
    0x3629, 0x8BA2,
    0x383C, 0x8BA3,
    0x484F, 0x8BA4,
    0x3C25, 0x8BA5,
    0x5A26, 0x8BA6,
    0x5A27, 0x8BA7,
    0x4C56, 0x8BA8,
    0x4843, 0x8BA9,
    0x5A28, 0x8BAA,
    0x467D, 0x8BAB,
    0x5135, 0x8BAD,
    0x5269, 0x8BAE,
    0x5136, 0x8BAF,
    0x3C47, 0x8BB0,
    0x3D32, 0x8BB2,
    0x3B64, 0x8BB3,
    0x5A29, 0x8BB4,
    0x5A2A, 0x8BB5,
    0x5148, 0x8BB6,
    0x5A2B, 0x8BB7,
    0x506D, 0x8BB8,
    0x366F, 0x8BB9,
    0x425B, 0x8BBA,
    0x4B4F, 0x8BBC,
    0x376D, 0x8BBD,
    0x4968, 0x8BBE,
    0x3743, 0x8BBF,
    0x3E77, 0x8BC0,
    0x5624, 0x8BC1,
    0x5A2C, 0x8BC2,
    0x5A2D, 0x8BC3,
    0x4640, 0x8BC4,
    0x5767, 0x8BC5,
    0x4A36, 0x8BC6,
    0x5529, 0x8BC8,
    0x4B5F, 0x8BC9,
    0x556F, 0x8BCA,
    0x5A2E, 0x8BCB,
    0x565F, 0x8BCC,
    0x344A, 0x8BCD,
    0x5A30, 0x8BCE,
    0x5A2F, 0x8BCF,
    0x526B, 0x8BD1,
    0x5A31, 0x8BD2,
    0x5A32, 0x8BD3,
    0x5A33, 0x8BD4,
    0x4A54, 0x8BD5,
    0x5A34, 0x8BD6,
    0x4A2B, 0x8BD7,
    0x5A35, 0x8BD8,
    0x5A36, 0x8BD9,
    0x334F, 0x8BDA,
    0x566F, 0x8BDB,
    0x5A37, 0x8BDC,
    0x3B30, 0x8BDD,
    0x352E, 0x8BDE,
    0x5A38, 0x8BDF,
    0x5A39, 0x8BE0,
    0x396E, 0x8BE1,
    0x512F, 0x8BE2,
    0x5268, 0x8BE3,
    0x5A3A, 0x8BE4,
    0x3843, 0x8BE5,
    0x4F6A, 0x8BE6,
    0x326F, 0x8BE7,
    0x5A3B, 0x8BE8,
    0x5A3C, 0x8BE9,
    0x3D6B, 0x8BEB,
    0x4E5C, 0x8BEC,
    0x536F, 0x8BED,
    0x5A3D, 0x8BEE,
    0x4E73, 0x8BEF,
    0x5A3E, 0x8BF0,
    0x5355, 0x8BF1,
    0x3B65, 0x8BF2,
    0x5A3F, 0x8BF3,
    0x4B35, 0x8BF4,
    0x4B50, 0x8BF5,
    0x5A40, 0x8BF6,
    0x476B, 0x8BF7,
    0x566E, 0x8BF8,
    0x5A41, 0x8BF9,
    0x4535, 0x8BFA,
    0x3641, 0x8BFB,
    0x5A42, 0x8BFC,
    0x374C, 0x8BFD,
    0x3F4E, 0x8BFE,
    0x5A43, 0x8BFF,
    0x5A44, 0x8C00,
    0x4B2D, 0x8C01,
    0x5A45, 0x8C02,
    0x3577, 0x8C03,
    0x5A46, 0x8C04,
    0x4142, 0x8C05,
    0x573B, 0x8C06,
    0x5A47, 0x8C07,
    0x4C38, 0x8C08,
    0x526A, 0x8C0A,
    0x4431, 0x8C0B,
    0x5A48, 0x8C0C,
    0x357D, 0x8C0D,
    0x3B51, 0x8C0E,
    0x5A49, 0x8C0F,
    0x5033, 0x8C10,
    0x5A4A, 0x8C11,
    0x5A4B, 0x8C12,
    0x4E3D, 0x8C13,
    0x5A4C, 0x8C14,
    0x5A4D, 0x8C15,
    0x5A4E, 0x8C16,
    0x3277, 0x8C17,
    0x5A51, 0x8C18,
    0x5A4F, 0x8C19,
    0x5168, 0x8C1A,
    0x5A50, 0x8C1B,
    0x4355, 0x8C1C,
    0x5A52, 0x8C1D,
    0x5A53, 0x8C1F,
    0x5A54, 0x8C20,
    0x5A55, 0x8C21,
    0x503B, 0x8C22,
    0x5225, 0x8C23,
    0x3079, 0x8C24,
    0x5A56, 0x8C25,
    0x472B, 0x8C26,
    0x5A57, 0x8C27,
    0x3D77, 0x8C28,
    0x4321, 0x8C29,
    0x5A58, 0x8C2A,
    0x5A59, 0x8C2B,
    0x437D, 0x8C2C,
    0x4C37, 0x8C2D,
    0x5A5A, 0x8C2E,
    0x5A5B, 0x8C2F,
    0x403E, 0x8C30,
    0x4657, 0x8C31,
    0x5A5C, 0x8C32,
    0x5A5D, 0x8C33,
    0x4734, 0x8C34,
    0x5A5E, 0x8C35,
    0x5A5F, 0x8C36,
    0x3948, 0x8C37,
    0x3B6D, 0x8C41,
    0x3639, 0x8C46,
    0x7478, 0x8C47,
    0x7479, 0x8C49,
    0x4D63, 0x8C4C,
    0x7539, 0x8C55,
    0x6B60, 0x8C5A,
    0x4F73, 0x8C61,
    0x3B3F, 0x8C62,
    0x3A40, 0x8C6A,
    0x5425, 0x8C6B,
    0x6159, 0x8C73,
    0x7574, 0x8C78,
    0x312A, 0x8C79,
    0x3272, 0x8C7A,
    0x7575, 0x8C82,
    0x7577, 0x8C85,
    0x3A51, 0x8C89,
    0x7576, 0x8C8A,
    0x4332, 0x8C8C,
    0x7579, 0x8C94,
    0x7578, 0x8C98,
    0x3134, 0x8D1D,
    0x556A, 0x8D1E,
    0x383A, 0x8D1F,
    0x3931, 0x8D21,
    0x3246, 0x8D22,
    0x5470, 0x8D23,
    0x4F4D, 0x8D24,
    0x305C, 0x8D25,
    0x554B, 0x8D26,
    0x3B75, 0x8D27,
    0x564A, 0x8D28,
    0x3737, 0x8D29,
    0x4C30, 0x8D2A,
    0x4636, 0x8D2B,
    0x3161, 0x8D2C,
    0x393A, 0x8D2D,
    0x567C, 0x8D2E,
    0x3961, 0x8D2F,
    0x3721, 0x8D30,
    0x3C7A, 0x8D31,
    0x6A5A, 0x8D32,
    0x6A5B, 0x8D33,
    0x4C79, 0x8D34,
    0x3973, 0x8D35,
    0x6A5C, 0x8D36,
    0x347B, 0x8D37,
    0x4333, 0x8D38,
    0x3751, 0x8D39,
    0x3A58, 0x8D3A,
    0x6A5D, 0x8D3B,
    0x5474, 0x8D3C,
    0x6A5E, 0x8D3D,
    0x3C56, 0x8D3E,
    0x3B5F, 0x8D3F,
    0x6A5F, 0x8D40,
    0x415E, 0x8D41,
    0x4238, 0x8D42,
    0x545F, 0x8D43,
    0x574A, 0x8D44,
    0x6A60, 0x8D45,
    0x6A61, 0x8D46,
    0x6A64, 0x8D47,
    0x6A62, 0x8D48,
    0x6A63, 0x8D49,
    0x495E, 0x8D4A,
    0x3833, 0x8D4B,
    0x3644, 0x8D4C,
    0x6A65, 0x8D4D,
    0x4A6A, 0x8D4E,
    0x494D, 0x8D4F,
    0x344D, 0x8D50,
    0x6259, 0x8D53,
    0x4562, 0x8D54,
    0x6A66, 0x8D55,
    0x4035, 0x8D56,
    0x5738, 0x8D58,
    0x6A67, 0x8D59,
    0x572C, 0x8D5A,
    0x487C, 0x8D5B,
    0x5853, 0x8D5C,
    0x584D, 0x8D5D,
    0x545E, 0x8D5E,
    0x5479, 0x8D60,
    0x4944, 0x8D61,
    0x532E, 0x8D62,
    0x3853, 0x8D63,
    0x3360, 0x8D64,
    0x4962, 0x8D66,
    0x7476, 0x8D67,
    0x3A55, 0x8D6B,
    0x7477, 0x8D6D,
    0x575F, 0x8D70,
    0x7471, 0x8D73,
    0x3830, 0x8D74,
    0x5554, 0x8D75,
    0x384F, 0x8D76,
    0x4670, 0x8D77,
    0x3343, 0x8D81,
    0x7472, 0x8D84,
    0x332C, 0x8D85,
    0x543D, 0x8D8A,
    0x4777, 0x8D8B,
    0x7474, 0x8D91,
    0x7473, 0x8D94,
    0x4C4B, 0x8D9F,
    0x4824, 0x8DA3,
    0x7475, 0x8DB1,
    0x5763, 0x8DB3,
    0x453F, 0x8DB4,
    0x7540, 0x8DB5,
    0x753B, 0x8DB8,
    0x7543, 0x8DBA,
    0x7542, 0x8DBC,
    0x563A, 0x8DBE,
    0x7541, 0x8DBF,
    0x543E, 0x8DC3,
    0x7544, 0x8DC4,
    0x754C, 0x8DC6,
    0x304F, 0x8DCB,
    0x3578, 0x8DCC,
    0x7549, 0x8DCE,
    0x754A, 0x8DCF,
    0x455C, 0x8DD1,
    0x7545, 0x8DD6,
    0x7546, 0x8DD7,
    0x7547, 0x8DDA,
    0x754B, 0x8DDB,
    0x3E60, 0x8DDD,
    0x7548, 0x8DDE,
    0x387A, 0x8DDF,
    0x7550, 0x8DE3,
    0x7553, 0x8DE4,
    0x3F67, 0x8DE8,
    0x3972, 0x8DEA,
    0x753C, 0x8DEB,
    0x754D, 0x8DEC,
    0x4237, 0x8DEF,
    0x4C78, 0x8DF3,
    0x3C79, 0x8DF5,
    0x754E, 0x8DF7,
    0x754F, 0x8DF8,
    0x7551, 0x8DF9,
    0x3665, 0x8DFA,
    0x7552, 0x8DFB,
    0x7555, 0x8DFD,
    0x753D, 0x8E05,
    0x7554, 0x8E09,
    0x533B, 0x8E0A,
    0x336C, 0x8E0C,
    0x4C24, 0x8E0F,
    0x7556, 0x8E14,
    0x7557, 0x8E1D,
    0x3E61, 0x8E1E,
    0x7558, 0x8E1F,
    0x4C5F, 0x8E22,
    0x755B, 0x8E23,
    0x3248, 0x8E29,
    0x5759, 0x8E2A,
    0x7559, 0x8E2C,
    0x755A, 0x8E2E,
    0x755C, 0x8E2F,
    0x7562, 0x8E31,
    0x7560, 0x8E35,
    0x755F, 0x8E39,
    0x755D, 0x8E3A,
    0x7561, 0x8E3D,
    0x755E, 0x8E40,
    0x7564, 0x8E41,
    0x7565, 0x8E42,
    0x4C63, 0x8E44,
    0x653F, 0x8E47,
    0x3538, 0x8E48,
    0x7563, 0x8E49,
    0x7568, 0x8E4A,
    0x4C23, 0x8E4B,
    0x7566, 0x8E51,
    0x7567, 0x8E52,
    0x753E, 0x8E59,
    0x3144, 0x8E66,
    0x753F, 0x8E69,
    0x3545, 0x8E6C,
    0x3264, 0x8E6D,
    0x756C, 0x8E6F,
    0x7569, 0x8E70,
    0x3657, 0x8E72,
    0x756D, 0x8E74,
    0x756A, 0x8E76,
    0x756B, 0x8E7C,
    0x345A, 0x8E7F,
    0x546A, 0x8E81,
    0x756E, 0x8E85,
    0x3379, 0x8E87,
    0x756F, 0x8E8F,
    0x7571, 0x8E90,
    0x7570, 0x8E94,
    0x7572, 0x8E9C,
    0x7573, 0x8E9E,
    0x496D, 0x8EAB,
    0x392A, 0x8EAC,
    0x477B, 0x8EAF,
    0x3663, 0x8EB2,
    0x4C49, 0x8EBA,
    0x6A26, 0x8ECE,
    0x3335, 0x8F66,
    0x547E, 0x8F67,
    0x396C, 0x8F68,
    0x5079, 0x8F69,
    0x696D, 0x8F6B,
    0x572A, 0x8F6C,
    0x696E, 0x8F6D,
    0x4256, 0x8F6E,
    0x486D, 0x8F6F,
    0x3A64, 0x8F70,
    0x696F, 0x8F71,
    0x6970, 0x8F72,
    0x6971, 0x8F73,
    0x5661, 0x8F74,
    0x6972, 0x8F75,
    0x6973, 0x8F76,
    0x6975, 0x8F77,
    0x6974, 0x8F78,
    0x6976, 0x8F79,
    0x6977, 0x8F7A,
    0x4761, 0x8F7B,
    0x6978, 0x8F7C,
    0x5458, 0x8F7D,
    0x6979, 0x8F7E,
    0x3D4E, 0x8F7F,
    0x697A, 0x8F81,
    0x697B, 0x8F82,
    0x3D4F, 0x8F83,
    0x697C, 0x8F84,
    0x3828, 0x8F85,
    0x413E, 0x8F86,
    0x697D, 0x8F87,
    0x3132, 0x8F88,
    0x3B54, 0x8F89,
    0x3975, 0x8F8A,
    0x697E, 0x8F8B,
    0x6A21, 0x8F8D,
    0x6A22, 0x8F8E,
    0x6A23, 0x8F8F,
    0x3778, 0x8F90,
    0x3C2D, 0x8F91,
    0x4A64, 0x8F93,
    0x604E, 0x8F94,
    0x542F, 0x8F95,
    0x4F3D, 0x8F96,
    0x5537, 0x8F97,
    0x6A24, 0x8F98,
    0x555E, 0x8F99,
    0x6A25, 0x8F9A,
    0x5041, 0x8F9B,
    0x393C, 0x8F9C,
    0x3447, 0x8F9E,
    0x3159, 0x8F9F,
    0x4031, 0x8FA3,
    0x3166, 0x8FA8,
    0x3167, 0x8FA9,
    0x3168, 0x8FAB,
    0x333D, 0x8FB0,
    0x4868, 0x8FB1,
    0x6541, 0x8FB6,
    0x315F, 0x8FB9,
    0x4149, 0x8FBD,
    0x346F, 0x8FBE,
    0x4728, 0x8FC1,
    0x5358, 0x8FC2,
    0x4679, 0x8FC4,
    0x5138, 0x8FC5,
    0x397D, 0x8FC7,
    0x4275, 0x8FC8,
    0x532D, 0x8FCE,
    0x544B, 0x8FD0,
    0x3D7C, 0x8FD1,
    0x6542, 0x8FD3,
    0x3735, 0x8FD4,
    0x6543, 0x8FD5,
    0x3B39, 0x8FD8,
    0x5562, 0x8FD9,
    0x3D78, 0x8FDB,
    0x5436, 0x8FDC,
    0x4E25, 0x8FDD,
    0x412C, 0x8FDE,
    0x3359, 0x8FDF,
    0x4C76, 0x8FE2,
    0x6546, 0x8FE4,
    0x6544, 0x8FE5,
    0x6548, 0x8FE6,
    0x654A, 0x8FE8,
    0x6547, 0x8FE9,
    0x354F, 0x8FEA,
    0x4648, 0x8FEB,
    0x357C, 0x8FED,
    0x6545, 0x8FEE,
    0x4A76, 0x8FF0,
    0x6549, 0x8FF3,
    0x4354, 0x8FF7,
    0x3145, 0x8FF8,
    0x3C23, 0x8FF9,
    0x5737, 0x8FFD,
    0x4D4B, 0x9000,
    0x4B4D, 0x9001,
    0x4A4A, 0x9002,
    0x4C53, 0x9003,
    0x654C, 0x9004,
    0x654B, 0x9005,
    0x4466, 0x9006,
    0x5121, 0x9009,
    0x5137, 0x900A,
    0x654D, 0x900B,
    0x6550, 0x900D,
    0x4D38, 0x900F,
    0x5670, 0x9010,
    0x654F, 0x9011,
    0x355D, 0x9012,
    0x4D3E, 0x9014,
    0x6551, 0x9016,
    0x363A, 0x9017,
    0x4D28, 0x901A,
    0x3964, 0x901B,
    0x4A45, 0x901D,
    0x3351, 0x901E,
    0x4B59, 0x901F,
    0x546C, 0x9020,
    0x6552, 0x9021,
    0x376A, 0x9022,
    0x654E, 0x9026,
    0x6555, 0x902D,
    0x347E, 0x902E,
    0x6556, 0x902F,
    0x6553, 0x9035,
    0x6554, 0x9036,
    0x525D, 0x9038,
    0x425F, 0x903B,
    0x3146, 0x903C,
    0x5362, 0x903E,
    0x365D, 0x9041,
    0x4B6C, 0x9042,
    0x6557, 0x9044,
    0x5376, 0x9047,
    0x3169, 0x904D,
    0x3674, 0x904F,
    0x655A, 0x9050,
    0x6558, 0x9051,
    0x6559, 0x9052,
    0x3540, 0x9053,
    0x5245, 0x9057,
    0x655C, 0x9058,
    0x655E, 0x905B,
    0x655D, 0x9062,
    0x4732, 0x9063,
    0x5223, 0x9065,
    0x655B, 0x9068,
    0x5462, 0x906D,
    0x555A, 0x906E,
    0x6560, 0x9074,
    0x5771, 0x9075,
    0x6561, 0x907D,
    0x315C, 0x907F,
    0x517B, 0x9080,
    0x6562, 0x9082,
    0x6564, 0x9083,
    0x6563, 0x9088,
    0x6565, 0x908B,
    0x5258, 0x9091,
    0x354B, 0x9093,
    0x675F, 0x9095,
    0x5A75, 0x9097,
    0x5A78, 0x9099,
    0x5A76, 0x909B,
    0x5A77, 0x909D,
    0x5A7A, 0x90A1,
    0x504F, 0x90A2,
    0x4447, 0x90A3,
    0x306E, 0x90A6,
    0x5030, 0x90AA,
    0x5A79, 0x90AC,
    0x534A, 0x90AE,
    0x3A2A, 0x90AF,
    0x5B22, 0x90B0,
    0x4771, 0x90B1,
    0x5A7C, 0x90B3,
    0x5A7B, 0x90B4,
    0x495B, 0x90B5,
    0x5A7D, 0x90B6,
    0x5B21, 0x90B8,
    0x575E, 0x90B9,
    0x5A7E, 0x90BA,
    0x415A, 0x90BB,
    0x5B25, 0x90BE,
    0x5374, 0x90C1,
    0x5B27, 0x90C4,
    0x5B24, 0x90C5,
    0x5B28, 0x90C7,
    0x3D3C, 0x90CA,
    0x4049, 0x90CE,
    0x5B23, 0x90CF,
    0x5B26, 0x90D0,
    0x5623, 0x90D1,
    0x5B29, 0x90D3,
    0x5B2D, 0x90D7,
    0x5B2E, 0x90DB,
    0x5B2C, 0x90DC,
    0x3A42, 0x90DD,
    0x3F24, 0x90E1,
    0x5B2B, 0x90E2,
    0x5B2A, 0x90E6,
    0x5447, 0x90E7,
    0x323F, 0x90E8,
    0x5B2F, 0x90EB,
    0x3979, 0x90ED,
    0x5B30, 0x90EF,
    0x333B, 0x90F4,
    0x3526, 0x90F8,
    0x363C, 0x90FD,
    0x5B31, 0x90FE,
    0x3675, 0x9102,
    0x5B32, 0x9104,
    0x3149, 0x9119,
    0x5B34, 0x911E,
    0x5B33, 0x9122,
    0x5B35, 0x9123,
    0x5B37, 0x912F,
    0x5B36, 0x9131,
    0x5B38, 0x9139,
    0x5B39, 0x9143,
    0x5B3A, 0x9146,
    0x534F, 0x9149,
    0x747A, 0x914A,
    0x4775, 0x914B,
    0x5743, 0x914C,
    0x4564, 0x914D,
    0x747C, 0x914E,
    0x747D, 0x914F,
    0x747B, 0x9150,
    0x3E46, 0x9152,
    0x506F, 0x9157,
    0x3753, 0x915A,
    0x544D, 0x915D,
    0x4C2A, 0x915E,
    0x7522, 0x9161,
    0x7521, 0x9162,
    0x3A28, 0x9163,
    0x747E, 0x9164,
    0x4B56, 0x9165,
    0x7524, 0x9169,
    0x4052, 0x916A,
    0x336A, 0x916C,
    0x4D2A, 0x916E,
    0x7525, 0x916F,
    0x7523, 0x9170,
    0x3D34, 0x9171,
    0x7528, 0x9172,
    0x7529, 0x9174,
    0x3D4D, 0x9175,
    0x4338, 0x9176,
    0x3F61, 0x9177,
    0x4B61, 0x9178,
    0x752A, 0x9179,
    0x7526, 0x917D,
    0x7527, 0x917E,
    0x4470, 0x917F,
    0x752C, 0x9185,
    0x343C, 0x9187,
    0x576D, 0x9189,
    0x3457, 0x918B,
    0x752B, 0x918C,
    0x752E, 0x918D,
    0x752D, 0x9190,
    0x752F, 0x9191,
    0x5051, 0x9192,
    0x4351, 0x919A,
    0x4829, 0x919B,
    0x7530, 0x91A2,
    0x7531, 0x91A3,
    0x7532, 0x91AA,
    0x7533, 0x91AD,
    0x7534, 0x91AE,
    0x7535, 0x91AF,
    0x7537, 0x91B4,
    0x7536, 0x91B5,
    0x7538, 0x91BA,
    0x3249, 0x91C7,
    0x5354, 0x91C9,
    0x4A4D, 0x91CA,
    0x406F, 0x91CC,
    0x5658, 0x91CD,
    0x5230, 0x91CE,
    0x413F, 0x91CF,
    0x3D70, 0x91D1,
    0x382A, 0x91DC,
    0x3C78, 0x9274,
    0x7646, 0x928E,
    0x7647, 0x92AE,
    0x7648, 0x92C8,
    0x7649, 0x933E,
    0x764A, 0x936A,
    0x764C, 0x938F,
    0x764B, 0x93CA,
    0x7769, 0x93D6,
    0x764D, 0x943E,
    0x764E, 0x946B,
    0x6E44, 0x9485,
    0x6E45, 0x9486,
    0x6E46, 0x9487,
    0x556B, 0x9488,
    0x3624, 0x9489,
    0x6E48, 0x948A,
    0x6E47, 0x948B,
    0x6E49, 0x948C,
    0x6E4A, 0x948D,
    0x4725, 0x948E,
    0x6E4B, 0x948F,
    0x6E4C, 0x9490,
    0x3730, 0x9492,
    0x3576, 0x9493,
    0x6E4D, 0x9494,
    0x6E4F, 0x9495,
    0x6E4E, 0x9497,
    0x3846, 0x9499,
    0x6E50, 0x949A,
    0x6E51, 0x949B,
    0x6E52, 0x949C,
    0x365B, 0x949D,
    0x332E, 0x949E,
    0x5653, 0x949F,
    0x4446, 0x94A0,
    0x3135, 0x94A1,
    0x3856, 0x94A2,
    0x6E53, 0x94A3,
    0x6E54, 0x94A4,
    0x543F, 0x94A5,
    0x4755, 0x94A6,
    0x3E7B, 0x94A7,
    0x4E59, 0x94A8,
    0x3933, 0x94A9,
    0x6E56, 0x94AA,
    0x6E55, 0x94AB,
    0x6E58, 0x94AC,
    0x6E57, 0x94AD,
    0x4525, 0x94AE,
    0x6E59, 0x94AF,
    0x6E5A, 0x94B0,
    0x472E, 0x94B1,
    0x6E5B, 0x94B2,
    0x472F, 0x94B3,
    0x6E5C, 0x94B4,
    0x3227, 0x94B5,
    0x6E5D, 0x94B6,
    0x6E5E, 0x94B7,
    0x6E5F, 0x94B8,
    0x6E60, 0x94B9,
    0x6E61, 0x94BA,
    0x576A, 0x94BB,
    0x6E62, 0x94BC,
    0x6E63, 0x94BD,
    0x3C58, 0x94BE,
    0x6E64, 0x94BF,
    0x534B, 0x94C0,
    0x4C7A, 0x94C1,
    0x322C, 0x94C2,
    0x4165, 0x94C3,
    0x6E65, 0x94C4,
    0x4726, 0x94C5,
    0x432D, 0x94C6,
    0x6E66, 0x94C8,
    0x6E67, 0x94C9,
    0x6E68, 0x94CA,
    0x6E69, 0x94CB,
    0x6E6A, 0x94CC,
    0x6E6B, 0x94CD,
    0x6E6C, 0x94CE,
    0x6E6D, 0x94D0,
    0x6E6E, 0x94D1,
    0x6E6F, 0x94D2,
    0x6E70, 0x94D5,
    0x6E71, 0x94D6,
    0x6E72, 0x94D7,
    0x6E74, 0x94D8,
    0x6E73, 0x94D9,
    0x6E75, 0x94DB,
    0x4D2D, 0x94DC,
    0x4241, 0x94DD,
    0x6E76, 0x94DE,
    0x6E77, 0x94DF,
    0x6E78, 0x94E0,
    0x5521, 0x94E1,
    0x6E79, 0x94E2,
    0x4F33, 0x94E3,
    0x6E7A, 0x94E4,
    0x6E7B, 0x94E5,
    0x6E7C, 0x94E7,
    0x6E7D, 0x94E8,
    0x6F21, 0x94E9,
    0x6E7E, 0x94EA,
    0x6F22, 0x94EB,
    0x3875, 0x94EC,
    0x437A, 0x94ED,
    0x6F23, 0x94EE,
    0x6F24, 0x94EF,
    0x3D42, 0x94F0,
    0x523F, 0x94F1,
    0x3279, 0x94F2,
    0x6F25, 0x94F3,
    0x6F26, 0x94F4,
    0x6F27, 0x94F5,
    0x5278, 0x94F6,
    0x6F28, 0x94F7,
    0x567D, 0x94F8,
    0x6F29, 0x94F9,
    0x464C, 0x94FA,
    0x6F2A, 0x94FC,
    0x6F2B, 0x94FD,
    0x4134, 0x94FE,
    0x6F2C, 0x94FF,
    0x4F7A, 0x9500,
    0x4B78, 0x9501,
    0x6F2E, 0x9502,
    0x6F2D, 0x9503,
    0x337A, 0x9504,
    0x3978, 0x9505,
    0x6F2F, 0x9506,
    0x6F30, 0x9507,
    0x5062, 0x9508,
    0x6F31, 0x9509,
    0x6F32, 0x950A,
    0x3766, 0x950B,
    0x503F, 0x950C,
    0x6F33, 0x950D,
    0x6F34, 0x950E,
    0x6F35, 0x950F,
    0x4871, 0x9510,
    0x4C60, 0x9511,
    0x6F36, 0x9512,
    0x6F37, 0x9513,
    0x6F38, 0x9514,
    0x6F39, 0x9515,
    0x6F3A, 0x9516,
    0x5560, 0x9517,
    0x6F3B, 0x9518,
    0x346D, 0x9519,
    0x432A, 0x951A,
    0x6F3C, 0x951B,
    0x6F3D, 0x951D,
    0x6F3E, 0x951E,
    0x6F3F, 0x951F,
    0x4E7D, 0x9521,
    0x6F40, 0x9522,
    0x4260, 0x9523,
    0x3438, 0x9524,
    0x5736, 0x9525,
    0x3D75, 0x9526,
    0x4F47, 0x9528,
    0x6F43, 0x9529,
    0x6F41, 0x952A,
    0x6F42, 0x952B,
    0x6F44, 0x952C,
    0x3627, 0x952D,
    0x3C7C, 0x952E,
    0x3E62, 0x952F,
    0x434C, 0x9530,
    0x6F45, 0x9531,
    0x6F46, 0x9532,
    0x6F47, 0x9534,
    0x6F4F, 0x9535,
    0x6F48, 0x9536,
    0x6F49, 0x9537,
    0x6F4A, 0x9538,
    0x4742, 0x9539,
    0x6F71, 0x953A,
    0x364D, 0x953B,
    0x6F4B, 0x953C,
    0x6F4C, 0x953E,
    0x6F4D, 0x953F,
    0x3646, 0x9540,
    0x433E, 0x9541,
    0x6F4E, 0x9542,
    0x6F50, 0x9544,
    0x6F51, 0x9545,
    0x6F52, 0x9546,
    0x5572, 0x9547,
    0x6F53, 0x9549,
    0x4477, 0x954A,
    0x6F54, 0x954C,
    0x4478, 0x954D,
    0x6F55, 0x954E,
    0x6F56, 0x954F,
    0x3864, 0x9550,
    0x3077, 0x9551,
    0x6F57, 0x9552,
    0x6F58, 0x9553,
    0x6F59, 0x9554,
    0x6F5A, 0x9556,
    0x6F5B, 0x9557,
    0x6F5C, 0x9558,
    0x6F5D, 0x9559,
    0x6F5E, 0x955B,
    0x3E35, 0x955C,
    0x6F61, 0x955D,
    0x6F5F, 0x955E,
    0x6F60, 0x955F,
    0x6F62, 0x9561,
    0x6F63, 0x9562,
    0x414D, 0x9563,
    0x6F64, 0x9564,
    0x6F65, 0x9565,
    0x6F66, 0x9566,
    0x6F67, 0x9567,
    0x6F68, 0x9568,
    0x6F69, 0x9569,
    0x6F6A, 0x956A,
    0x6F6B, 0x956B,
    0x6F6C, 0x956C,
    0x4058, 0x956D,
    0x6F6D, 0x956F,
    0x412D, 0x9570,
    0x6F6E, 0x9571,
    0x6F6F, 0x9572,
    0x6F70, 0x9573,
    0x4F62, 0x9576,
    0x3324, 0x957F,
    0x4345, 0x95E8,
    0x6345, 0x95E9,
    0x4941, 0x95EA,
    0x6346, 0x95EB,
    0x3155, 0x95ED,
    0x4E4A, 0x95EE,
    0x3433, 0x95EF,
    0x4872, 0x95F0,
    0x6347, 0x95F1,
    0x4F50, 0x95F2,
    0x6348, 0x95F3,
    0x3C64, 0x95F4,
    0x6349, 0x95F5,
    0x634A, 0x95F6,
    0x4346, 0x95F7,
    0x5522, 0x95F8,
    0x4456, 0x95F9,
    0x396B, 0x95FA,
    0x4E45, 0x95FB,
    0x634B, 0x95FC,
    0x4376, 0x95FD,
    0x634C, 0x95FE,
    0x3727, 0x9600,
    0x3873, 0x9601,
    0x3A52, 0x9602,
    0x634D, 0x9603,
    0x634E, 0x9604,
    0x5444, 0x9605,
    0x634F, 0x9606,
    0x6350, 0x9608,
    0x514B, 0x9609,
    0x6351, 0x960A,
    0x6352, 0x960B,
    0x6353, 0x960C,
    0x6354, 0x960D,
    0x5156, 0x960E,
    0x6355, 0x960F,
    0x327B, 0x9610,
    0x403B, 0x9611,
    0x6356, 0x9612,
    0x402B, 0x9614,
    0x6357, 0x9615,
    0x6358, 0x9616,
    0x6359, 0x9617,
    0x635A, 0x9619,
    0x635B, 0x961A,
    0x3837, 0x961C,
    0x5A62, 0x961D,
    0x3653, 0x961F,
    0x5A64, 0x9621,
    0x5A63, 0x9622,
    0x5A66, 0x962A,
    0x486E, 0x962E,
    0x5A65, 0x9631,
    0x3740, 0x9632,
    0x5174, 0x9633,
    0x5275, 0x9634,
    0x5573, 0x9635,
    0x3D57, 0x9636,
    0x5768, 0x963B,
    0x5A68, 0x963C,
    0x5A67, 0x963D,
    0x3022, 0x963F,
    0x4D53, 0x9640,
    0x5A69, 0x9642,
    0x383D, 0x9644,
    0x3C4A, 0x9645,
    0x423D, 0x9646,
    0x4224, 0x9647,
    0x3342, 0x9648,
    0x5A6A, 0x9649,
    0x422A, 0x964B,
    0x4430, 0x964C,
    0x3D35, 0x964D,
    0x4F5E, 0x9650,
    0x5A6B, 0x9654,
    0x4942, 0x9655,
    0x315D, 0x965B,
    0x5A6C, 0x965F,
    0x3638, 0x9661,
    0x543A, 0x9662,
    0x337D, 0x9664,
    0x5A6D, 0x9667,
    0x5449, 0x9668,
    0x4F55, 0x9669,
    0x4563, 0x966A,
    0x5A6E, 0x966C,
    0x5A6F, 0x9672,
    0x5A70, 0x9674,
    0x416A, 0x9675,
    0x4C55, 0x9676,
    0x4F5D, 0x9677,
    0x5367, 0x9685,
    0x4221, 0x9686,
    0x5A71, 0x9688,
    0x4B65, 0x968B,
    0x5A72, 0x968D,
    0x4B66, 0x968F,
    0x527E, 0x9690,
    0x3874, 0x9694,
    0x5A73, 0x9697,
    0x302F, 0x9698,
    0x4F36, 0x9699,
    0x554F, 0x969C,
    0x4B6D, 0x96A7,
    0x5A74, 0x96B0,
    0x6344, 0x96B3,
    0x4125, 0x96B6,
    0x763F, 0x96B9,
    0x7640, 0x96BC,
    0x7641, 0x96BD,
    0x4451, 0x96BE,
    0x4838, 0x96C0,
    0x5163, 0x96C1,
    0x505B, 0x96C4,
    0x5145, 0x96C5,
    0x3C2F, 0x96C6,
    0x394D, 0x96C7,
    0x6F74, 0x96C9,
    0x3446, 0x96CC,
    0x533A, 0x96CD,
    0x7642, 0x96CE,
    0x337B, 0x96CF,
    0x7643, 0x96D2,
    0x3571, 0x96D5,
    0x7645, 0x96E0,
    0x536A, 0x96E8,
    0x7627, 0x96E9,
    0x5129, 0x96EA,
    0x7629, 0x96EF,
    0x7628, 0x96F3,
    0x4163, 0x96F6,
    0x4057, 0x96F7,
    0x3122, 0x96F9,
    0x4E6D, 0x96FE,
    0x5068, 0x9700,
    0x762B, 0x9701,
    0x4F76, 0x9704,
    0x762A, 0x9706,
    0x5570, 0x9707,
    0x762C, 0x9708,
    0x4339, 0x9709,
    0x3B74, 0x970D,
    0x762E, 0x970E,
    0x762D, 0x970F,
    0x445E, 0x9713,
    0x4158, 0x9716,
    0x4B2A, 0x971C,
    0x4F3C, 0x971E,
    0x762F, 0x972A,
    0x7630, 0x972D,
    0x7631, 0x9730,
    0x4236, 0x9732,
    0x3054, 0x9738,
    0x4579, 0x9739,
    0x7632, 0x973E,
    0x4760, 0x9752,
    0x7626, 0x9753,
    0x3E38, 0x9756,
    0x3E32, 0x9759,
    0x3565, 0x975B,
    0x3747, 0x975E,
    0x3F3F, 0x9760,
    0x4352, 0x9761,
    0x4366, 0x9762,
    0x584C, 0x9765,
    0x386F, 0x9769,
    0x3D79, 0x9773,
    0x5125, 0x9774,
    0x3050, 0x9776,
    0x7730, 0x977C,
    0x7731, 0x9785,
    0x502C, 0x978B,
    0x3030, 0x978D,
    0x7732, 0x9791,
    0x7733, 0x9792,
    0x7734, 0x9794,
    0x474A, 0x9798,
    0x3E4F, 0x97A0,
    0x7737, 0x97A3,
    0x7736, 0x97AB,
    0x315E, 0x97AD,
    0x7735, 0x97AF,
    0x7738, 0x97B2,
    0x7739, 0x97B4,
    0x4E24, 0x97E6,
    0x484D, 0x97E7,
    0x3A2B, 0x97E9,
    0x6838, 0x97EA,
    0x6839, 0x97EB,
    0x683A, 0x97EC,
    0x3E42, 0x97ED,
    0x5274, 0x97F3,
    0x544F, 0x97F5,
    0x4958, 0x97F6,
    0x5233, 0x9875,
    0x3625, 0x9876,
    0x476A, 0x9877,
    0x717C, 0x9878,
    0x4F6E, 0x9879,
    0x4B33, 0x987A,
    0x506B, 0x987B,
    0x676F, 0x987C,
    0x4D67, 0x987D,
    0x394B, 0x987E,
    0x3659, 0x987F,
    0x717D, 0x9880,
    0x3064, 0x9881,
    0x4B4C, 0x9882,
    0x717E, 0x9883,
    0x5424, 0x9884,
    0x422D, 0x9885,
    0x416C, 0x9886,
    0x4644, 0x9887,
    0x3E31, 0x9888,
    0x7221, 0x9889,
    0x3C55, 0x988A,
    0x7222, 0x988C,
    0x7223, 0x988D,
    0x7224, 0x988F,
    0x5243, 0x9890,
    0x4635, 0x9891,
    0x4D47, 0x9893,
    0x7225, 0x9894,
    0x5331, 0x9896,
    0x3F45, 0x9897,
    0x4C62, 0x9898,
    0x7226, 0x989A,
    0x7227, 0x989B,
    0x5155, 0x989C,
    0x366E, 0x989D,
    0x7228, 0x989E,
    0x7229, 0x989F,
    0x355F, 0x98A0,
    0x722A, 0x98A1,
    0x722B, 0x98A2,
    0x327C, 0x98A4,
    0x722C, 0x98A5,
    0x722D, 0x98A6,
    0x4827, 0x98A7,
    0x3767, 0x98CE,
    0x6C29, 0x98D1,
    0x6C2A, 0x98D2,
    0x6C2B, 0x98D3,
    0x6C2C, 0x98D5,
    0x462E, 0x98D8,
    0x6C2D, 0x98D9,
    0x6C2E, 0x98DA,
    0x3749, 0x98DE,
    0x4A33, 0x98DF,
    0x6238, 0x98E7,
    0x774F, 0x98E8,
    0x7750, 0x990D,
    0x324D, 0x9910,
    0x7751, 0x992E,
    0x7753, 0x9954,
    0x7752, 0x9955,
    0x623B, 0x9963,
    0x3C22, 0x9965,
    0x623C, 0x9967,
    0x623D, 0x9968,
    0x623E, 0x9969,
    0x623F, 0x996A,
    0x6240, 0x996B,
    0x6241, 0x996C,
    0x3739, 0x996D,
    0x527B, 0x996E,
    0x3D24, 0x996F,
    0x4A4E, 0x9970,
    0x3125, 0x9971,
    0x4B47, 0x9972,
    0x6242, 0x9974,
    0x367C, 0x9975,
    0x4844, 0x9976,
    0x6243, 0x9977,
    0x3D48, 0x997A,
    0x317D, 0x997C,
    0x6244, 0x997D,
    0x3676, 0x997F,
    0x6245, 0x9980,
    0x4459, 0x9981,
    0x6246, 0x9984,
    0x4F5A, 0x9985,
    0x395D, 0x9986,
    0x6247, 0x9987,
    0x4021, 0x9988,
    0x6248, 0x998A,
    0x3276, 0x998B,
    0x6249, 0x998D,
    0x4173, 0x998F,
    0x624A, 0x9990,
    0x624B, 0x9991,
    0x4278, 0x9992,
    0x624C, 0x9993,
    0x624D, 0x9994,
    0x624E, 0x9995,
    0x4A57, 0x9996,
    0x5838, 0x9997,
    0x5965, 0x9998,
    0x4F63, 0x9999,
    0x7025, 0x99A5,
    0x5C30, 0x99A8,
    0x426D, 0x9A6C,
    0x5426, 0x9A6D,
    0x4D54, 0x9A6E,
    0x5131, 0x9A6F,
    0x335B, 0x9A70,
    0x477D, 0x9A71,
    0x3235, 0x9A73,
    0x423F, 0x9A74,
    0x6660, 0x9A75,
    0x4A3B, 0x9A76,
    0x6661, 0x9A77,
    0x6662, 0x9A78,
    0x3E54, 0x9A79,
    0x6663, 0x9A7A,
    0x5724, 0x9A7B,
    0x4D55, 0x9A7C,
    0x6665, 0x9A7D,
    0x3C5D, 0x9A7E,
    0x6664, 0x9A7F,
    0x6666, 0x9A80,
    0x6667, 0x9A81,
    0x426E, 0x9A82,
    0x3D3E, 0x9A84,
    0x6668, 0x9A85,
    0x4266, 0x9A86,
    0x3A27, 0x9A87,
    0x6669, 0x9A88,
    0x666A, 0x9A8A,
    0x3352, 0x9A8B,
    0x5169, 0x9A8C,
    0x3F25, 0x9A8F,
    0x666B, 0x9A90,
    0x466F, 0x9A91,
    0x666C, 0x9A92,
    0x666D, 0x9A93,
    0x666E, 0x9A96,
    0x462D, 0x9A97,
    0x666F, 0x9A98,
    0x4927, 0x9A9A,
    0x6670, 0x9A9B,
    0x6671, 0x9A9C,
    0x6672, 0x9A9D,
    0x6539, 0x9A9E,
    0x6673, 0x9A9F,
    0x6674, 0x9AA0,
    0x4262, 0x9AA1,
    0x6675, 0x9AA2,
    0x6676, 0x9AA3,
    0x5668, 0x9AA4,
    0x6677, 0x9AA5,
    0x6678, 0x9AA7,
    0x3947, 0x9AA8,
    0x773B, 0x9AB0,
    0x773A, 0x9AB1,
    0x773E, 0x9AB6,
    0x773C, 0x9AB7,
    0x3A21, 0x9AB8,
    0x773F, 0x9ABA,
    0x7740, 0x9ABC,
    0x7742, 0x9AC0,
    0x7741, 0x9AC1,
    0x7744, 0x9AC2,
    0x7743, 0x9AC5,
    0x7745, 0x9ACB,
    0x7746, 0x9ACC,
    0x7747, 0x9AD1,
    0x4B68, 0x9AD3,
    0x385F, 0x9AD8,
    0x7754, 0x9ADF,
    0x7755, 0x9AE1,
    0x7756, 0x9AE6,
    0x7758, 0x9AEB,
    0x775A, 0x9AED,
    0x7757, 0x9AEF,
    0x775B, 0x9AF9,
    0x7759, 0x9AFB,
    0x5757, 0x9B03,
    0x775C, 0x9B08,
    0x775D, 0x9B0F,
    0x775E, 0x9B13,
    0x775F, 0x9B1F,
    0x7760, 0x9B23,
    0x5B4B, 0x9B2F,
    0x582A, 0x9B32,
    0x6577, 0x9B3B,
    0x396D, 0x9B3C,
    0x3F7D, 0x9B41,
    0x3B6A, 0x9B42,
    0x7749, 0x9B43,
    0x4647, 0x9B44,
    0x7748, 0x9B45,
    0x774A, 0x9B47,
    0x774C, 0x9B48,
    0x774B, 0x9B49,
    0x774D, 0x9B4D,
    0x4E3A, 0x9B4F,
    0x774E, 0x9B51,
    0x4427, 0x9B54,
    0x5363, 0x9C7C,
    0x764F, 0x9C7F,
    0x4233, 0x9C81,
    0x7650, 0x9C82,
    0x7651, 0x9C85,
    0x7652, 0x9C86,
    0x7653, 0x9C87,
    0x7654, 0x9C88,
    0x7656, 0x9C8B,
    0x312B, 0x9C8D,
    0x7657, 0x9C8E,
    0x7658, 0x9C90,
    0x7659, 0x9C91,
    0x765A, 0x9C92,
    0x765B, 0x9C94,
    0x765C, 0x9C95,
    0x765D, 0x9C9A,
    0x765E, 0x9C9B,
    0x4F4A, 0x9C9C,
    0x765F, 0x9C9E,
    0x7660, 0x9C9F,
    0x7661, 0x9CA0,
    0x7662, 0x9CA1,
    0x7663, 0x9CA2,
    0x7664, 0x9CA3,
    0x4070, 0x9CA4,
    0x7665, 0x9CA5,
    0x7666, 0x9CA6,
    0x7667, 0x9CA7,
    0x7668, 0x9CA8,
    0x7669, 0x9CA9,
    0x766A, 0x9CAB,
    0x766B, 0x9CAD,
    0x766C, 0x9CAE,
    0x766D, 0x9CB0,
    0x766E, 0x9CB1,
    0x766F, 0x9CB2,
    0x7670, 0x9CB3,
    0x7671, 0x9CB4,
    0x7672, 0x9CB5,
    0x7673, 0x9CB6,
    0x7674, 0x9CB7,
    0x3E28, 0x9CB8,
    0x7675, 0x9CBA,
    0x7676, 0x9CBB,
    0x7677, 0x9CBC,
    0x7678, 0x9CBD,
    0x487A, 0x9CC3,
    0x7679, 0x9CC4,
    0x767A, 0x9CC5,
    0x767B, 0x9CC6,
    0x767C, 0x9CC7,
    0x767D, 0x9CCA,
    0x767E, 0x9CCB,
    0x7721, 0x9CCC,
    0x7722, 0x9CCD,
    0x7723, 0x9CCE,
    0x7724, 0x9CCF,
    0x7725, 0x9CD0,
    0x7726, 0x9CD3,
    0x7727, 0x9CD4,
    0x7728, 0x9CD5,
    0x316E, 0x9CD6,
    0x7729, 0x9CD7,
    0x772A, 0x9CD8,
    0x772B, 0x9CD9,
    0x772C, 0x9CDC,
    0x772D, 0x9CDD,
    0x415B, 0x9CDE,
    0x772E, 0x9CDF,
    0x772F, 0x9CE2,
    0x4471, 0x9E1F,
    0x702F, 0x9E20,
    0x3C26, 0x9E21,
    0x7030, 0x9E22,
    0x4379, 0x9E23,
    0x4538, 0x9E25,
    0x513B, 0x9E26,
    0x7031, 0x9E28,
    0x7032, 0x9E29,
    0x7033, 0x9E2A,
    0x7034, 0x9E2B,
    0x7035, 0x9E2C,
    0x513C, 0x9E2D,
    0x516C, 0x9E2F,
    0x7037, 0x9E31,
    0x7036, 0x9E32,
    0x5427, 0x9E33,
    0x4D52, 0x9E35,
    0x7038, 0x9E36,
    0x703A, 0x9E37,
    0x7039, 0x9E38,
    0x703B, 0x9E39,
    0x703C, 0x9E3A,
    0x386B, 0x9E3D,
    0x703D, 0x9E3E,
    0x3A68, 0x9E3F,
    0x703E, 0x9E41,
    0x703F, 0x9E42,
    0x3E69, 0x9E43,
    0x7040, 0x9E44,
    0x366C, 0x9E45,
    0x7041, 0x9E46,
    0x7042, 0x9E47,
    0x7043, 0x9E48,
    0x7044, 0x9E49,
    0x4835, 0x9E4A,
    0x7045, 0x9E4B,
    0x7046, 0x9E4C,
    0x7047, 0x9E4E,
    0x4574, 0x9E4F,
    0x7048, 0x9E51,
    0x7049, 0x9E55,
    0x704A, 0x9E57,
    0x773D, 0x9E58,
    0x704B, 0x9E5A,
    0x704C, 0x9E5B,
    0x704D, 0x9E5C,
    0x704E, 0x9E5E,
    0x704F, 0x9E63,
    0x3A57, 0x9E64,
    0x7050, 0x9E66,
    0x7051, 0x9E67,
    0x7052, 0x9E68,
    0x7053, 0x9E69,
    0x7054, 0x9E6A,
    0x7055, 0x9E6B,
    0x7056, 0x9E6C,
    0x7058, 0x9E6D,
    0x5325, 0x9E70,
    0x7057, 0x9E71,
    0x7059, 0x9E73,
    0x753A, 0x9E7E,
    0x4239, 0x9E7F,
    0x7764, 0x9E82,
    0x7765, 0x9E87,
    0x7766, 0x9E88,
    0x7767, 0x9E8B,
    0x7768, 0x9E92,
    0x4234, 0x9E93,
    0x776A, 0x9E9D,
    0x776B, 0x9E9F,
    0x4273, 0x9EA6,
    0x7470, 0x9EB4,
    0x746F, 0x9EB8,
    0x4269, 0x9EBB,
    0x7761, 0x9EBD,
    0x7762, 0x9EBE,
    0x3B46, 0x9EC4,
    0x5964, 0x9EC9,
    0x4A72, 0x9ECD,
    0x4068, 0x9ECE,
    0x7024, 0x9ECF,
    0x3A5A, 0x9ED1,
    0x472D, 0x9ED4,
    0x442C, 0x9ED8,
    0x776C, 0x9EDB,
    0x776D, 0x9EDC,
    0x776E, 0x9EDD,
    0x7770, 0x9EDF,
    0x776F, 0x9EE0,
    0x7771, 0x9EE2,
    0x7774, 0x9EE5,
    0x7773, 0x9EE7,
    0x7772, 0x9EE9,
    0x7775, 0x9EEA,
    0x7776, 0x9EEF,
    0x6D69, 0x9EF9,
    0x6D6A, 0x9EFB,
    0x6D6B, 0x9EFC,
    0x763C, 0x9EFE,
    0x763D, 0x9F0B,
    0x763E, 0x9F0D,
    0x3626, 0x9F0E,
    0x583E, 0x9F10,
    0x3944, 0x9F13,
    0x583B, 0x9F17,
    0x5C31, 0x9F19,
    0x4A73, 0x9F20,
    0x7777, 0x9F22,
    0x7778, 0x9F2C,
    0x7779, 0x9F2F,
    0x777B, 0x9F37,
    0x777A, 0x9F39,
    0x3147, 0x9F3B,
    0x777C, 0x9F3D,
    0x777D, 0x9F3E,
    0x777E, 0x9F44,
    0x466B, 0x9F50,
    0x6C34, 0x9F51,
    0x335D, 0x9F7F,
    0x7633, 0x9F80,
    0x7634, 0x9F83,
    0x4164, 0x9F84,
    0x7635, 0x9F85,
    0x7636, 0x9F86,
    0x7637, 0x9F87,
    0x7638, 0x9F88,
    0x7639, 0x9F89,
    0x763A, 0x9F8A,
    0x4823, 0x9F8B,
    0x763B, 0x9F8C,
    0x417A, 0x9F99,
    0x3928, 0x9F9A,
    0x6D68, 0x9F9B,
    0x396A, 0x9F9F,
    0x595F, 0x9FA0,
    0x2321, 0xFF01,
    0x2322, 0xFF02,
    0x2323, 0xFF03,
    0x2167, 0xFF04,
    0x2325, 0xFF05,
    0x2326, 0xFF06,
    0x2327, 0xFF07,
    0x2328, 0xFF08,
    0x2329, 0xFF09,
    0x232A, 0xFF0A,
    0x232B, 0xFF0B,
    0x232C, 0xFF0C,
    0x232D, 0xFF0D,
    0x232E, 0xFF0E,
    0x232F, 0xFF0F,
    0x2330, 0xFF10,
    0x2331, 0xFF11,
    0x2332, 0xFF12,
    0x2333, 0xFF13,
    0x2334, 0xFF14,
    0x2335, 0xFF15,
    0x2336, 0xFF16,
    0x2337, 0xFF17,
    0x2338, 0xFF18,
    0x2339, 0xFF19,
    0x233A, 0xFF1A,
    0x233B, 0xFF1B,
    0x233C, 0xFF1C,
    0x233D, 0xFF1D,
    0x233E, 0xFF1E,
    0x233F, 0xFF1F,
    0x2340, 0xFF20,
    0x2341, 0xFF21,
    0x2342, 0xFF22,
    0x2343, 0xFF23,
    0x2344, 0xFF24,
    0x2345, 0xFF25,
    0x2346, 0xFF26,
    0x2347, 0xFF27,
    0x2348, 0xFF28,
    0x2349, 0xFF29,
    0x234A, 0xFF2A,
    0x234B, 0xFF2B,
    0x234C, 0xFF2C,
    0x234D, 0xFF2D,
    0x234E, 0xFF2E,
    0x234F, 0xFF2F,
    0x2350, 0xFF30,
    0x2351, 0xFF31,
    0x2352, 0xFF32,
    0x2353, 0xFF33,
    0x2354, 0xFF34,
    0x2355, 0xFF35,
    0x2356, 0xFF36,
    0x2357, 0xFF37,
    0x2358, 0xFF38,
    0x2359, 0xFF39,
    0x235A, 0xFF3A,
    0x235B, 0xFF3B,
    0x235C, 0xFF3C,
    0x235D, 0xFF3D,
    0x235E, 0xFF3E,
    0x235F, 0xFF3F,
    0x2360, 0xFF40,
    0x2361, 0xFF41,
    0x2362, 0xFF42,
    0x2363, 0xFF43,
    0x2364, 0xFF44,
    0x2365, 0xFF45,
    0x2366, 0xFF46,
    0x2367, 0xFF47,
    0x2368, 0xFF48,
    0x2369, 0xFF49,
    0x236A, 0xFF4A,
    0x236B, 0xFF4B,
    0x236C, 0xFF4C,
    0x236D, 0xFF4D,
    0x236E, 0xFF4E,
    0x236F, 0xFF4F,
    0x2370, 0xFF50,
    0x2371, 0xFF51,
    0x2372, 0xFF52,
    0x2373, 0xFF53,
    0x2374, 0xFF54,
    0x2375, 0xFF55,
    0x2376, 0xFF56,
    0x2377, 0xFF57,
    0x2378, 0xFF58,
    0x2379, 0xFF59,
    0x237A, 0xFF5A,
    0x237B, 0xFF5B,
    0x237C, 0xFF5C,
    0x237D, 0xFF5D,
    0x212B, 0xFF5E,
    0x2169, 0xFFE0,
    0x216A, 0xFFE1,
    0x237E, 0xFFE3,
    0x2324, 0xFFE5,
};

static const unsigned int test_gb2312_tab_ind[] = {
0,
298,
298,
694,
1168,
1708,
4686,
7508,
9962,
12638,
14694,
14694,
14694,
14694,
14694,
14694,
};
Added jni/zint/backend/tests/test_gridmtx.c.


































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

//#define TEST_INPUT_GENERATE_EXPECTED 1
//#define TEST_ENCODE_GENERATE_EXPECTED 1

static void test_options(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int option_1;
        int option_2;
        int ret_encode;
        int ret_vector;
        int expected_size;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "12345", 0, 0, 0, 0, 18 },
        /*  1*/ { "12345", 0, 1, 0, 0, 18 },
        /*  2*/ { "12345", 0, 2, 0, 0, 30 },
        /*  3*/ { "12345", 0, 14, 0, 0, 18 }, // Version > max version 13 so ignored
        /*  4*/ { "12345", 0, 13, 0, 0, 162 },
        /*  5*/ { "1234567890123456789", 0, 1, ZINT_ERROR_TOO_LONG, -1, -1 },
        /*  6*/ { "1234567890123456789", 0, 2, 0, 0, 30 },
        /*  7*/ { "123456789012345678", 0, 0, 0, 0, 30 }, // Version auto-set to 2
        /*  8*/ { "123456789012345678", 0, 1, 0, 0, 18 },
        /*  9*/ { "123456789012345678", 5, 1, 0, 0, 18 }, // Version specified so overrides ECC level which gets reduced to 4
        /* 10*/ { "123456789012345678", 5, 0, 0, 0, 30 }, // Version not specified so increased to allow for ECC level
        /* 11*/ { "123456789012345678", 6, 0, 0, 0, 30 }, // ECC > max ECC 5 so ignored and auto-settings version 2, ECC 4 used
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_GRIDMATRIX;
        symbol->option_1 = data[i].option_1;
        symbol->option_2 = data[i].option_2;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt);

        if (data[i].ret_vector != -1) {
            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
            assert_equal(symbol->width, data[i].expected_size, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_size);
            assert_equal(symbol->rows, data[i].expected_size, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_size);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_input(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        int eci;
        unsigned char* data;
        int ret;
        int expected_eci;
        char* expected;
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, in GB 2312 0xA8A6, UTF-8 C3A9
    // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in GB 2312 0xA6C2, UTF-8 CEB2
    // ÿ U+00FF in ISO 8859-1 0xFF, not in GB 2312, outside first byte and second byte range, UTF-8 C3BF
    // ㈩ U+3229 in GB 2312 0x226E
    // 一 U+4E00 in GB 2312 0x523B
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, 0, "é", 0, 0, "30 01 69 00", "B1 (ISO 8859-1)" },
        /*  1*/ { UNICODE_MODE, 3, "é", 0, 3, "60 01 58 00 74 40", "ECI-3 B1 (ISO 8859-1)" },
        /*  2*/ { UNICODE_MODE, 29, "é", 0, 29, "60 0E 44 2A 37 7C 00", "ECI-29 H1 (GB 2312)" },
        /*  3*/ { UNICODE_MODE, 26, "é", 0, 26, "60 0D 05 28 4F 7C 00", "ECI-26 H1 (UTF-8)" },
        /*  4*/ { DATA_MODE, 0, "é", 0, 0, "0A 51 1F 78 00", "H1 (UTF-8)" },
        /*  5*/ { DATA_MODE, 0, "\351", 0, 0, "30 01 69 00", "B1 (ISO 8859-1) (0xE9)" },
        /*  6*/ { UNICODE_MODE, 0, "β", 0, 0, "08 40 2F 78 00", "H1 (GB 2312)" },
        /*  7*/ { UNICODE_MODE, 9, "β", 0, 9, "60 04 58 00 71 00", "ECI-9 B1 (ISO 8859-7)" },
        /*  8*/ { UNICODE_MODE, 29, "β", 0, 29, "60 0E 44 20 17 7C 00", "ECI-29 H1 (GB 2312)" },
        /*  9*/ { UNICODE_MODE, 26, "β", 0, 26, "60 0D 05 6B 17 7C 00", "ECI-26 H1 (UTF-8)" },
        /* 10*/ { DATA_MODE, 0, "β", 0, 0, "0B 56 2F 78 00", "H1 (UTF-8)" },
        /* 11*/ { UNICODE_MODE, 0, "ÿ", 0, 0, "30 01 7F 00", "B1 (ISO 8859-1)" },
        /* 12*/ { UNICODE_MODE, 0, "ÿÿÿ", 0, 0, "30 05 7F 7F 7F 60", "B3 (ISO 8859-1)" },
        /* 13*/ { UNICODE_MODE, 0, "㈩一", 0, 0, "08 15 68 0E 7F 70 00", "H2 (GB 2312)" },
        /* 14*/ { UNICODE_MODE, 29, "㈩一", 0, 29, "60 0E 44 0A 74 07 3F 78 00", "ECI-29 H2 (GB 2312)" },
        /* 15*/ { DATA_MODE, 0, "\177\177", 0, 0, "30 02 7F 3F 40", "B2 (ASCII)" },
        /* 16*/ { DATA_MODE, 0, "\177\177\177", 0, 0, "30 04 7F 3F 5F 60", "B3 (ASCII)" },
        /* 17*/ { UNICODE_MODE, 0, "123", 0, 0, "10 1E 7F 68", "N3 (ASCII)" },
        /* 18*/ { UNICODE_MODE, 0, " 123", 0, 0, "11 7A 03 6F 7D 00", "N4 (ASCII)" },
        /* 19*/ { UNICODE_MODE, 0, "1+23", 0, 0, "11 7B 03 6F 7D 00", "N4 (ASCII)" },
        /* 20*/ { UNICODE_MODE, 0, "12.3", 0, 0, "11 7C 63 6F 7D 00", "N4 (ASCII)" },
        /* 21*/ { UNICODE_MODE, 0, "123,", 0, 0, "10 1E 7F 73 76 5E 60", "N3 L1 (ASCII)" },
        /* 22*/ { UNICODE_MODE, 0, "123,4", 0, 0, "14 1E 7F 51 48 3F 50", "N5 (ASCII)" },
        /* 23*/ { UNICODE_MODE, 0, "\015\012123", 0, 0, "11 7D 63 6F 7D 00", "N4 (ASCII) (EOL)" },
        /* 24*/ { UNICODE_MODE, 0, "1\015\01223", 0, 0, "11 7E 03 6F 7D 00", "N4 (ASCII) (EOL)" },
        /* 25*/ { UNICODE_MODE, 0, "12\015\0123", 0, 0, "11 7E 23 6F 7D 00", "N4 (ASCII) (EOL)" },
        /* 26*/ { UNICODE_MODE, 0, "123\015\012", 0, 0, "10 1E 7F 7C 01 06 42 40", "N3 B2 (ASCII) (EOL)" },
        /* 27*/ { UNICODE_MODE, 0, "123\015\0124", 0, 0, "14 1E 7F 5D 48 3F 50", "N5 (ASCII) (EOL)" },
        /* 28*/ { UNICODE_MODE, 0, "2.2.0", 0, 0, "15 7C 46 73 78 40 07 7A", "N5 (ASCII)" },
        /* 29*/ { UNICODE_MODE, 0, "2.2.0.5", 0, 0, "30 0C 32 17 0C 45 63 01 38 6A 00", "B7 (ASCII)" },
        /* 30*/ { UNICODE_MODE, 0, "2.2.0.56", 0, 0, "13 7C 46 73 78 40 07 71 46 0F 74", "N8 (ASCII)" },
        /* 31*/ { UNICODE_MODE, 0, "1 1234ABCD12.2abcd-12", 0, 0, "13 7A 23 41 2A 3F 68 01 08 3E 4F 66 1E 5F 70 00 44 1F 2F 6E 0F 0F 74", "N6 U4 N4 L4 N3 (ASCII)" },
        /* 32*/ { UNICODE_MODE, 0, "1 123ABCDE12.2abcd-12", 0, 0, "28 1F 40 42 06 28 59 43 27 01 05 7D 56 42 49 16 34 7F 6D 30 08 2F 60", "M21 (ASCII)" },
        /* 33*/ { UNICODE_MODE, 0, "国外通信教æ Matlab6.5", 0, 0, "09 63 27 20 4E 24 1F 05 21 58 22 13 7E 1E 4C 78 09 56 00 3D 3F 4A 45 3F 50", "H6 U2 L5 N3 (GB 2312) (Same as D.2 example)" },
        /* 34*/ { UNICODE_MODE, 0, "AAT", 0, 0, "20 00 4F 30", "U3 (ASCII)" },
        /* 35*/ { UNICODE_MODE, 0, "aat", 0, 0, "18 00 4F 30", "L3 (ASCII)" },
        /* 36*/ { UNICODE_MODE, 0, "AAT2556", 0, 0, "20 00 4F 58 7F 65 47 7A", "U3 N4 (ASCII) (note same bit count as M7)" },
        /* 37*/ { UNICODE_MODE, 0, "AAT2556 ", 0, 0, "29 22 4E 42 0A 14 37 6F 60", "M8 (ASCII)" },
        /* 38*/ { UNICODE_MODE, 0, "AAT2556 电", 0, 0, "29 22 4E 42 0A 14 37 6F 62 2C 1F 7E 00", "M8 H1 (GB 2312)" },
        /* 39*/ { UNICODE_MODE, 0, " 200", 0, 0, "11 7A 06 23 7D 00", "N4 (ASCII)" },
        /* 40*/ { UNICODE_MODE, 0, " 200mA至", 0, 0, "2F 60 40 00 60 2B 78 63 41 7F 40", "M6 H1 (GB 2312)" },
        /* 41*/ { UNICODE_MODE, 0, "2A tel:86 019 82512738", 0, 0, "28 22 5F 4F 29 48 5F 6D 7E 6F 55 57 1F 28 63 0F 5A 11 64 0F 74", "M2 L5(with control) N15 (ASCII)" },
        /* 42*/ { UNICODE_MODE, 0, "至2A tel:86 019 82512738", 0, 0, "30 07 56 60 4C 48 13 6A 32 17 7B 3F 5B 75 35 67 6A 18 63 76 44 39 03 7D 00", "B4 L5(with control) N15 (GB 2312)" },
        /* 43*/ { UNICODE_MODE, 0, "AAT2556 电池充电器+é™åŽ‹è½¬æ¢å™¨ 200mA至2A tel:86 019 82512738", 0, 0, "(62) 29 22 22 1C 4E 41 42 7E 0A 40 14 00 37 7E 6F 00 62 7E 2C 00 1C 7E 4B 00 41 7E 18 00", "M8 H11 M6 B4 L5(with control) N15 (GB 2312) (*NOT SAME* as D3 example, M8 H11 M6 H1 M3 L4(with control) N15, which uses a few more bits)" },
        /* 44*/ { UNICODE_MODE, 0, "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::", 0, 0, "(588) 37 68 68 68 68 68 74 7E 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B512 (ASCII)" },
        /* 45*/ { UNICODE_MODE, 0, "::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\177", 0, 0, "(591) 37 68 68 68 68 68 74 7E 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B513 (ASCII)" },
        /* 46*/ { UNICODE_MODE, 0, ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::至", 0, 0, "(591) 37 68 68 68 68 68 74 7C 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B511 H1 (GB 2312)" },
        /* 47*/ { UNICODE_MODE, 0, ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::至:", 0, 0, "(592) 37 68 68 68 68 68 74 7E 74 74 74 74 74 3A 3A 3A 3A 3A 3A 3A 1D 1D 1D 1D 1D 1D 1D 0E", "B513 (GB 2312)" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_GRIDMATRIX;
        symbol->input_mode = data[i].input_mode;
        symbol->eci = data[i].eci;
        symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        #ifdef TEST_INPUT_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, %d, \"%s\", %s, %d, \"%s\", \"%s\" },\n",
                i, testUtilInputModeName(data[i].input_mode), data[i].eci, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret),
                ret < 5 ? symbol->eci : -1, symbol->errtxt, data[i].comment);
        #else
        if (ret < 5) {

            assert_equal(symbol->eci, data[i].expected_eci, "i:%d eci %d != %d\n", i, symbol->eci, data[i].expected_eci);
            assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_encode(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int input_mode;
        int option_1;
        int option_2;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        char* expected;
    };
    struct item data[] = {
        /*  0*/ { "1234", UNICODE_MODE, -1, -1, 0, 18, 18, "",
                    "111111000000111111"
                    "101111001100101001"
                    "100101000010100001"
                    "111011011100101111"
                    "101011011000111011"
                    "111111000000111111"
                    "000000111111000000"
                    "001100100001001110"
                    "001110111111011110"
                    "001010100011000000"
                    "010100101001000000"
                    "000000111111000000"
                    "111111000000111111"
                    "101001001100101001"
                    "111001000000101111"
                    "111001000100110001"
                    "111111000000100001"
                    "111111000000111111"
               },
        /*  1*/ { "Grid Matrix", UNICODE_MODE, 5, -1, 0, 30, 30, "",
                    "111111000000111111000000111111"
                    "110111010110110111010110110011"
                    "100011011110111111011110111111"
                    "110001000000100001000000100001"
                    "101101000000100001000000100001"
                    "111111000000111111000000111111"
                    "000000111111000000111111000000"
                    "010000101111001000101101010000"
                    "000100111111000000110011010110"
                    "001110100001011000111111001000"
                    "001010100001001010111011000010"
                    "000000111111000000111111000000"
                    "111111000000111111000000111111"
                    "110001001110100101001000110001"
                    "111111011110111111000010111111"
                    "110111000000100101000010100101"
                    "100111000000100011011100100011"
                    "111111000000111111000000111111"
                    "000000111111000000111111000000"
                    "010100101111001110101101010110"
                    "011100111111000000110001001100"
                    "001010100001000110110111011110"
                    "000010100001011100110001000000"
                    "000000111111000000111111000000"
                    "111111000000111111000000111111"
                    "110101010000110101010010110101"
                    "110111000000110011001010101111"
                    "111101010010110101010010111011"
                    "101111010010100001010010110111"
                    "111111000000111111000000111111"
               },
        /*  2*/ { "AAT2556 电池充电器+é™åŽ‹è½¬æ¢å™¨ 200mA至2A tel:86 019 82512738", UNICODE_MODE, 3, 3, 0, 42, 42, "",
                    "111111000000111111000000111111000000111111"
                    "101101001100101111001010101011001100101101"
                    "110001011010110101010000100011000000100001"
                    "110001001110111111010000101111010010101111"
                    "101101010100100111011000110111011000111101"
                    "111111000000111111000000111111000000111111"
                    "000000111111000000111111000000111111000000"
                    "001010100111000000100011000110100101001110"
                    "011010101101001100101011000110110001011110"
                    "000010111011001110100101001110110101000000"
                    "000110111111011010100011011100100001000000"
                    "000000111111000000111111000000111111000000"
                    "111111000000111111000000111111000000111111"
                    "101101000110111111011100111001000010101111"
                    "110111011100111011000010110101010100111111"
                    "100011010000111101001000100001011110100001"
                    "100111010110110111011100110101000110100001"
                    "111111000000111111000000111111000000111111"
                    "000000111111000000111111000000111111000000"
                    "001010100001011110110011011110100111001110"
                    "010010111001000000100011001110111111011110"
                    "010100111111011000100101010110111111000000"
                    "001010101011000100110011001110111011000000"
                    "000000111111000000111111000000111111000000"
                    "111111000000111111000000111111000000111111"
                    "101001000000111001011100111011000010101101"
                    "111011001000111001001010101101011110111101"
                    "110011010100101001010010101101001110100001"
                    "100001001000100011011000100101000100100001"
                    "111111000000111111000000111111000000111111"
                    "000000111111000000111111000000111111000000"
                    "001110100011000110100101000000100001001110"
                    "010000100111001010111101000010100001010100"
                    "010100100111010000101011000000100001000100"
                    "001110100001000110111111001100101001000100"
                    "000000111111000000111111000000111111000000"
                    "111111000000111111000000111111000000111111"
                    "101011001110101001001100101011001010101111"
                    "100011011010100001011100101001010000110101"
                    "111101000110110001000100100111010110110011"
                    "100001001000110011011110110001000100100101"
                    "111111000000111111000000111111000000111111"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_GRIDMATRIX;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_ENCODE_GENERATE_EXPECTED
        printf("        /*%3d*/ { \"%s\", %s, %d, %d, %s, %d, %d, \"%s\",\n",
                i, data[i].data, testUtilInputModeName(data[i].input_mode), data[i].option_1, data[i].option_2, testUtilErrorName(data[i].ret),
                symbol->rows, symbol->width, data[i].comment);
        testUtilModulesDump(symbol, "                    ", "\n");
        printf("               },\n");
        #else
        if (ret < 5) {
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);

            if (ret == 0) {
                int width, row;
                ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
                assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);
            }
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_options();
    test_input();
    test_encode();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_gs1.c.


















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

//#define TEST_GS1_REDUCE_GENERATE_EXPECTED

/*
 * Check that EAN128 and RSS_EXP based symbologies reduce GS1 data
 */
static void test_gs1_reduce(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        int input_mode;
        unsigned char* data;
        unsigned char* composite;
        int ret;

        char* comment;
        unsigned char* expected;
    };
    struct item data[] = {
        /* 0*/ { BARCODE_EAN128, -1, "12345678901234", "", ZINT_ERROR_INVALID_DATA, "GS1 data required", "" },
        /* 1*/ { BARCODE_EAN128, -1, "[01]12345678901234", "", 0, "Input mode ignored",
                    "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110010001011000111010111101100011101011"
               },
        /* 2*/ { BARCODE_EAN128, GS1_MODE, "[01]12345678901234", "", 0, "Input mode ignored",
                    "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110010001011000111010111101100011101011"
               },
        /* 3*/ { BARCODE_EAN128, UNICODE_MODE, "[01]12345678901234", "", 0, "Input mode ignored",
                    "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110010001011000111010111101100011101011"
               },
        /* 4*/ { BARCODE_EAN128_CC, -1, "[01]12345678901234", "[21]1234", 0, "Input mode ignored",
                    "0000000000000000000001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010000000000000000000000000"
                    "0000000000000000000001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010000000000000000000000000"
                    "0000000000000000000001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010000000000000000000000000"
                    "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110111010011100010100001011010000110011100010100"
                    "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001000101100011101011110100101111001100011101011"
               },
        /* 5*/ { BARCODE_EAN128_CC, GS1_MODE, "[01]12345678901234", "[21]1234", 0, "Input mode ignored",
                    "0000000000000000000001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010000000000000000000000000"
                    "0000000000000000000001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010000000000000000000000000"
                    "0000000000000000000001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010000000000000000000000000"
                    "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110111010011100010100001011010000110011100010100"
                    "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001000101100011101011110100101111001100011101011"
               },
        /* 6*/ { BARCODE_EAN128_CC, UNICODE_MODE, "[01]12345678901234", "[21]1234", 0, "Input mode ignored",
                    "0000000000000000000001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010000000000000000000000000"
                    "0000000000000000000001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010000000000000000000000000"
                    "0000000000000000000001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010000000000000000000000000"
                    "0010110001100001010001001100100110100110001101110100111000111010010011110101100100001001010011000110111010011100010100001011010000110011100010100"
                    "1101001110011110101110110011011001011001110010001011000111000101101100001010011011110110101100111001000101100011101011110100101111001100011101011"
               },
        /* 7*/ { BARCODE_EAN14, -1, "1234567890123", "", 0, "Input mode ignored",
                    "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110100001100101100011101011"
               },
        /* 8*/ { BARCODE_EAN14, GS1_MODE, "1234567890123", "", 0, "Input mode ignored",
                    "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110100001100101100011101011"
               },
        /* 9*/ { BARCODE_EAN14, UNICODE_MODE, "1234567890123", "", 0, "Input mode ignored",
                    "11010011100111101011101100110110010110011100100010110001110001011011000010100110111101101011001110011011000110100001100101100011101011"
               },
        /*10*/ { BARCODE_NVE18, -1, "12345678901234567", "", 0, "Input mode ignored",
                    "110100111001111010111011011001100101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010010101101110001100011101011"
               },
        /*11*/ { BARCODE_NVE18, GS1_MODE, "12345678901234567", "", 0, "Input mode ignored",
                    "110100111001111010111011011001100101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010010101101110001100011101011"
               },
        /*12*/ { BARCODE_NVE18, UNICODE_MODE, "12345678901234567", "", 0, "Input mode ignored",
                    "110100111001111010111011011001100101100111001000101100011100010110110000101001101111011010110011100100010110001110001011011000010010101101110001100011101011"
               },
        /*13*/ { BARCODE_RSS_EXP, -1, "2012", "", ZINT_ERROR_INVALID_DATA, "GS1 data required", "" },
        /*14*/ { BARCODE_RSS_EXP, -1, "[20]12", "", 0, "Input mode ignored",
                    "010010000010000101101111111100001010000010000110010101111100101110001011110000000010101111100001011101"
               },
        /*15*/ { BARCODE_RSS_EXP, GS1_MODE, "[20]12", "", 0, "Input mode ignored",
                    "010010000010000101101111111100001010000010000110010101111100101110001011110000000010101111100001011101"
               },
        /*16*/ { BARCODE_RSS_EXP, UNICODE_MODE, "[20]12", "", 0, "Input mode ignored",
                    "010010000010000101101111111100001010000010000110010101111100101110001011110000000010101111100001011101"
               },
        /*17*/ { BARCODE_RSS_EXP_CC, -1, "[20]12", "[21]1234", 0, "Input mode ignored",
                    "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010"
                    "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010"
                    "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010"
                    "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000"
                    "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101"
               },
        /*18*/ { BARCODE_RSS_EXP_CC, GS1_MODE, "[20]12", "[21]1234", 0, "Input mode ignored",
                    "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010"
                    "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010"
                    "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010"
                    "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000"
                    "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101"
               },
        /*19*/ { BARCODE_RSS_EXP_CC, UNICODE_MODE, "[20]12", "[21]1234", 0, "Input mode ignored",
                    "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010"
                    "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010"
                    "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010"
                    "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000"
                    "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101"
               },
        /*20*/ { BARCODE_RSS_EXPSTACK, -1, "12", "", ZINT_ERROR_INVALID_DATA, "GS1 data required", "" },
        /*21*/ { BARCODE_RSS_EXPSTACK, -1, "[20]12", "", 0, "Input mode ignored",
                    "010010000010000101101111111100001010000010000110010101111100101110001011110000000010101111100001011101"
               },
        /*22*/ { BARCODE_RSS_EXPSTACK, GS1_MODE, "[20]12", "", 0, "Input mode ignored",
                    "010010000010000101101111111100001010000010000110010101111100101110001011110000000010101111100001011101"
               },
        /*23*/ { BARCODE_RSS_EXPSTACK, UNICODE_MODE, "[20]12", "", 0, "Input mode ignored",
                    "010010000010000101101111111100001010000010000110010101111100101110001011110000000010101111100001011101"
               },
        /*24*/ { BARCODE_RSS_EXPSTACK_CC, -1, "12", "[21]1234", ZINT_ERROR_INVALID_DATA, "GS1 data required", "" },
        /*25*/ { BARCODE_RSS_EXPSTACK_CC, -1, "[20]12", "[21]1234", 0, "Input mode ignored",
                    "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010"
                    "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010"
                    "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010"
                    "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000"
                    "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101"
               },
        /*26*/ { BARCODE_RSS_EXPSTACK_CC, GS1_MODE, "[20]12", "[21]1234", 0, "Input mode ignored",
                    "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010"
                    "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010"
                    "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010"
                    "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000"
                    "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101"
               },
        /*27*/ { BARCODE_RSS_EXPSTACK_CC, UNICODE_MODE, "[20]12", "[21]1234", 0, "Input mode ignored",
                    "001101101110110100001000001101001100111011000010011101001100001010001100010010011011000000110110001010"
                    "001101101100111110100010011001101011100100000010011001001001111001011110011101011001000000110010001010"
                    "001101101000101111100110000101001111010000001010011001101011101110011110010011110110000110111010001010"
                    "000001111111010110010000000010100100111001100001011010000011010001100100001010101001010000011110100000"
                    "010010000000101001101111111100001011000110011110100101111100101110001011110000000010101111100001011101"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char* text;

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        if (data[i].input_mode != -1) {
            symbol->input_mode = data[i].input_mode;
        }

        if (strlen(data[i].composite)) {
            text = data[i].composite;
            strcpy(symbol->primary, data[i].data);
        } else {
            text = data[i].data;
        }
        int length = strlen(text);

        ret = ZBarcode_Encode(symbol, text, length);

        #ifdef TEST_GS1_REDUCE_GENERATE_EXPECTED
        if (data[i].ret == 0) {
            printf("        /*%2d*/ { %s, %s, \"%s\", \"%s\", %d, \"%s\",\n",
                    i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].data, data[i].composite, data[i].ret, data[i].comment);
            testUtilModulesDump(symbol, "                    ", "\n");
            printf("               },\n");
        } else {
            printf("        /*%2d*/ { %s, %s, \"%s\", \"%s\", %s, \"%s\", \"\" },\n",
                    i, testUtilBarcodeName(data[i].symbology), testUtilInputModeName(data[i].input_mode), data[i].data, data[i].composite, testUtilErrorName(data[i].ret), data[i].comment);
        }
        #else
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        if (ret == 0) {
            int width, row;
            ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
            assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_hrt(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        unsigned char* composite;

        unsigned char* expected;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { BARCODE_EAN128, "[01]12345678901234[20]12", "", "(01)12345678901234(20)12" },
        /* 1*/ { BARCODE_EAN128_CC, "[01]12345678901234[20]12", "[21]12345", "(01)12345678901234(20)12" },
        /* 2*/ { BARCODE_RSS_EXP, "[01]12345678901234[20]12", "", "(01)12345678901234(20)12" },
        /* 3*/ { BARCODE_RSS_EXP_CC, "[01]12345678901234", "[21]12345", "(01)12345678901234" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char* text;

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;

        if (strlen(data[i].composite)) {
            text = data[i].composite;
            strcpy(symbol->primary, data[i].data);
        } else {
            text = data[i].data;
        }
        int length = strlen(text);

        ret = ZBarcode_Encode(symbol, text, length);
        assert_zero(ret, "i:%d ZBarcode_Encode ret %d != 0 %s\n", i, ret, symbol->errtxt);

        assert_zero(strcmp(symbol->text, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->text, data[i].expected);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

extern int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]);

static void test_gs1_verify(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int ret;
        char* expected;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "", ZINT_ERROR_INVALID_DATA, "" },
        /*  1*/ { "[", ZINT_ERROR_INVALID_DATA, "" },
        /*  2*/ { "[]12", ZINT_ERROR_INVALID_DATA, "" },
        /*  3*/ { "[12345]12", ZINT_ERROR_INVALID_DATA, "" },
        /*  4*/ { "[9999]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*  5*/ { "[[01]]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*  6*/ { "[20]1\n", ZINT_ERROR_INVALID_DATA, "" },
        /*  7*/ { "[20]1\x80", ZINT_ERROR_INVALID_DATA, "" },
        /*  8*/ { "[00]123456789012345678", 0, "00123456789012345678" },
        /*  9*/ { "[00]12345678901234567", ZINT_ERROR_INVALID_DATA, "" },
        /* 10*/ { "[01]12345678901234", 0, "0112345678901234" },
        /* 11*/ { "[01]123456789012345", ZINT_ERROR_INVALID_DATA, "" },
        /* 12*/ { "[02]12345678901234", 0, "0212345678901234" },
        /* 13*/ { "[02]1234567890123", ZINT_ERROR_INVALID_DATA, "" },
        /* 14*/ { "[03]12345678901234", ZINT_ERROR_INVALID_DATA, "" },
        /* 15*/ { "[04]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 16*/ { "[05]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 17*/ { "[06]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 18*/ { "[07]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 19*/ { "[08]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 20*/ { "[09]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 21*/ { "[10]ABCD123456", 0, "10ABCD123456" },
        /* 22*/ { "[10]123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /* 23*/ { "[100]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 24*/ { "[11]990102", 0, "11990102" },
        /* 25*/ { "[11]9901023", ZINT_ERROR_INVALID_DATA, "" },
        /* 26*/ { "[12]000100", 0, "12000100" },
        /* 27*/ { "[12]00010", ZINT_ERROR_INVALID_DATA, "" },
        /* 28*/ { "[13]991301", 0, "13991301" },
        /* 29*/ { "[13]9913011", ZINT_ERROR_INVALID_DATA, "" },
        /* 30*/ { "[14]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 31*/ { "[15]021231", 0, "15021231" },
        /* 32*/ { "[15]02123", ZINT_ERROR_INVALID_DATA, "" },
        /* 33*/ { "[16]000000", 0, "16000000" },
        /* 34*/ { "[16]00000", ZINT_ERROR_INVALID_DATA, "" },
        /* 35*/ { "[17]010200", 0, "17010200" },
        /* 36*/ { "[17]0102000", ZINT_ERROR_INVALID_DATA, "" },
        /* 37*/ { "[18]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 38*/ { "[19]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 39*/ { "[20]12", 0, "2012" },
        /* 40*/ { "[20]1", ZINT_ERROR_INVALID_DATA, "" },
        /* 41*/ { "[200]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 42*/ { "[21]A12345678", 0, "21A12345678" },
        /* 43*/ { "[21]123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /* 44*/ { "[22]abcdefghijklmnopqrst", 0, "22abcdefghijklmnopqrst" },
        /* 45*/ { "[22]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /* 46*/ { "[23]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 47*/ { "[235]1abcdefghijklmnopqrstuvwxyz0", 0, "2351abcdefghijklmnopqrstuvwxyz0" },
        /* 48*/ { "[235]1abcdefghijklmnopqrstuvwxyz01", ZINT_ERROR_INVALID_DATA, "" },
        /* 49*/ { "[24]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 50*/ { "[240]abcdefghijklmnopqrstuvwxyz1234", 0, "240abcdefghijklmnopqrstuvwxyz1234" },
        /* 51*/ { "[240]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" },
        /* 52*/ { "[241]abcdefghijklmnopqrstuvwxyz1234", 0, "241abcdefghijklmnopqrstuvwxyz1234" },
        /* 53*/ { "[241]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" },
        /* 54*/ { "[242]12345", 0, "24212345" },
        /* 55*/ { "[242]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /* 56*/ { "[243]abcdefghijklmnopqrst", 0, "243abcdefghijklmnopqrst" },
        /* 57*/ { "[243]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /* 58*/ { "[244]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 59*/ { "[249]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 60*/ { "[25]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 61*/ { "[250]abcdefghijklmnopqrstuvwxyz1234", 0, "250abcdefghijklmnopqrstuvwxyz1234" },
        /* 62*/ { "[250]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" },
        /* 63*/ { "[251]abcdefghijklmnopqrstuvwxyz1234", 0, "251abcdefghijklmnopqrstuvwxyz1234" },
        /* 64*/ { "[251]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" },
        /* 65*/ { "[252]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 66*/ { "[253]131313131313412345678901234567", 0, "253131313131313412345678901234567" },
        /* 67*/ { "[253]13131313131341234567890123345678", ZINT_ERROR_INVALID_DATA, "" },
        /* 68*/ { "[254]abcdefghijklmnopqrst", 0, "254abcdefghijklmnopqrst" },
        /* 69*/ { "[254]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /* 70*/ { "[255]1313131313134123456789012", 0, "2551313131313134123456789012" },
        /* 71*/ { "[255]13131313131341234567890123", ZINT_ERROR_INVALID_DATA, "" },
        /* 72*/ { "[256]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 73*/ { "[259]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 74*/ { "[26]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 75*/ { "[27]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 76*/ { "[28]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 77*/ { "[29]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 78*/ { "[30]12345678", 0, "3012345678" },
        /* 79*/ { "[30]123456789", ZINT_ERROR_INVALID_DATA, "" },
        /* 80*/ { "[3000]1234", ZINT_ERROR_INVALID_DATA, "" },
        /* 81*/ { "[31]123456", ZINT_ERROR_INVALID_DATA, "" },
        /* 82*/ { "[3100]123456", 0, "3100123456" },
        /* 83*/ { "[3100]12345", ZINT_ERROR_INVALID_DATA, "" },
        /* 84*/ { "[3101]123456", 0, "3101123456" },
        /* 85*/ { "[3101]12345", ZINT_ERROR_INVALID_DATA, "" },
        /* 86*/ { "[3109]123456", 0, "3109123456" },
        /* 87*/ { "[3110]123456", 0, "3110123456" },
        /* 88*/ { "[3110]12345", ZINT_ERROR_INVALID_DATA, "" },
        /* 89*/ { "[3119]123456", 0, "3119123456" },
        /* 90*/ { "[3120]123456", 0, "3120123456" },
        /* 91*/ { "[3120]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /* 92*/ { "[3129]123456", 0, "3129123456" },
        /* 93*/ { "[3130]123456", 0, "3130123456" },
        /* 94*/ { "[3130]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /* 95*/ { "[3139]123456", 0, "3139123456" },
        /* 96*/ { "[3140]123456", 0, "3140123456" },
        /* 97*/ { "[3140]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /* 98*/ { "[3149]123456", 0, "3149123456" },
        /* 99*/ { "[3150]123456", 0, "3150123456" },
        /*100*/ { "[3150]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*101*/ { "[3159]123456", 0, "3159123456" },
        /*102*/ { "[3160]123456", 0, "3160123456" },
        /*103*/ { "[3160]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*104*/ { "[3169]123456", 0, "3169123456" },
        /*105*/ { "[3170]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*106*/ { "[3180]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*107*/ { "[3190]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*108*/ { "[32]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*109*/ { "[3200]123456", 0, "3200123456" },
        /*110*/ { "[3200]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*111*/ { "[3210]123456", 0, "3210123456" },
        /*112*/ { "[3210]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*113*/ { "[3220]123456", 0, "3220123456" },
        /*114*/ { "[3220]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*115*/ { "[3230]123456", 0, "3230123456" },
        /*116*/ { "[3240]123456", 0, "3240123456" },
        /*117*/ { "[3250]123456", 0, "3250123456" },
        /*118*/ { "[3260]123456", 0, "3260123456" },
        /*119*/ { "[3270]123456", 0, "3270123456" },
        /*120*/ { "[3280]123456", 0, "3280123456" },
        /*121*/ { "[3290]123456", 0, "3290123456" },
        /*122*/ { "[3290]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*123*/ { "[3299]123456", 0, "3299123456" },
        /*124*/ { "[33]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*125*/ { "[3300]123456", 0, "3300123456" },
        /*126*/ { "[3300]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*127*/ { "[3310]123456", 0, "3310123456" },
        /*128*/ { "[3310]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*129*/ { "[3320]123456", 0, "3320123456" },
        /*130*/ { "[3330]123456", 0, "3330123456" },
        /*131*/ { "[3340]123456", 0, "3340123456" },
        /*132*/ { "[3350]123456", 0, "3350123456" },
        /*133*/ { "[3360]123456", 0, "3360123456" },
        /*134*/ { "[3370]123456", 0, "3370123456" },
        /*135*/ { "[3370]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*136*/ { "[3379]123456", 0, "3379123456" },
        /*137*/ { "[3380]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*138*/ { "[3390]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*139*/ { "[34]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*140*/ { "[3400]123456", 0, "3400123456" },
        /*141*/ { "[3400]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*142*/ { "[3410]123456", 0, "3410123456" },
        /*143*/ { "[3410]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*144*/ { "[3420]123456", 0, "3420123456" },
        /*145*/ { "[3430]123456", 0, "3430123456" },
        /*146*/ { "[3440]123456", 0, "3440123456" },
        /*147*/ { "[3450]123456", 0, "3450123456" },
        /*148*/ { "[3460]123456", 0, "3460123456" },
        /*149*/ { "[3470]123456", 0, "3470123456" },
        /*150*/ { "[3480]123456", 0, "3480123456" },
        /*151*/ { "[3490]123456", 0, "3490123456" },
        /*152*/ { "[3490]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*153*/ { "[3499]123456", 0, "3499123456" },
        /*154*/ { "[35]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*155*/ { "[3500]123456", 0, "3500123456" },
        /*156*/ { "[3500]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*157*/ { "[3510]123456", 0, "3510123456", },
        /*158*/ { "[3510]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*159*/ { "[3520]123456", 0, "3520123456", },
        /*160*/ { "[3530]123456", 0, "3530123456", },
        /*161*/ { "[3540]123456", 0, "3540123456", },
        /*162*/ { "[3550]123456", 0, "3550123456", },
        /*163*/ { "[3560]123456", 0, "3560123456", },
        /*164*/ { "[3570]123456", 0, "3570123456", },
        /*165*/ { "[3579]123456", 0, "3579123456" },
        /*166*/ { "[3580]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*167*/ { "[3590]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*168*/ { "[36]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*169*/ { "[3600]123456", 0, "3600123456" },
        /*170*/ { "[3600]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*171*/ { "[3610]123456", 0, "3610123456" },
        /*172*/ { "[3610]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*173*/ { "[3620]123456", 0, "3620123456", },
        /*174*/ { "[3630]123456", 0, "3630123456", },
        /*175*/ { "[3640]123456", 0, "3640123456", },
        /*176*/ { "[3650]123456", 0, "3650123456", },
        /*177*/ { "[3660]123456", 0, "3660123456", },
        /*178*/ { "[3670]123456", 0, "3670123456", },
        /*179*/ { "[3680]123456", 0, "3680123456", },
        /*180*/ { "[3680]123456", 0, "3680123456", },
        /*181*/ { "[3680]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*182*/ { "[3690]123456", 0, "3690123456" },
        /*183*/ { "[3699]123456", 0, "3699123456" },
        /*184*/ { "[37]12345678", 0, "3712345678" },
        /*185*/ { "[37]123456789", ZINT_ERROR_INVALID_DATA, "" },
        /*186*/ { "[3700]12345678", ZINT_ERROR_INVALID_DATA, "" },
        /*187*/ { "[38]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*188*/ { "[3800]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*189*/ { "[39]123456", ZINT_ERROR_INVALID_DATA, "" },
        /*190*/ { "[3900]123456789012345", 0, "3900123456789012345" },
        /*191*/ { "[3900]1234567890123456", ZINT_ERROR_INVALID_DATA, "" },
        /*192*/ { "[3909]123456789012345", 0, "3909123456789012345" },
        /*193*/ { "[3910]123123456789012345", 0, "3910123123456789012345" },
        /*194*/ { "[3910]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" },
        /*195*/ { "[3910]123", ZINT_ERROR_INVALID_DATA, "" },
        /*196*/ { "[3920]123456789012345", 0, "3920123456789012345" },
        /*197*/ { "[3920]1234567890123456", ZINT_ERROR_INVALID_DATA, "" },
        /*198*/ { "[3930]123123456789012345", 0, "3930123123456789012345" },
        /*199*/ { "[3930]1231234567890123456", ZINT_ERROR_INVALID_DATA, "" },
        /*200*/ { "[3930]123", ZINT_ERROR_INVALID_DATA, "" },
        /*201*/ { "[3940]1234", 0, "39401234" },
        /*202*/ { "[3940]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*203*/ { "[3940]123", ZINT_ERROR_INVALID_DATA, "" },
        /*204*/ { "[3949]1234", 0, "39491234" },
        /*205*/ { "[3950]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*206*/ { "[3960]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*207*/ { "[3970]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*208*/ { "[3980]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*209*/ { "[3999]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*210*/ { "[40]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*211*/ { "[400]123456789012345678901234567890", 0, "400123456789012345678901234567890" },
        /*212*/ { "[400]1234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*213*/ { "[401]1234abcdefghijklmnopqrstuvwxyz", 0, "4011234abcdefghijklmnopqrstuvwxyz" },
        /*214*/ { "[401]1234abcdefghijklmnopqrstuvwxyz1", ZINT_ERROR_INVALID_DATA, "" },
        /*215*/ { "[402]13131313131313132", 0, "40213131313131313132" },
        /*216*/ { "[402]1313131313131313", ZINT_ERROR_INVALID_DATA, "" },
        /*217*/ { "[403]abcdefghijklmnopqrstuvwxyz1234", 0, "403abcdefghijklmnopqrstuvwxyz1234" },
        /*218*/ { "[403]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" },
        /*219*/ { "[404]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*220*/ { "[409]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*221*/ { "[410]3898765432108", 0, "4103898765432108" },
        /*222*/ { "[410]12345678901234", ZINT_ERROR_INVALID_DATA, "" },
        /*223*/ { "[411]1313131313134", 0, "4111313131313134" },
        /*224*/ { "[411]13131313131", ZINT_ERROR_INVALID_DATA, "" },
        /*225*/ { "[412]1313131313134", 0, "4121313131313134" },
        /*226*/ { "[412]13131313131", ZINT_ERROR_INVALID_DATA, "" },
        /*227*/ { "[413]1313131313134", 0, "4131313131313134" },
        /*228*/ { "[413]13131313131", ZINT_ERROR_INVALID_DATA, "" },
        /*229*/ { "[414]1313131313134", 0, "4141313131313134" },
        /*230*/ { "[414]13131313131", ZINT_ERROR_INVALID_DATA, "" },
        /*231*/ { "[415]1313131313134", 0, "4151313131313134" },
        /*232*/ { "[415]13131313131", ZINT_ERROR_INVALID_DATA, "" },
        /*233*/ { "[416]1313131313134", 0, "4161313131313134" },
        /*234*/ { "[416]13131313131", ZINT_ERROR_INVALID_DATA, "" },
        /*235*/ { "[417]1313131313134", 0, "4171313131313134" },
        /*236*/ { "[417]13131313131", ZINT_ERROR_INVALID_DATA, "" },
        /*237*/ { "[418]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*238*/ { "[419]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*239*/ { "[420]abcdefghijklmnopqrst", 0, "420abcdefghijklmnopqrst" },
        /*240*/ { "[420]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*241*/ { "[421]123abcdefghi", 0, "421123abcdefghi" },
        /*242*/ { "[421]123abcdefghij", ZINT_ERROR_INVALID_DATA, "" },
        /*243*/ { "[422]123", 0, "422123" },
        /*244*/ { "[422]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*245*/ { "[422]12", ZINT_ERROR_INVALID_DATA, "" },
        /*246*/ { "[423]123123123123123", 0, "423123123123123123" },
        /*247*/ { "[423]1231231231231231", ZINT_ERROR_INVALID_DATA, "" },
        /*248*/ { "[423]12", ZINT_ERROR_INVALID_DATA, "" },
        /*249*/ { "[424]123", 0, "424123" },
        /*250*/ { "[424]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*251*/ { "[424]12", ZINT_ERROR_INVALID_DATA, "" },
        /*252*/ { "[425]123123123123123", 0, "425123123123123123" },
        /*253*/ { "[425]1231231231231231", ZINT_ERROR_INVALID_DATA, "" },
        /*254*/ { "[425]12", ZINT_ERROR_INVALID_DATA, "" },
        /*255*/ { "[426]123", 0, "426123" },
        /*256*/ { "[426]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*257*/ { "[426]12", ZINT_ERROR_INVALID_DATA, "" },
        /*258*/ { "[427]abc", 0, "427abc" },
        /*259*/ { "[427]abcd", ZINT_ERROR_INVALID_DATA, "" },
        /*260*/ { "[428]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*261*/ { "[429]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*262*/ { "[430]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*263*/ { "[499]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*264*/ { "[50]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*265*/ { "[500]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*266*/ { "[5000]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*267*/ { "[51]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*268*/ { "[59]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*269*/ { "[60]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*270*/ { "[600]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*271*/ { "[6000]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*272*/ { "[61]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*273*/ { "[69]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*274*/ { "[70]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*275*/ { "[700]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*276*/ { "[7000]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*277*/ { "[7001]1234567890123", 0, "70011234567890123" },
        /*278*/ { "[7001]123456789012", ZINT_ERROR_INVALID_DATA, "" },
        /*279*/ { "[7002]abcdefghijklmnopqrstuvwxyz1234", 0, "7002abcdefghijklmnopqrstuvwxyz1234" },
        /*280*/ { "[7002]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" },
        /*281*/ { "[7003]1212121212", 0, "70031212121212" },
        /*282*/ { "[7003]121212121", ZINT_ERROR_INVALID_DATA, "" },
        /*283*/ { "[7004]1234", 0, "70041234" },
        /*284*/ { "[7004]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*285*/ { "[7005]abcdefghijkl", 0, "7005abcdefghijkl" },
        /*286*/ { "[7005]abcdefghijklm", ZINT_ERROR_INVALID_DATA, "" },
        /*287*/ { "[7006]200132", 0, "7006200132" },
        /*288*/ { "[7006]2001320", ZINT_ERROR_INVALID_DATA, "" },
        /*289*/ { "[7007]010101121212", 0, "7007010101121212" },
        /*290*/ { "[7007]01010112121", ZINT_ERROR_INVALID_DATA, "" },
        /*291*/ { "[7007]121212", 0, "7007121212" },
        /*292*/ { "[7007]12121", ZINT_ERROR_INVALID_DATA, "" },
        /*293*/ { "[7007]1212121", ZINT_ERROR_INVALID_DATA, "" },
        /*294*/ { "[7008]abc", 0, "7008abc" },
        /*295*/ { "[7008]abcd", ZINT_ERROR_INVALID_DATA, "" },
        /*296*/ { "[7009]abcdefghij", 0, "7009abcdefghij" },
        /*297*/ { "[7009]abcdefghijk", ZINT_ERROR_INVALID_DATA, "" },
        /*298*/ { "[7010]01", 0, "701001" },
        /*299*/ { "[7010]1", 0, "70101" },
        /*300*/ { "[7010]012", ZINT_ERROR_INVALID_DATA, "" },
        /*301*/ { "[7011]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*302*/ { "[7012]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*303*/ { "[7019]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*304*/ { "[7020]abcdefghijklmnopqrst", 0, "7020abcdefghijklmnopqrst" },
        /*305*/ { "[7020]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*306*/ { "[7021]abcdefghijklmnopqrst", 0, "7021abcdefghijklmnopqrst" },
        /*307*/ { "[7021]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*308*/ { "[7022]abcdefghijklmnopqrst", 0, "7022abcdefghijklmnopqrst" },
        /*309*/ { "[7022]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*310*/ { "[7023]1234abcdefghijklmnopqrstuvwxyz", 0, "70231234abcdefghijklmnopqrstuvwxyz" },
        /*311*/ { "[7023]1234abcdefghijklmnopqrstuvwxyza", ZINT_ERROR_INVALID_DATA, "" },
        /*312*/ { "[7024]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*313*/ { "[7025]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*314*/ { "[7029]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*315*/ { "[7030]123abcdefghijklmnopqrstuvwxyza", 0, "7030123abcdefghijklmnopqrstuvwxyza" },
        /*316*/ { "[7030]123abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" },
        /*317*/ { "[7031]123abcdefghijklmnopqrstuvwxyza", 0, "7031123abcdefghijklmnopqrstuvwxyza" },
        /*318*/ { "[7031]123abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" },
        /*319*/ { "[7032]123abcdefghijklmnopqrstuvwxyza", 0, "7032123abcdefghijklmnopqrstuvwxyza" },
        /*320*/ { "[7033]123abcdefghijklmnopqrstuvwxyza", 0, "7033123abcdefghijklmnopqrstuvwxyza" },
        /*321*/ { "[7034]123abcdefghijklmnopqrstuvwxyza", 0, "7034123abcdefghijklmnopqrstuvwxyza" },
        /*322*/ { "[7035]123abcdefghijklmnopqrstuvwxyza", 0, "7035123abcdefghijklmnopqrstuvwxyza" },
        /*323*/ { "[7036]123abcdefghijklmnopqrstuvwxyza", 0, "7036123abcdefghijklmnopqrstuvwxyza" },
        /*324*/ { "[7037]123abcdefghijklmnopqrstuvwxyza", 0, "7037123abcdefghijklmnopqrstuvwxyza" },
        /*325*/ { "[7038]123abcdefghijklmnopqrstuvwxyza", 0, "7038123abcdefghijklmnopqrstuvwxyza" },
        /*326*/ { "[7039]123abcdefghijklmnopqrstuvwxyza", 0, "7039123abcdefghijklmnopqrstuvwxyza" },
        /*327*/ { "[7039]123abcdefghijklmnopqrstuvwxyzab", ZINT_ERROR_INVALID_DATA, "" },
        /*328*/ { "[7040]1abc", 0, "70401abc" },
        /*329*/ { "[7040]1ab", ZINT_ERROR_INVALID_DATA, "" },
        /*330*/ { "[7040]1abcd", ZINT_ERROR_INVALID_DATA, "" },
        /*331*/ { "[7041]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*332*/ { "[7042]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*333*/ { "[7050]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*334*/ { "[7090]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*335*/ { "[7099]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*336*/ { "[71]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*337*/ { "[710]abcdefghijklmnopqrst", 0, "710abcdefghijklmnopqrst" },
        /*338*/ { "[710]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*339*/ { "[711]abcdefghijklmnopqrst", 0, "711abcdefghijklmnopqrst" },
        /*340*/ { "[711]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*341*/ { "[712]abcdefghijklmnopqrst", 0, "712abcdefghijklmnopqrst" },
        /*342*/ { "[712]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*343*/ { "[713]abcdefghijklmnopqrst", 0, "713abcdefghijklmnopqrst" },
        /*344*/ { "[713]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*345*/ { "[714]abcdefghijklmnopqrst", 0, "714abcdefghijklmnopqrst" },
        /*346*/ { "[714]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*347*/ { "[715]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*348*/ { "[716]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*349*/ { "[719]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*350*/ { "[7100]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*351*/ { "[72]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*352*/ { "[7200]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*353*/ { "[7210]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*354*/ { "[7220]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*355*/ { "[7230]EMabcdefghijklmnopqrstuvwxyzab", 0, "7230EMabcdefghijklmnopqrstuvwxyzab" },
        /*356*/ { "[7230]EMabcdefghijklmnopqrstuvwxyzabc", ZINT_ERROR_INVALID_DATA, "" },
        /*357*/ { "[7230]EM", ZINT_ERROR_INVALID_DATA, "" },
        /*358*/ { "[7231]EMabcdefghijklmnopqrstuvwxyzab", 0, "7231EMabcdefghijklmnopqrstuvwxyzab" },
        /*359*/ { "[7232]EMabcdefghijklmnopqrstuvwxyzab", 0, "7232EMabcdefghijklmnopqrstuvwxyzab" },
        /*360*/ { "[7233]EMabcdefghijklmnopqrstuvwxyzab", 0, "7233EMabcdefghijklmnopqrstuvwxyzab" },
        /*361*/ { "[7234]EMabcdefghijklmnopqrstuvwxyzab", 0, "7234EMabcdefghijklmnopqrstuvwxyzab" },
        /*362*/ { "[7235]EMabcdefghijklmnopqrstuvwxyzab", 0, "7235EMabcdefghijklmnopqrstuvwxyzab" },
        /*363*/ { "[7236]EMabcdefghijklmnopqrstuvwxyzab", 0, "7236EMabcdefghijklmnopqrstuvwxyzab" },
        /*364*/ { "[7237]EMabcdefghijklmnopqrstuvwxyzab", 0, "7237EMabcdefghijklmnopqrstuvwxyzab" },
        /*365*/ { "[7238]EMabcdefghijklmnopqrstuvwxyzab", 0, "7238EMabcdefghijklmnopqrstuvwxyzab" },
        /*366*/ { "[7239]EMabcdefghijklmnopqrstuvwxyzab", 0, "7239EMabcdefghijklmnopqrstuvwxyzab" },
        /*367*/ { "[7239]E", ZINT_ERROR_INVALID_DATA, "" },
        /*368*/ { "[7240]abcdefghijklmnopqrst", 0, "7240abcdefghijklmnopqrst" },
        /*369*/ { "[7240]abcdefghijklmnopqrstu", ZINT_ERROR_INVALID_DATA, "" },
        /*370*/ { "[7241]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*371*/ { "[7249]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*372*/ { "[7250]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*373*/ { "[7299]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*374*/ { "[73]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*375*/ { "[7300]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*376*/ { "[74]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*377*/ { "[7400]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*378*/ { "[79]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*379*/ { "[7900]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*380*/ { "[7999]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*381*/ { "[80]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*382*/ { "[800]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*383*/ { "[8000]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*384*/ { "[8001]12345678901234", 0, "800112345678901234" },
        /*385*/ { "[8001]1234123456789012345", ZINT_ERROR_INVALID_DATA, "" },
        /*386*/ { "[8002]abcdefghijklmnopqrst", 0, "8002abcdefghijklmnopqrst" },
        /*387*/ { "[8002]abcdefghijklmnopqrstuv", ZINT_ERROR_INVALID_DATA, "" },
        /*388*/ { "[8003]01234567890123abcdefghijklmnop", 0, "800301234567890123abcdefghijklmnop" },
        /*389*/ { "[8004]abcdefghijklmnopqrstuvwxyz1234", 0, "8004abcdefghijklmnopqrstuvwxyz1234" },
        /*390*/ { "[8004]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" },
        /*391*/ { "[8005]123456", 0, "8005123456" },
        /*392*/ { "[8005]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*393*/ { "[8005]1234567", ZINT_ERROR_INVALID_DATA, "" },
        /*394*/ { "[8006]123456789012341212", 0, "8006123456789012341212" },
        /*395*/ { "[8006]12345678901234121", ZINT_ERROR_INVALID_DATA, "" },
        /*396*/ { "[8006]1234567890123412123", ZINT_ERROR_INVALID_DATA, "" },
        /*397*/ { "[8007]abcdefghijklmnopqrstuvwxyz12345678", 0, "8007abcdefghijklmnopqrstuvwxyz12345678" },
        /*398*/ { "[8007]abcdefghijklmnopqrstuvwxyz123456789", ZINT_ERROR_INVALID_DATA, "" },
        /*399*/ { "[8008]123456121212", 0, "8008123456121212" },
        /*400*/ { "[8008]1234561212", 0, "80081234561212" },
        /*401*/ { "[8008]12345612", 0, "800812345612" },
        /*402*/ { "[8008]1234561", ZINT_ERROR_INVALID_DATA, "" },
        /*403*/ { "[8008]123456121", ZINT_ERROR_INVALID_DATA, "" },
        /*404*/ { "[8008]12345612121", ZINT_ERROR_INVALID_DATA, "" },
        /*405*/ { "[8008]1234561212123", ZINT_ERROR_INVALID_DATA, "" },
        /*406*/ { "[8009]12345678901234567890123456789012345678901234567890", 0, "800912345678901234567890123456789012345678901234567890" },
        /*407*/ { "[8009]123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*408*/ { "[8010]1234abcdefghijklmnopqrstuvwxyz1", ZINT_ERROR_INVALID_DATA, "" },
        /*409*/ { "[8011]123456789012", 0, "8011123456789012" },
        /*410*/ { "[8011]1234567890123", ZINT_ERROR_INVALID_DATA, "" },
        /*411*/ { "[8012]abcdefghijklmnopqrst", 0, "8012abcdefghijklmnopqrst" },
        /*412*/ { "[8012]abcdefghijklmnopqrstuv", ZINT_ERROR_INVALID_DATA, "" },
        /*413*/ { "[8013]1234abcdefghijklmnopqrstuvwxyz", 0, "80131234abcdefghijklmnopqrstuvwxyz" },
        /*414*/ { "[8013]1234abcdefghijklmnopqrstuvwxyz1", ZINT_ERROR_INVALID_DATA, "" },
        /*415*/ { "[8014]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*416*/ { "[8016]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*417*/ { "[8017]313131313131313139", 0, "8017313131313131313139" },
        /*418*/ { "[8017]31313131313131313", ZINT_ERROR_INVALID_DATA, "" },
        /*419*/ { "[8017]3131313131313131390", ZINT_ERROR_INVALID_DATA, "" },
        /*420*/ { "[8018]313131313131313139", 0, "8018313131313131313139" },
        /*421*/ { "[8018]31313131313131313", ZINT_ERROR_INVALID_DATA, "" },
        /*422*/ { "[8018]3131313131313131390", ZINT_ERROR_INVALID_DATA, "" },
        /*423*/ { "[8019]1234567890", 0, "80191234567890" },
        /*424*/ { "[8019]12345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*425*/ { "[8020]abcdefghijklmnopqrstuvwxy", 0, "8020abcdefghijklmnopqrstuvwxy" },
        /*426*/ { "[8020]abcdefghijklmnopqrstuvwxyz", ZINT_ERROR_INVALID_DATA, "" },
        /*427*/ { "[8021]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*428*/ { "[8025]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*429*/ { "[8026]123456789012341212", 0, "8026123456789012341212" },
        /*430*/ { "[8026]1234567890123451212", ZINT_ERROR_INVALID_DATA, "" },
        /*431*/ { "[8026]12345678901234512", ZINT_ERROR_INVALID_DATA, "" },
        /*432*/ { "[8027]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*433*/ { "[8030]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*434*/ { "[8040]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*435*/ { "[8090]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*436*/ { "[8099]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*437*/ { "[81]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*438*/ { "[8100]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*439*/ { "[8109]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*440*/ { "[8110]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "81101234567890123456789012345678901234567890123456789012345678901234567890" },
        /*441*/ { "[8110]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*442*/ { "[8111]1234", 0, "81111234" },
        /*443*/ { "[8111]12345", ZINT_ERROR_INVALID_DATA, "" },
        /*444*/ { "[8111]123", ZINT_ERROR_INVALID_DATA, "" },
        /*445*/ { "[8112]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "81121234567890123456789012345678901234567890123456789012345678901234567890" },
        /*446*/ { "[8112]12345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*447*/ { "[8113]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*448*/ { "[8120]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*449*/ { "[8190]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*450*/ { "[8199]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*451*/ { "[82]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*452*/ { "[8200]1234567890123456789012345678901234567890123456789012345678901234567890", 0, "82001234567890123456789012345678901234567890123456789012345678901234567890" },
        /*453*/ { "[8201]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*454*/ { "[8210]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*455*/ { "[8290]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*456*/ { "[8299]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*457*/ { "[83]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*458*/ { "[8300]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*459*/ { "[89]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*460*/ { "[8900]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*461*/ { "[90]abcdefghijklmnopqrstuvwxyz1234", 0, "90abcdefghijklmnopqrstuvwxyz1234" },
        /*462*/ { "[9000]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*463*/ { "[90]abcdefghijklmnopqrstuvwxyz12345", ZINT_ERROR_INVALID_DATA, "" },
        /*464*/ { "[91]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "91123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" },
        /*465*/ { "[91]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*466*/ { "[92]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "92123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" },
        /*467*/ { "[92]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*468*/ { "[93]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "93123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" },
        /*469*/ { "[93]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*470*/ { "[94]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "94123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" },
        /*471*/ { "[94]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*472*/ { "[98]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "98123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" },
        /*473*/ { "[98]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*474*/ { "[99]123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", 0, "99123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" },
        /*475*/ { "[99]1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901", ZINT_ERROR_INVALID_DATA, "" },
        /*476*/ { "[9900]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*477*/ { "[9999]1234", ZINT_ERROR_INVALID_DATA, "" },
        /*478*/ { "[01]12345678901234[7006]200101", 0, "01123456789012347006200101" },
        /*479*/ { "[3900]1234567890[01]12345678901234", 0, "39001234567890[0112345678901234" },
        /*480*/ { "[253]12345678901234[3901]12345678901234[20]12", 0, "25312345678901234[390112345678901234[2012" },
        /*481*/ { "[253]12345678901234[01]12345678901234[3901]12345678901234[20]12", 0, "25312345678901234[0112345678901234390112345678901234[2012" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char reduced[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        int length = strlen(data[i].data);

        ret = gs1_verify(symbol, data[i].data, length, reduced);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d (length %d \"%s\") %s\n", i, ret, data[i].ret, length, data[i].data, symbol->errtxt);

        if (ret == 0) {
            assert_zero(strcmp(reduced, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, reduced, data[i].expected);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_input_mode(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        unsigned char* composite;
        int input_mode;
        int output_options;
        int ret;
        int compare_previous;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { BARCODE_AZTEC, "[01]12345678901234", "", GS1_MODE, -1 , 0, 0 },
        /*  1*/ { BARCODE_AZTEC, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, -1, 0, 1 },
        /*  2*/ { BARCODE_AZTEC, "[01]12345678901234", "", GS1_MODE, READER_INIT, ZINT_ERROR_INVALID_OPTION, 0 },
        /*  3*/ { BARCODE_AZTEC, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, READER_INIT, ZINT_ERROR_INVALID_OPTION, 0 },
        /*  4*/ { BARCODE_AZTEC, "1234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /*  5*/ { BARCODE_AZTEC, "1234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /*  6*/ { BARCODE_CODABLOCKF, "[01]12345678901234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_OPTION, 0 },
        /*  7*/ { BARCODE_CODABLOCKF, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_OPTION, 0 },
        /*  8*/ { BARCODE_CODABLOCKF, "1234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_OPTION, 0 },
        /*  9*/ { BARCODE_CODABLOCKF, "1234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_OPTION, 0 },
        /* 10*/ { BARCODE_CODEONE, "[01]12345678901234", "", GS1_MODE, -1, 0, 0 },
        /* 11*/ { BARCODE_CODEONE, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, -1, 0, 1 },
        /* 12*/ { BARCODE_CODEONE, "1234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 13*/ { BARCODE_CODEONE, "1234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 14*/ { BARCODE_CODE16K, "[01]12345678901234", "", GS1_MODE, -1, 0, 0 },
        /* 15*/ { BARCODE_CODE16K, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, -1, 0, 1 },
        /* 16*/ { BARCODE_CODE16K, "1234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 17*/ { BARCODE_CODE16K, "1234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 18*/ { BARCODE_CODE49, "[01]12345678901234", "", GS1_MODE, -1, 0, 0 },
        /* 19*/ { BARCODE_CODE49, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, -1, 0, 1 },
        /* 20*/ { BARCODE_CODE49, "1234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 21*/ { BARCODE_CODE49, "1234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 22*/ { BARCODE_DATAMATRIX, "[01]12345678901234", "", GS1_MODE, -1, 0, 0 },
        /* 23*/ { BARCODE_DATAMATRIX, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, -1, 0, 1 },
        /* 24*/ { BARCODE_DATAMATRIX, "[01]12345678901234", "", GS1_MODE, READER_INIT, ZINT_ERROR_INVALID_OPTION, 0 },
        /* 25*/ { BARCODE_DATAMATRIX, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, READER_INIT, ZINT_ERROR_INVALID_OPTION, 0 },
        /* 26*/ { BARCODE_DATAMATRIX, "1234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 27*/ { BARCODE_DATAMATRIX, "1234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 28*/ { BARCODE_DOTCODE, "[01]12345678901234", "", GS1_MODE, -1, 0, 0 },
        /* 29*/ { BARCODE_DOTCODE, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, -1, 0, 1 },
        /* 30*/ { BARCODE_DOTCODE, "1234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 31*/ { BARCODE_DOTCODE, "1234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 32*/ { BARCODE_QRCODE, "[01]12345678901234", "", GS1_MODE, -1, 0, 0 },
        /* 33*/ { BARCODE_QRCODE, "[01]12345678901234", "", GS1_MODE | ESCAPE_MODE, -1, 0, 1 },
        /* 34*/ { BARCODE_QRCODE, "1234", "", GS1_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
        /* 35*/ { BARCODE_QRCODE, "1234", "", GS1_MODE | ESCAPE_MODE, -1, ZINT_ERROR_INVALID_DATA, 0 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char* text;
    struct zint_symbol previous_symbol;

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->input_mode = data[i].input_mode;
        if (data[i].output_options != -1) {
            symbol->output_options = data[i].output_options;
        }

        if (strlen(data[i].composite)) {
            text = data[i].composite;
            strcpy(symbol->primary, data[i].data);
        } else {
            text = data[i].data;
        }
        int length = strlen(text);

        ret = ZBarcode_Encode(symbol, text, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);
        if (data[i].compare_previous) {
            ret = testUtilSymbolCmp(symbol, &previous_symbol);
            assert_zero(ret, "i:%d testUtilSymbolCmp ret %d != 0\n", i, ret);
        }
        memcpy(&previous_symbol, symbol, sizeof(previous_symbol));

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_gs1_reduce();
    test_hrt();
    test_gs1_verify();
    test_input_mode();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_hanxin.c.


















































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

//#define TEST_INPUT_GENERATE_EXPECTED 1
//#define TEST_ENCODE_GENERATE_EXPECTED 1

static void test_options(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int option_1;
        int option_2;
        int ret_encode;
        int ret_vector;
        int expected_size;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "12345", -1, -1, 0, 0, 23 }, // Default version 1, ECC auto-set to 4
        /*  1*/ { "12345", 1, -1, 0, 0, 23 },
        /*  2*/ { "12345", -1, 2, 0, 0, 25 },
        /*  3*/ { "12345", -1, 85, 0, 0, 23 }, // Version > max version 85 so ignored
        /*  4*/ { "12345", -1, 84, 0, 0, 189 },
        /*  5*/ { "1234567890123456789012345678901234567890123", 1, 1, ZINT_ERROR_TOO_LONG, -1, -1 },
        /*  6*/ { "1234567890123456", 4, 1, ZINT_ERROR_TOO_LONG, -1, -1 },
        /*  7*/ { "12345678901234567", 4, 2, 0, 0, 25 },
        /*  8*/ { "12345678901234567", 4, -1, 0, 0, 25 }, // Version auto-set to 2
        /*  9*/ { "12345678901234567", -1, -1, 0, 0, 23 }, // Version auto-set to 1, ECC auto-set to 3
        /* 10*/ { "12345678901234567", 5, -1, 0, 0, 23 }, // ECC > max ECC 4 so ignored and auto-settings version 1, ECC 3 used
        /* 11*/ { "1234567890123456789012345678901234567890123", -1, -1, 0, 0, 25 }, // Version auto-set to 2, ECC auto-set to 2
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_HANXIN;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt);

        if (data[i].ret_vector != -1) {
            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
            assert_equal(symbol->width, data[i].expected_size, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_size);
            assert_equal(symbol->rows, data[i].expected_size, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_size);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_input(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        int eci;
        unsigned char* data;
        int length;
        int ret;
        int expected_eci;
        char* expected;
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, in GB 18030 0xA8A6, UTF-8 C3A9
    // β U+03B2 in ISO 8859-7 Greek 0xE2 (but not other ISO 8859 or Win page), in GB 18030 0xA6C2, UTF-8 CEB2
    // ÿ U+00FF in ISO 8859-1 0xFF, not in GB 18030, outside first byte and second byte range, UTF-8 C3BF
    // 啊 U+554A GB 18030 Region One 0xB0A1, UTF-8 E5958A
    // äº U+4E8D GB 18030 Region Two 0xD8A1, UTF-8 E4BA8D
    // 齄 U+9F44 GB 18030 Region Two 0xF7FE, UTF-8 E9BD84
    // 丂 U+4E02 GB 18030 2-byte Region 0x8140, UTF-8 E4B882
    // PAD U+0080 GB 18030 4-byte Region 0x81308130, UTF-8 C280 (\302\200)
    // � (REPLACEMENT CHARACTER) U+FFFD GB 18030 4-byte Region 0x81308130, UTF-8 EFBFBD (\357\277\275)
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, 0, "é", -1, 0, 0, "30 00 F4 80 00 00 00 00 00", "B1 (ISO 8859-1)" },
        /*  1*/ { UNICODE_MODE, 3, "é", -1, 0, 3, "80 33 00 0F 48 00 00 00 00", "ECI-3 B1 (ISO 8859-1)" },
        /*  2*/ { UNICODE_MODE, 29, "é", -1, 0, 29, "81 D4 FC FF FF 00 00 00 00", "ECI-29 H(1)1 (GB 18030) (Region One)" },
        /*  3*/ { UNICODE_MODE, 26, "é", -1, 0, 26, "81 A4 70 2F FF 00 00 00 00", "ECI-26 H(1)1 (UTF-8) (Region One)" },
        /*  4*/ { DATA_MODE, 0, "é", -1, 0, 0, "47 02 FF F0 00 00 00 00 00", "H(1)1 (UTF-8) (Region One)" },
        /*  5*/ { DATA_MODE, 0, "\351", -1, 0, 0, "30 00 F4 80 00 00 00 00 00", "B1 (ISO 8859-1) (0xE9)" },
        /*  6*/ { UNICODE_MODE, 0, "β", -1, 0, 0, "30 01 53 61 00 00 00 00 00", "B2 (GB 18030) (2-byte Region)" },
        /*  7*/ { UNICODE_MODE, 9, "β", -1, 0, 9, "80 93 00 0F 10 00 00 00 00", "ECI-9 B1 (ISO 8859-7)" },
        /*  8*/ { UNICODE_MODE, 29, "β", -1, 0, 29, "81 D3 00 15 36 10 00 00 00", "ECI-29 B2 (GB 18030) (2-byte Region)" },
        /*  9*/ { UNICODE_MODE, 26, "β", -1, 0, 26, "81 A4 B1 5F FF 00 00 00 00", "ECI-26 H(1)1 (UTF-8) (Region One)" },
        /* 10*/ { DATA_MODE, 0, "β", -1, 0, 0, "4B 15 FF F0 00 00 00 00 00", "H(1)1 (UTF-8) (Region One)" },
        /* 11*/ { UNICODE_MODE, 0, "ÿ", -1, 0, 0, "30 00 FF 80 00 00 00 00 00", "B1 (ISO 8859-1)" },
        /* 12*/ { UNICODE_MODE, 0, "ÿÿÿ", -1, 0, 0, "30 01 FF FF FF 80 00 00 00", "B3 (ISO 8859-1)" },
        /* 13*/ { UNICODE_MODE, 0, "\302\200", -1, 0, 0, "70 00 00 00 00 00 00 00 00", "H(f)1 (GB 18030) (4-byte Region)" },
        /* 14*/ { UNICODE_MODE, 0, "\302\200�", -1, 0, 0, "70 00 00 38 26 7E 40 00 00", "H(f)2 (GB 18030) (both 4-byte Region)" },
        /* 15*/ { UNICODE_MODE, 0, "啊äºé½„丂\302\200", -1, 0, 0, "64 68 50 3C AC 28 80 00 FF FE E0 00 00 00 00 00 00", "H(d)4 H(f)1 (GB 18030)" },
        /* 16*/ { DATA_MODE, 0, "\177\177", -1, 0, 0, "2F BD F7 F0 00 00 00 00 00", "T2 (ASCII)" },
        /* 17*/ { DATA_MODE, 0, "\177\177\177", -1, 0, 0, "2F BD F7 DF C0 00 00 00 00", "T3 (ASCII)" },
        /* 18*/ { UNICODE_MODE, 0, "123", -1, 0, 0, "11 EF FF 00 00 00 00 00 00", "N3 (ASCII)" },
        /* 19*/ { UNICODE_MODE, 0, "12345", -1, 0, 0, "11 EC 2D FF 80 00 00 00 00", "N5 (ASCII)" },
        /* 20*/ { UNICODE_MODE, 0, "Aa%$Bb9", -1, 0, 0, "22 A4 FA 18 3E 2E 52 7F 00", "T7 (ASCII)" },
        /* 21*/ { UNICODE_MODE, 0, "Summer Palace Ticket for 6 June 2015 13:00;2015å¹´6月6日夜01時00分PM頤和園ã®ãƒã‚±ãƒƒãƒˆ;2015ë…„6ì›”6ì¼13시오후여름ê¶ì „티켓.2015å¹´6月6å·ä¸‹åˆ13:00çš„é¢å’Œå›­é—¨ç¥¨;", -1, 0, 0, "(189) 27 38 C3 0A 35 F9 CF 99 92 F9 26 A3 E7 3E 76 C9 AE A3 7F CC 08 04 0C CD EE 44 06 C4", "T20 B64 N4 H(f)1 T1 H(f)1 T1 H(f)1 T2 H(f)9 B35 (GB 18030)" },
        /* 22*/ { UNICODE_MODE, 0, "\000\014\033 #/059:<@AMZ", 15, 0, 0, "2F 80 31 B7 1F AF E0 05 27 EB 2E CB E2 96 8F F0 00", "T15 (ASCII)" },
        /* 23*/ { UNICODE_MODE, 0, "Z[\\`alz{~\177", -1, 0, 0, "28 FE CF 4E 3E 92 FF 7E E7 CF 7F 00 00", "T10 (ASCII)" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_HANXIN;
        symbol->input_mode = data[i].input_mode;
        symbol->eci = data[i].eci;
        symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_INPUT_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, %d, \"%s\", %s, %d, \"%s\", \"%s\" },\n",
                i, testUtilInputModeName(data[i].input_mode), data[i].eci, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret),
                ret < 5 ? symbol->eci : -1, symbol->errtxt, data[i].comment);
        #else
        if (ret < 5) {

            assert_equal(symbol->eci, data[i].expected_eci, "i:%d eci %d != %d\n", i, symbol->eci, data[i].expected_eci);
            assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_encode(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int input_mode;
        int option_1;
        int option_2;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        char* expected;
    };
    struct item data[] = {
        /*  0*/ { "1234", UNICODE_MODE, -1, -1, 0, 23, 23, "",
                    "11111110101000101111111"
                    "10000000010001000000001"
                    "10111110101110001111101"
                    "10100000101011000000101"
                    "10101110010011101110101"
                    "10101110101111101110101"
                    "10101110011010001110101"
                    "00000000110001100000000"
                    "00010101111011001010101"
                    "01001010101101000111110"
                    "10101101001010101010100"
                    "11011101010100100010010"
                    "10101010010011101010100"
                    "01010100111110000011110"
                    "10101010001011110101000"
                    "00000000110111100000000"
                    "11111110011001001110101"
                    "00000010110000101110101"
                    "11111010101110001110101"
                    "00001010010110100000101"
                    "11101010001100101111101"
                    "11101010000011000000001"
                    "11101010101010101111111"
               },
        /*  1*/ { "1234567890", UNICODE_MODE, 1, 1, 0, 23, 23, "**NOT SAME** as ISO 20830 Draft K.1 Example 1, uses masking pattern 2 instead of pattern 1; however matches pattern 2 example (excluding Function Info)",
                    "11111110001011101111111"
                    "10000000100000000000001"
                    "10111110011111001111101"
                    "10100000000111000000101"
                    "10101110011110101110101"
                    "10101110011111101110101"
                    "10101110101111101110101"
                    "00000000001100000000000"
                    "00010101011111010010101"
                    "01010001100001001001101"
                    "00100100100100101011100"
                    "11111000010111111111111"
                    "01001001001001001001000"
                    "11110010100100110010000"
                    "10101001011111010101000"
                    "00000000001000000000000"
                    "11111110110000101110101"
                    "00000010111111001110101"
                    "11111010101001001110101"
                    "00001010000011000000101"
                    "11101010010111001111101"
                    "11101010001001100000001"
                    "11101010100100001111111"
               },
        /*  2*/ { "1234567890ABCDEFGabcdefg,Han Xin Code", UNICODE_MODE, 3, 10, 0, 41, 41, "Same as ISO 20830 Draft K.2 Example 2 (happens to use same mask pattern, 2)",
                    "11111110001011000000100000010101101111111"
                    "10000000001011110010000000011010100000001"
                    "10111110111111111010111011101111101111101"
                    "10100000101001001001001001001001100000101"
                    "10101110000100100101010010010111001110101"
                    "10101110010111110111111011101100101110101"
                    "10101110101111001001011101110011001110101"
                    "00000000011001100100100100100100100000000"
                    "00011110111111111111111001101111110010101"
                    "10110011011100110010001001100000001001001"
                    "11001100100100100100100100100100100100100"
                    "11111111001110101101011011110011011110110"
                    "10100001001001000001100001010010001001001"
                    "10100100100100100100100101100100001110011"
                    "10011111100010110000001111111111101000001"
                    "10110000001001001001001001001001001001001"
                    "10101011011110000011001101111001100100100"
                    "11111111000110010101111011111111111111111"
                    "11001001001001000110011001110111100000010"
                    "10111110100100100100100110001110011011000"
                    "11111111111111111111111111111111111111101"
                    "00000000000000000000101001001001001011000"
                    "01110110101001001010101000010110100100100"
                    "11111111101110010010100011111111111111111"
                    "01001001001001001100110001101111011101011"
                    "00101111100100100100100100001101001101110"
                    "11111111111111111110111111111111111001111"
                    "10010110100000101110111010011001001001001"
                    "00101001101100100010100100100100100100100"
                    "11111111111110110000111000110000110000101"
                    "00000001001001001000101011011100000100101"
                    "00100100100100100100100100100100101011111"
                    "10101001100101110100111011100010101111000"
                    "00000000110001001000101001001111000000000"
                    "11111110001011100100100100100100101110101"
                    "00000010111111111110111111111111001110101"
                    "11111010001001000000111111111011001110101"
                    "00001010100101111000101010100100100000101"
                    "11101010111111111100101100001111101111101"
                    "11101010101001001000101001001001000000001"
                    "11101010100100100100111111111111001111111"
               },
        /*  3*/ { "Summer Palace Ticket for 6 June 2015 13:00;2015å¹´6月6日夜01時00分PM頤和園ã®ãƒã‚±ãƒƒãƒˆ;2015ë…„6ì›”6ì¼13시오후여름ê¶ì „티켓.2015å¹´6月6å·ä¸‹åˆ13:00çš„é¢å’Œå›­é—¨ç¥¨;", UNICODE_MODE, 2, 17, 0, 55, 55, "**NOT SAME** as ISO 20830 Draft K.3 Example 3, different encoding modes; if same encoding modes forced, uses masking pattern 1 instead of pattern 2, but matches pattern 1 example (excluding Function Info)",
                    "1111111001111111111011100100110101101010101100101111111"
                    "1000000000000000001100011000011001000010101111100000001"
                    "1011111011110010101110010110100000111010101101101111101"
                    "1010000001010100001101011100001101100100010100000000101"
                    "1010111000011011001111001000010010110010101010001110101"
                    "1010111011010101001101010100001010011001000110001110101"
                    "1010111001101001001001110010001001100100001001001110101"
                    "0000000011100111101101111010001010001100110011000000000"
                    "0010010101010100001100111100101010101111010001101010101"
                    "1111111011101110101000110010100010000101010101010101010"
                    "1010100111011011001101110110100101100011101000111110110"
                    "0011100111010001101001111011100001001111110010000011001"
                    "0011000100100010101011000001101101010000001010011010000"
                    "1100111101010101001101010101010100010100001110110101000"
                    "0000000100111001001010101100101100000001011111001110100"
                    "1101000010010001001101110001010101101100101110001110111"
                    "0101010101011100001110010001111110101010101010101010101"
                    "0001011000101000101011010011111000010010000011110101100"
                    "1001000100000110001111111111111111111000011101001110001"
                    "0010110011110110100000000000000000001101011101001100000"
                    "1111111100000100100000111011111001001111011001011100101"
                    "1101010101010101010101010100111011001110101010100111101"
                    "1101010011001001100110000001001000101000001011111110000"
                    "1000111001010111001010111111101100101101010000111001101"
                    "1110101100000011001001001011001010101010101010101010101"
                    "1101001110000100101100101011001100001001110111011001000"
                    "1001101010000000001000010010101100001011101001110010101"
                    "1101001100101100100011100010110000101101110100110010110"
                    "1000001010101010101010101010111101001010101100011001100"
                    "1101000101010110010101100101011000101001001000001000001"
                    "1010011101101101010001000111011011101011111010101111001"
                    "1101101100100000010010000011011001001101010101010101010"
                    "1010111000110111100101100011101010001010001001101110011"
                    "1100110000001101010011010000001011101011110011010101001"
                    "1011101111011001101010110111101100101100110001101100101"
                    "1000110111010101010101010101010100001101011110111010101"
                    "1111111111111111111110001011001010101111111111111111111"
                    "0000000000000000001110000010010000000000000000000000001"
                    "0100011110001011001010000111010001001101001001010010101"
                    "0101011111000100101000110110001100101111110100110101001"
                    "0100011010101010101010100110110101100111011001011000101"
                    "1000110011110001101000011011111101100010100001110000101"
                    "1111001110101101101000100011011010001010011000010000001"
                    "0001110000001011001100000011111101010101010101010101001"
                    "1010011101001101001101011101000010010100010000001110101"
                    "1101100101011001101001000100010000001101111001000111001"
                    "1010101010110101101010010110010011001111101011010100100"
                    "0000000000000100001001100011100100010101010101100000000"
                    "1111111000101010101010101110111100111011011111001110101"
                    "0000001000101011001010000100010101001110001111101110101"
                    "1111101000100001101101000001100001001011101001001110101"
                    "0000101001000100101010110010010101010110011001000000101"
                    "1110101010111000101011111101011101111100001110101111101"
                    "1110101011010101001101010101010101000000001010000000001"
                    "1110101011010001001111111111111111101000001110001111111"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_HANXIN;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_ENCODE_GENERATE_EXPECTED
        printf("        /*%3d*/ { \"%s\", %s, %d, %d, %s, %d, %d, \"%s\",\n",
                i, data[i].data, testUtilInputModeName(data[i].input_mode), data[i].option_1, data[i].option_2, testUtilErrorName(data[i].ret),
                symbol->rows, symbol->width, data[i].comment);
        testUtilModulesDump(symbol, "                    ", "\n");
        printf("               },\n");
        #else
        if (ret < 5) {
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);

            if (ret == 0) {
                int width, row;
                ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
                assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);
            }
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_options();
    test_input();
    test_encode();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_imail.c.




































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/*
 * Intelligent Mail barcode Encoder Test Case Reference Set (csv file)
 * Copyright (C) 2009 U.S. Postal Service
 */

#include "testcommon.h"

#define TEST_IMAIL_CSV_MAX 500

static void test_csv(void)
{
    testStart("");

    FILE* fd = fopen("../data/imail/usps/uspsIMbEncoderTestCases.csv", "r");
    assert_nonnull(fd, "open ../data/imail/usps/uspsIMbEncoderTestCases.csv");

    char buffer[1024];
    char id[10];
    char tracking_code[50];
    char routing_code[50];
    char data[102];
    char expected_daft[70];
    char return_code[10];
    char actual_daft[70];

    int ret;
    int i;
    int lc = 0;
    while (fgets(buffer, sizeof(buffer), fd) != NULL) {

        lc++;
        #ifdef TEST_IMAIL_CSV_MAX
        if (lc > TEST_IMAIL_CSV_MAX) {
            break;
        }
        #endif

        id[0] = tracking_code[0] = routing_code[0] = expected_daft[0] = return_code[0] = '\0';

        char* b = testUtilReadCSVField(buffer, id, sizeof(id));
        assert_nonnull(b, "lc:%d id b == NULL", lc);
        assert_equal(*b, ',', "lc:%d id *b %c != ','", lc, *b);

        b = testUtilReadCSVField(++b, tracking_code, sizeof(tracking_code));
        assert_nonnull(b, "lc:%d tracking_code b == NULL", lc);
        assert_equal(*b, ',', "lc:%d tracking_code *b %c != ','", lc, *b);

        b = testUtilReadCSVField(++b, routing_code, sizeof(routing_code));
        assert_nonnull(b, "lc:%d routing_code b == NULL", lc);
        assert_equal(*b, ',', "lc:%d routing_code *b %c != ','", lc, *b);

        b = testUtilReadCSVField(++b, expected_daft, sizeof(expected_daft));
        assert_nonnull(b, "lc:%d expected_daft b == NULL", lc);
        assert_equal(*b, ',', "lc:%d expected_daft *b %c != ','", lc, *b);

        b = testUtilReadCSVField(++b, return_code, sizeof(return_code));
        assert_nonnull(b, "lc:%d return_code b == NULL", lc);
        assert_equal(*b, ',', "lc:%d return_code *b %c != ','", lc, *b);

        strcpy(data, tracking_code);
        strcat(data, "-");
        strcat(data, routing_code);

        assert_nonzero(strlen(data), "lc:%d strlen(data) == 0", lc);

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_ONECODE;

        ret = ZBarcode_Encode(symbol, data, strlen(data));

        if (strcmp(return_code, "00") == 0) {

            assert_zero(ret, "lc:%d ZBarcode_Encode ret %d != 0\n", lc, ret);

            assert_equal(symbol->rows, 3, "rows %d != 3", symbol->rows);

            ret = testUtilDAFTConvert(symbol, actual_daft, sizeof(actual_daft));
            assert_nonzero(ret, "lc:%d testUtilDAFTConvert == 0", lc);
            assert_zero(strcmp(actual_daft, expected_daft), "lc:%d\n  actual %s\nexpected %s\n", lc, actual_daft, expected_daft);
        } else {
            assert_nonzero(ret, "lc:%d ZBarcode_Encode ret %d == 0\n", lc, ret);
        }

        ZBarcode_Delete(symbol);
    }

    fclose(fd);

    testFinish();
}

int main()
{
    test_csv();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_library.c.




















































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

static void test_checks(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int length;
        int input_mode;
        int eci;
        float dot_size;
        int ret;

        char* expected;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { BARCODE_CODE128, "1234", -1, -1, 3, -1, ZINT_ERROR_INVALID_OPTION, "Error 217: Symbology does not support ECI switching" },
        /* 1*/ { BARCODE_CODE128, "1234", -1, -1, 0, -1, 0, "" },
        /* 2*/ { BARCODE_QRCODE, "1234", -1, -1, 3, -1, 0, "" },
        /* 3*/ { BARCODE_QRCODE, "1234", -1, -1, 999999 + 1, -1, ZINT_ERROR_INVALID_OPTION, "Error 218: Invalid ECI mode" },
        /* 4*/ { BARCODE_CODE128, "1234", -1, -1, -1, 20.1, ZINT_ERROR_INVALID_OPTION, "Error 221: Invalid dot size" },
        /* 5*/ { BARCODE_CODE128, "1234", -1, GS1_MODE, -1, -1, ZINT_ERROR_INVALID_OPTION, "Error 220: Selected symbology does not support GS1 mode" },
        /* 6*/ { BARCODE_EAN128, "[21]12\0004", 8, GS1_MODE, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 262: NUL characters not permitted in GS1 mode" },
        /* 7*/ { BARCODE_EAN128, "[21]12é4", -1, GS1_MODE, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 250: Extended ASCII characters are not supported by GS1" },
        /* 8*/ { BARCODE_EAN128, "[21]12\0074", -1, GS1_MODE, -1, -1, ZINT_ERROR_INVALID_DATA, "Error 251: Control characters are not supported by GS1" },
        /* 9*/ { BARCODE_EAN128, "[21]1234", -1, GS1_MODE, -1, -1, 0, "" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char* text;
    char* primary;
    char escaped_primary[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        if (data[i].input_mode != -1) {
            symbol->input_mode = data[i].input_mode;
        }
        if (data[i].eci != -1) {
            symbol->eci = data[i].eci;
        }
        if (data[i].dot_size != -1) {
            symbol->dot_size = data[i].dot_size;
        }
        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode(%d) ret %d != %d (%s)\n", i, data[i].symbology, ret, data[i].ret, symbol->errtxt);

        ret = strcmp(symbol->errtxt, data[i].expected);
        assert_zero(ret, "i:%d (%d) strcmp(%s, %s) %d != 0\n", i, data[i].symbology, symbol->errtxt, data[i].expected, ret);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_input_mode(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int input_mode;
        int ret;

        int expected_input_mode;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "1234", DATA_MODE, 0, DATA_MODE },
        /*  1*/ { "1234", DATA_MODE | ESCAPE_MODE, 0, DATA_MODE | ESCAPE_MODE },
        /*  2*/ { "1234", UNICODE_MODE, 0, UNICODE_MODE },
        /*  3*/ { "1234", UNICODE_MODE | ESCAPE_MODE, 0, UNICODE_MODE | ESCAPE_MODE },
        /*  4*/ { "[01]12345678901234", GS1_MODE, 0, GS1_MODE },
        /*  5*/ { "[01]12345678901234", GS1_MODE | ESCAPE_MODE, 0, GS1_MODE | ESCAPE_MODE },
        /*  6*/ { "1234", 4 | ESCAPE_MODE, 0, DATA_MODE }, // Unknown mode reset to bare DATA_MODE
        /*  7*/ { "1234", -1, 0, DATA_MODE },
        /*  8*/ { "1234", DATA_MODE | 0x10, 0, DATA_MODE | 0x10 }, // Unknown flags kept (but ignored)
        /*  9*/ { "1234", UNICODE_MODE | 0x10, 0, UNICODE_MODE | 0x10 },
        /* 10*/ { "[01]12345678901234", GS1_MODE | 0x20, 0, GS1_MODE | 0x20 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_CODE49; // Supports GS1
        symbol->input_mode = data[i].input_mode;

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);
        assert_equal(symbol->input_mode, data[i].expected_input_mode, "i:%d symbol->input_mode %d != %d\n", i, symbol->input_mode, data[i].expected_input_mode);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_checks();
    test_input_mode();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_mailmark.c.
























































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#include "testcommon.h"

static void test_encode_vector(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int ret_encode;
        float w;
        float h;
        int ret_vector;
        unsigned char* expected_daft;
    };
    // Vi} :s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { "0100000000000AA000AA0A", 0, 100, 30, 0, "TFATTADAAATAFAFADFTAFATDTTDTTAAFTTFFTTDFTTFFTTAFADFDFAAFTDDFDADDAA" },
        /* 1*/ { "0100000000009JA500AA0A", 0, 100, 30, 0, "TAFTTDADATTFDTFDFDFDTAATADADTTTATTFTDDDDTATDATDFTFFATAFFAFADAFFTDT" },
        /* 2*/ { "1100000000000XY11     ", 0, 100, 30, 0, "TTDTTATTDTAATTDTAATTDTAATTDTTDDAATAADDATAATDDFAFTDDTAADDDTAAFDFAFF" },
        /* 3*/ { "21B2254800659JW5O9QA6Y", 0, 100, 30, 0, "DAATATTTADTAATTFADDDDTTFTFDDDDFFDFDAFTADDTFFTDDATADTTFATTDAFDTFDDA" },
        /* 4*/ { "11000000000000000XY11    ", 0, 100, 30, 0, "TTDTTATDDTTATTDTAATTDTAATDDTTATTDTTDATFTAATDDTAATDDTATATFAADDAATAATDDTAADFTFTA" },
        /* 5*/ { "41038422416563762EF61AH8T", 0, 100, 30, 0, "DTTFATTDDTATTTATFTDFFFTFDFDAFTTTADTTFDTFDDDTDFDDFTFAADTFDTDTDTFAATAFDDTAATTDTT" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char actual_daft[80];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_MAILMARK;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret_encode);

        assert_equal(symbol->rows, 3, "i:%d symbol->rows %d != 3\n", i, symbol->rows);

        ret = testUtilDAFTConvert(symbol, actual_daft, sizeof(actual_daft));
        assert_nonzero(ret, "i:%d testUtilDAFTConvert ret == 0", i);
        assert_zero(strcmp(actual_daft, data[i].expected_daft), "i:%d\n  actual %s\nexpected %s\n", i, actual_daft, data[i].expected_daft);

        ret = ZBarcode_Buffer_Vector(symbol, 0);
        assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_encode_vector();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_maxicode.c.
























































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */

#include <stdio.h>
#include <string.h>
#include <zint.h>
#include "testcommon.h"

//#define TEST_GENERATE_EXPECTED 1

static void test_best_supported_set(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int ret;
        float w;
        float h;
        int ret_vector;

        int expected_rows;
        int expected_width;
        char* comment;
        unsigned char* expected;
    };
    struct item data[] = {
        /* 0*/ { BARCODE_MAXICODE, "am.//ab,\034TA# z\015!", 0, 100, 100, 0, 33, 30, "TODO: Better data and verify expected",
                    "111010000101111000111101010111"
                    "111110000000010100111000000000"
                    "110000101100110100111010101011"
                    "010101010101010101010101010100"
                    "000000000000000000000000000000"
                    "101010101010101010101010101000"
                    "010101010101010101010101010110"
                    "000000000000000000000000000000"
                    "101010101010101010101010101011"
                    "010101010111001100000101010110"
                    "000000001011000010000000000010"
                    "101010101100000000100110101010"
                    "010101001100000000101101010101"
                    "000000100000000000010000000010"
                    "101010110000000000010010101010"
                    "010101011000000000000101010110"
                    "000000001000000000001000000010"
                    "101010001000000000001010101000"
                    "010101010000000000001101010101"
                    "000000001100000000000000000010"
                    "101010110010000000010110101010"
                    "010101010100000001111001010100"
                    "000000001110110111111100000011"
                    "101010100110111101011010101010"
                    "010101010101010101010011101000"
                    "000000000000000000001101100000"
                    "101010101010101010100000100110"
                    "101001001101110001001011010000"
                    "100100110110001010011000011100"
                    "011011000001011011100100100110"
                    "111001100000101101000111001000"
                    "111100000110000011011101001110"
                    "010100101001110111101010110010"
                },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped_data[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        #ifdef TEST_GENERATE_EXPECTED
        printf("        /*%2d*/ { %s, \"%s\", %d, %.0f, %.0f, %d, %d, %d, \"%s\",\n",
                i, testUtilBarcodeName(data[i].symbology), testUtilEscape(data[i].data, length, escaped_data, sizeof(escaped_data)), ret,
                data[i].w, data[i].h, data[i].ret_vector, symbol->rows, symbol->width, data[i].comment);
        testUtilModulesDump(symbol, "                    ",  "\n");
        printf("                },\n");
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows);
        assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width);

        int width, row;
        ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
        assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d\n", i, ret, width, row);

        ret = ZBarcode_Buffer_Vector(symbol, 0);
        assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_best_supported_set();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_pdf417.c.




























































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

//#define TEST_PDF417_ENCODE_GENERATE_EXPECTED 1

static void test_pdf417_options(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int option_1;
        int option_2;
        int option_3;
        int ret_encode;
        int ret_vector;

        int expected_option_1;
        int expected_option_2;
        int expected_rows;
        int expected_width;
        int compare_previous;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "12345", -1, -1, -1, 0, 0, 2, 2, 6, 103, -1 }, // ECC auto-set to 2, cols auto-set to 2
        /*  1*/ { "12345", -1, -1, 928, 0, 0, 2, 2, 6, 103, 0 }, // Option 3 ignored
        /*  2*/ { "12345", -1, -1, 300, 0, 0, 2, 2, 6, 103, 0 }, // Option 3 ignored
        /*  3*/ { "12345", 3, -1, -1, 0, 0, 3, 3, 7, 120, -1 }, // ECC 3, cols auto-set to 3
        /*  4*/ { "12345", 3, 2, -1, 0, 0, 3, 2, 10, 103, -1 }, // ECC 3, cols 2
        /*  5*/ { "12345", 8, 2, -1, ZINT_ERROR_TOO_LONG, -1, 8, 3, 0, 0, -1 }, // ECC 8, cols 2, fails
        /*  6*/ { "12345", 7, 2, -1, 0, 0, 7, 3, 87, 120, -1 }, // ECC 7, cols 2 auto-upped to 3
        /*  7*/ { "12345", -1, 10, -1, 0, 0, 2, 10, 3, 239, -1 }, // ECC auto-set to 2, cols 10
    };
    int data_size = sizeof(data) / sizeof(struct item);

    struct zint_symbol previous_symbol;

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_PDF417;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }
        if (data[i].option_3 != -1) {
            symbol->option_3 = data[i].option_3;
        }
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt);

		assert_equal(symbol->option_1, data[i].expected_option_1, "i:%d symbol->option_1 %d != %d (%d)\n", i, symbol->option_1, data[i].expected_option_1, data[i].option_1);
		assert_equal(symbol->option_2, data[i].expected_option_2, "i:%d symbol->option_2 %d != %d (%d)\n", i, symbol->option_2, data[i].expected_option_2, data[i].option_2);
		if (data[i].option_3 != -1) {
			assert_equal(symbol->option_3, data[i].option_3, "i:%d symbol->option_3 %d != %d\n", i, symbol->option_3, data[i].option_3); // Unchanged
		} else {
			assert_zero(symbol->option_3, "i:%d symbol->option_3 %d != 0\n", i, symbol->option_3);
		}

		assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows);
		assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width);

        if (data[i].compare_previous != -1) {
            ret = testUtilSymbolCmp(symbol, &previous_symbol);
            assert_equal(!ret, !data[i].compare_previous, "i:%d testUtilSymbolCmp !ret %d != %d\n", i, ret, data[i].compare_previous);
        }
        memcpy(&previous_symbol, symbol, sizeof(previous_symbol));

        if (data[i].ret_vector != -1) {
            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_pdf417_encode(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int option_1;
        int option_2;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        char* expected;
    };
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "PDF417 Symbology Standard", 2, 2, 0, 13, 103, "ISO 15438:2015 Figure 1 **NOT SAME** TODO: investigate",
                    "1111111101010100011110101001111000101011000110000001000011000110010011110101011110000111111101000101001"
                    "1111111101010100011111010100011000110110000011110101101000011100010011111101010011100111111101000101001"
                    "1111111101010100011101010111111000111010000111110101011001101111000011010100011111000111111101000101001"
                    "1111111101010100011111010111111010100000100010100001000001001000001010101111001111000111111101000101001"
                    "1111111101010100011010111000010000111001000110010001111001000001010011101011100011000111111101000101001"
                    "1111111101010100011110101111010000101110001000110001001111000010100011110101111000010111111101000101001"
                    "1111111101010100011010011100111100110000010010011001011100011101000011010011101111000111111101000101001"
                    "1111111101010100011110100101000000111111011000101101111010110011000010101111110011100111111101000101001"
                    "1111111101010100011010011011111100111110100001110101100011111001001010100110001111100111111101000101001"
                    "1111111101010100010100011101110000110110111100111101101100100100000011010001100011100111111101000101001"
                    "1111111101010100011010011100010000111000000101101001101101111100110011101001110011000111111101000101001"
                    "1111111101010100010100010001111000101010000111100001011111100011101010100011011111000111111101000101001"
                    "1111111101010100010100000101000000110000101011000001001000110000110010100001100000110111111101000101001"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_PDF417;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_PDF417_ENCODE_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %d, %d, %s, %d, %d, \"%s\",\n",
                i, testUtilInputModeName(data[i].input_mode), data[i].data, data[i].option_1, data[i].option_2, testUtilErrorName(data[i].ret),
                symbol->rows, symbol->width, data[i].comment);
        testUtilModulesDump(symbol, "                    ", "\n");
        printf("               },\n");
        #else
        if (ret < 5) {
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);

            if (ret == 0) {
                int width, row;
                ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
                assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);
            }
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_pdf417_options();
    test_pdf417_encode();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_postal.c.














































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

static void test_koreapost(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int ret_encode;
        int ret_vector;

        int expected_height;
        int expected_rows;
        int expected_width;
    };
    struct item data[] = {
        /* 0*/ { "123456", 0, 0, 50, 1, 167 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_KOREAPOST;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret_encode);

        if (data[i].ret_vector != -1) {
            assert_equal(symbol->height, data[i].expected_height, "i:%d symbol->height %d != %d\n", i, symbol->height, data[i].expected_height);
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width);

            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_japanpost(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int ret_encode;
        int ret_vector;

        int expected_height;
        int expected_rows;
        int expected_width;
        char* comment;
    };
    struct item data[] = {
        /* 0*/ { "123", 0, 0, 8, 3, 133, "Check 3" },
        /* 1*/ { "123456-AB", 0, 0, 8, 3, 133, "Check 10" },
        /* 2*/ { "123456", 0, 0, 8, 3, 133, "Check 11" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_JAPANPOST;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret_encode);

        if (data[i].ret_vector != -1) {
            assert_equal(symbol->height, data[i].expected_height, "i:%d symbol->height %d != %d\n", i, symbol->height, data[i].expected_height);
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width);

            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_koreapost();
    test_japanpost();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_qr.c.
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

//#define TEST_QR_INPUT_GENERATE_EXPECTED 1
//#define TEST_QR_GS1_GENERATE_EXPECTED 1
//#define TEST_QR_OPTIMIZE_GENERATE_EXPECTED 1
//#define TEST_QR_ENCODE_GENERATE_EXPECTED 1
//#define TEST_MICROQR_INPUT_GENERATE_EXPECTED 1
//#define TEST_MICROQR_PADDING_GENERATE_EXPECTED 1
//#define TEST_MICROQR_OPTIMIZE_GENERATE_EXPECTED 1
//#define TEST_MICROQR_ENCODE_GENERATE_EXPECTED 1
//#define TEST_UPNQR_INPUT_GENERATE_EXPECTED 1
//#define TEST_UPNQR_ENCODE_GENERATE_EXPECTED 1
//#define TEST_RMQR_INPUT_GENERATE_EXPECTED 1
//#define TEST_RMQR_GS1_GENERATE_EXPECTED 1
//#define TEST_RMQR_OPTIMIZE_GENERATE_EXPECTED 1
//#define TEST_RMQR_ENCODE_GENERATE_EXPECTED 1

static void test_qr_options(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int option_1;
        int option_2;
        int ret_encode;
        int ret_vector;
        int expected_size;
        int compare_previous;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "12345", -1, -1, 0, 0, 21, -1 }, // ECC auto-set to 1 (L), version auto-set to 1
        /*  1*/ { "12345", 5, -1, 0, 0, 21, 0 }, // ECC > 4 ignored
        /*  2*/ { "12345", -1, 41, 0, 0, 21, 0 }, // Version > 40 ignored
        /*  3*/ { "12345", -1, 2, 0, 0, 25, -1 }, // ECC auto-set to 4 (Q), version 2
        /*  4*/ { "12345", 4, 2, 0, 0, 25, 0 }, // ECC 4 (Q), version 2
        /*  5*/ { "12345", 1, 2, 0, 0, 25, 1 }, // ECC 1 (L), version 2
        /*  6*/ { "貫やãè­˜ç¦", -1, -1, 0, 0, 21, -1 }, // ECC auto-set to 1 (L), version auto-set to 1
        /*  7*/ { "貫やãè­˜ç¦", 1, -1, 0, 0, 21, 0 }, // Version auto-set to 1
        /*  8*/ { "貫やãè­˜ç¦", -1, 1, 0, 0, 21, 0 }, // ECC auto-set to 1 (L)
        /*  9*/ { "貫やãè­˜ç¦", 1, 1, 0, 0, 21, 0 },
        /* 10*/ { "貫やãè­˜ç¦", 2, 1, ZINT_ERROR_TOO_LONG, -1, 0, -1 }, // ECC 2 (M), version 1
        /* 11*/ { "貫やãè­˜ç¦", 2, -1, 0, 0, 25, -1 }, // Version auto-set to 2
        /* 12*/ { "貫やãè­˜ç¦", 2, 2, 0, 0, 25, 0 },
        /* 13*/ { "貫やãè­˜ç¦", 1, 2, 0, 0, 25, 1 },
        /* 14*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£", -1, -1, 0, 0, 29, -1 }, // ECC auto-set to 1 (L), version auto-set to 3
        /* 15*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£", 1, 3, 0, 0, 29, 0 },
        /* 16*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£", 2, -1, 0, 0, 33, -1 }, // ECC 2 (M), version auto-set to 4
        /* 17*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£", 2, 4, 0, 0, 33, 0 },
        /* 18*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£", 3, -1, 0, 0, 37, -1 }, // ECC 3 (Q), version auto-set to 5
        /* 19*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£", 3, 5, 0, 0, 37, 0 },
        /* 20*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£", 4, -1, 0, 0, 41, -1 }, // ECC 4 (H), version auto-set to 6
        /* 21*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£", 4, 6, 0, 0, 41, 0 },
        /* 22*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿã¯ã‚‡ãŒæ„è¦‹æƒ³ãƒæ¥­ç‹¬æ¡ˆãƒ¦ãƒ²ã‚¦æ‚£è·ãƒ²å¹³ç¾Žã•毎放ã©ã½ãŸã‘家没ã¹ãŠåŒ–富ã¹ç”ºå¤§ã‚·æƒ…魚ッã§ã‚Œä¸€å†¬ã™ã¼ã‚り。", -1, -1, 0, 0, 69, -1 }, // ECC auto-set to 1, version auto-set to 13
        /* 23*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿã¯ã‚‡ãŒæ„è¦‹æƒ³ãƒæ¥­ç‹¬æ¡ˆãƒ¦ãƒ²ã‚¦æ‚£è·ãƒ²å¹³ç¾Žã•毎放ã©ã½ãŸã‘家没ã¹ãŠåŒ–富ã¹ç”ºå¤§ã‚·æƒ…魚ッã§ã‚Œä¸€å†¬ã™ã¼ã‚り。", 1, 13, 0, 0, 69, 0 },
        /* 24*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿã¯ã‚‡ãŒæ„è¦‹æƒ³ãƒæ¥­ç‹¬æ¡ˆãƒ¦ãƒ²ã‚¦æ‚£è·ãƒ²å¹³ç¾Žã•毎放ã©ã½ãŸã‘家没ã¹ãŠåŒ–富ã¹ç”ºå¤§ã‚·æƒ…魚ッã§ã‚Œä¸€å†¬ã™ã¼ã‚り。", 4, -1, 0, 0, 101, -1 }, // ECC 4, version auto-set to 21
        /* 25*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿã¯ã‚‡ãŒæ„è¦‹æƒ³ãƒæ¥­ç‹¬æ¡ˆãƒ¦ãƒ²ã‚¦æ‚£è·ãƒ²å¹³ç¾Žã•毎放ã©ã½ãŸã‘家没ã¹ãŠåŒ–富ã¹ç”ºå¤§ã‚·æƒ…魚ッã§ã‚Œä¸€å†¬ã™ã¼ã‚り。", 4, 21, 0, 0, 101, 0 },
        /* 26*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿã¯ã‚‡ãŒæ„è¦‹æƒ³ãƒæ¥­ç‹¬æ¡ˆãƒ¦ãƒ²ã‚¦æ‚£è·ãƒ²å¹³ç¾Žã•毎放ã©ã½ãŸã‘家没ã¹ãŠåŒ–富ã¹ç”ºå¤§ã‚·æƒ…魚ッã§ã‚Œä¸€å†¬ã™ã¼ã‚り。社トå¯åŒ–モマ試音ã°ã˜ã”育é’康演ã´ãŽæ¨©åž‹å›ºã‚¹ã§èƒ½éº©ãœã‚‰ã‚‚ã»æ²³éƒ½ã—ã¡ã»ãƒ©åŽ90作ã®å¹´è¦ã¨ã ã‚€éƒ¨å‹•ã¾è€…æ–­ãƒç¬¬41一1米索焦茂ã’ã‚€ã—れ。測フ物使ã ã¦ç›®æœˆå›½ã‚¹ãƒªã‚«ãƒå¤æ¤œã«ã„ã¸å…72告物ゆã¯è¼‰æ ¸ãƒ­ã‚¢ãƒ¡ãƒ±ç™»è¼¸ã©ã¹ã‚ƒå‚¬è¡Œã‚¢ãƒ•エãƒè­°æ­Œãƒ¯æ²³å€«å‰–ã ã€‚記タケウ因載ヒイホヤç¦3輩彦関トãˆã³è‚区å‹ãƒ¯ãƒªãƒ­æˆç¦ã¼ã‚ˆç•Œç™½ã‚¦ãƒ’キレ中島ã¹ã›ãœã„å„安ã†ã—ã½ãƒªè¦§ç”Ÿãƒ†åŸºä¸€ã§ã‚€ã—ゃ中新トヒキソ声ç¢ã‚¹ã—ã³èµ·ç”°ã‚¢ä¿¡å¤§æœªã‚…ã‚‚ã°ã¡ã€‚", -1, -1, 0, 0, 105, -1 }, // ECC auto-set to 1, version auto-set to 22
        /* 27*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿã¯ã‚‡ãŒæ„è¦‹æƒ³ãƒæ¥­ç‹¬æ¡ˆãƒ¦ãƒ²ã‚¦æ‚£è·ãƒ²å¹³ç¾Žã•毎放ã©ã½ãŸã‘家没ã¹ãŠåŒ–富ã¹ç”ºå¤§ã‚·æƒ…魚ッã§ã‚Œä¸€å†¬ã™ã¼ã‚り。社トå¯åŒ–モマ試音ã°ã˜ã”育é’康演ã´ãŽæ¨©åž‹å›ºã‚¹ã§èƒ½éº©ãœã‚‰ã‚‚ã»æ²³éƒ½ã—ã¡ã»ãƒ©åŽ90作ã®å¹´è¦ã¨ã ã‚€éƒ¨å‹•ã¾è€…æ–­ãƒç¬¬41一1米索焦茂ã’ã‚€ã—れ。測フ物使ã ã¦ç›®æœˆå›½ã‚¹ãƒªã‚«ãƒå¤æ¤œã«ã„ã¸å…72告物ゆã¯è¼‰æ ¸ãƒ­ã‚¢ãƒ¡ãƒ±ç™»è¼¸ã©ã¹ã‚ƒå‚¬è¡Œã‚¢ãƒ•エãƒè­°æ­Œãƒ¯æ²³å€«å‰–ã ã€‚記タケウ因載ヒイホヤç¦3輩彦関トãˆã³è‚区å‹ãƒ¯ãƒªãƒ­æˆç¦ã¼ã‚ˆç•Œç™½ã‚¦ãƒ’キレ中島ã¹ã›ãœã„å„安ã†ã—ã½ãƒªè¦§ç”Ÿãƒ†åŸºä¸€ã§ã‚€ã—ゃ中新トヒキソ声ç¢ã‚¹ã—ã³èµ·ç”°ã‚¢ä¿¡å¤§æœªã‚…ã‚‚ã°ã¡ã€‚", 1, 22, 0, 0, 105, 0 },
        /* 28*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿã¯ã‚‡ãŒæ„è¦‹æƒ³ãƒæ¥­ç‹¬æ¡ˆãƒ¦ãƒ²ã‚¦æ‚£è·ãƒ²å¹³ç¾Žã•毎放ã©ã½ãŸã‘家没ã¹ãŠåŒ–富ã¹ç”ºå¤§ã‚·æƒ…魚ッã§ã‚Œä¸€å†¬ã™ã¼ã‚り。社トå¯åŒ–モマ試音ã°ã˜ã”育é’康演ã´ãŽæ¨©åž‹å›ºã‚¹ã§èƒ½éº©ãœã‚‰ã‚‚ã»æ²³éƒ½ã—ã¡ã»ãƒ©åŽ90作ã®å¹´è¦ã¨ã ã‚€éƒ¨å‹•ã¾è€…æ–­ãƒç¬¬41一1米索焦茂ã’ã‚€ã—れ。測フ物使ã ã¦ç›®æœˆå›½ã‚¹ãƒªã‚«ãƒå¤æ¤œã«ã„ã¸å…72告物ゆã¯è¼‰æ ¸ãƒ­ã‚¢ãƒ¡ãƒ±ç™»è¼¸ã©ã¹ã‚ƒå‚¬è¡Œã‚¢ãƒ•エãƒè­°æ­Œãƒ¯æ²³å€«å‰–ã ã€‚記タケウ因載ヒイホヤç¦3輩彦関トãˆã³è‚区å‹ãƒ¯ãƒªãƒ­æˆç¦ã¼ã‚ˆç•Œç™½ã‚¦ãƒ’キレ中島ã¹ã›ãœã„å„安ã†ã—ã½ãƒªè¦§ç”Ÿãƒ†åŸºä¸€ã§ã‚€ã—ゃ中新トヒキソ声ç¢ã‚¹ã—ã³èµ·ç”°ã‚¢ä¿¡å¤§æœªã‚…ã‚‚ã°ã¡ã€‚", 4, -1, 0, 0, 153, 1 }, // ECC 4, version auto-set 34
        /* 29*/ { "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿã¯ã‚‡ãŒæ„è¦‹æƒ³ãƒæ¥­ç‹¬æ¡ˆãƒ¦ãƒ²ã‚¦æ‚£è·ãƒ²å¹³ç¾Žã•毎放ã©ã½ãŸã‘家没ã¹ãŠåŒ–富ã¹ç”ºå¤§ã‚·æƒ…魚ッã§ã‚Œä¸€å†¬ã™ã¼ã‚り。社トå¯åŒ–モマ試音ã°ã˜ã”育é’康演ã´ãŽæ¨©åž‹å›ºã‚¹ã§èƒ½éº©ãœã‚‰ã‚‚ã»æ²³éƒ½ã—ã¡ã»ãƒ©åŽ90作ã®å¹´è¦ã¨ã ã‚€éƒ¨å‹•ã¾è€…æ–­ãƒç¬¬41一1米索焦茂ã’ã‚€ã—れ。測フ物使ã ã¦ç›®æœˆå›½ã‚¹ãƒªã‚«ãƒå¤æ¤œã«ã„ã¸å…72告物ゆã¯è¼‰æ ¸ãƒ­ã‚¢ãƒ¡ãƒ±ç™»è¼¸ã©ã¹ã‚ƒå‚¬è¡Œã‚¢ãƒ•エãƒè­°æ­Œãƒ¯æ²³å€«å‰–ã ã€‚記タケウ因載ヒイホヤç¦3輩彦関トãˆã³è‚区å‹ãƒ¯ãƒªãƒ­æˆç¦ã¼ã‚ˆç•Œç™½ã‚¦ãƒ’キレ中島ã¹ã›ãœã„å„安ã†ã—ã½ãƒªè¦§ç”Ÿãƒ†åŸºä¸€ã§ã‚€ã—ゃ中新トヒキソ声ç¢ã‚¹ã—ã³èµ·ç”°ã‚¢ä¿¡å¤§æœªã‚…ã‚‚ã°ã¡ã€‚", 4, 34, 0, 0, 153, 0 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    struct zint_symbol previous_symbol;

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_QRCODE;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt);
        if (data[i].compare_previous != -1) {
            ret = testUtilSymbolCmp(symbol, &previous_symbol);
            assert_equal(!ret, !data[i].compare_previous, "i:%d testUtilSymbolCmp !ret %d != %d\n", i, ret, data[i].compare_previous);
        }
        memcpy(&previous_symbol, symbol, sizeof(previous_symbol));

        if (data[i].ret_vector != -1) {
            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
            assert_equal(symbol->width, data[i].expected_size, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_size);
            assert_equal(symbol->rows, data[i].expected_size, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_size);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_qr_input(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        int eci;
        unsigned char* data;
        int ret;
        int expected_eci;
        char* expected;
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, not in Shift JIS, UTF-8 C3A9
    // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in Shift JIS 0x83C0, UTF-8 CEB2
    // ภU+0E01 in ISO 8859-11 Thai (but not other ISO 8859 or Win page), not in Shift JIS, UTF-8 E0B881
    // Ж U+0416 in ISO 8859-5 Cyrillic (but not other ISO 8859), Win 1251, in Shift JIS 0x8447, UTF-8 D096
    // ຠU+0E81 Lao not in any ISO 8859 (or Win page) or Shift JIS, UTF-8 E0BA81
    // ¥ U+00A5 in ISO 8859-1 0xA5 (\245), in Shift JIS single-byte 0x5C (\134) (backslash); 0xA5 same codepoint as single-byte half-width katakana ・ (U+FF65) in Shift JIS (below), UTF-8 C2A5
    // ï½¥ U+FF65 half-width katakana, not in ISO/Win, in Shift JIS single-byte 0xA5 (\245), UTF-8 EFBDA5
    // ¿ U+00BF in ISO 8859-1 0xBF (\277), not in Shift JIS; 0xBF same codepoint as single-byte half-width katakana ソ (U+FF7F) in Shift JIS (below), UTF-8 C2BF
    // ソ U+FF7F half-width katakana, not in ISO/Win, in Shift JIS single-byte 0xBF (\277), UTF-8 EFBDBF
    // ‾ U+203E overline, not in ISO/Win, in Shift JIS single-byte 0x7E (\176) (tilde), UTF-8 E280BE
    // 点 U+70B9 kanji, in Shift JIS 0x935F (\223\137), UTF-8 E782B9
    // 茗 U+8317 kanji, in Shift JIS 0xE4AA (\344\252), UTF-8 E88C97
    // テ U+30C6 katakana, in Shift JIS 0x8365 (\203\145), UTF-8 E38386
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, 0, "é", 0, 0, "40 1E 90 EC 11 EC 11 EC 11", "B1 (ISO 8859-1)" },
        /*  1*/ { UNICODE_MODE, 3, "é", 0, 3, "70 34 01 E9 00 EC 11 EC 11", "ECI-3 B1 (ISO 8859-1)" },
        /*  2*/ { UNICODE_MODE, 20, "é", ZINT_ERROR_INVALID_DATA, -1, "Error 800: Invalid character in input data", "é not in Shift JIS" },
        /*  3*/ { UNICODE_MODE, 26, "é", 0, 26, "71 A4 02 C3 A9 00 EC 11 EC", "ECI-26 B2 (UTF-8)" },
        /*  4*/ { DATA_MODE, 0, "é", 0, 0, "40 2C 3A 90 EC 11 EC 11 EC", "B2 (UTF-8)" },
        /*  5*/ { DATA_MODE, 0, "\351", 0, 0, "40 1E 90 EC 11 EC 11 EC 11", "B1 (ISO 8859-1)" },
        /*  6*/ { UNICODE_MODE, 0, "β", 0, 0, "80 11 00 00 EC 11 EC 11 EC", "K1 (Shift JIS)" },
        /*  7*/ { UNICODE_MODE, 9, "β", 0, 9, "70 94 01 E2 00 EC 11 EC 11", "ECI-9 B1 (ISO 8859-7)" },
        /*  8*/ { UNICODE_MODE, 20, "β", 0, 20, "71 48 01 10 00 00 EC 11 EC", "ECI-20 K1 (Shift JIS)" },
        /*  9*/ { UNICODE_MODE, 26, "β", 0, 26, "71 A4 02 CE B2 00 EC 11 EC", "ECI-26 B2 (UTF-8)" },
        /* 10*/ { DATA_MODE, 0, "β", 0, 0, "40 2C EB 20 EC 11 EC 11 EC", "B2 (UTF-8)" },
        /* 11*/ { UNICODE_MODE, 0, "à¸", ZINT_WARN_USES_ECI, 13, "Warning 70 D4 01 A1 00 EC 11 EC 11", "ECI-13 B1 (ISO 8859-11)" },
        /* 12*/ { UNICODE_MODE, 13, "à¸", 0, 13, "70 D4 01 A1 00 EC 11 EC 11", "ECI-13 B1 (ISO 8859-11)" },
        /* 13*/ { UNICODE_MODE, 20, "à¸", ZINT_ERROR_INVALID_DATA, -1, "Error 800: Invalid character in input data", "ภnot in Shift JIS" },
        /* 14*/ { UNICODE_MODE, 26, "à¸", 0, 26, "71 A4 03 E0 B8 81 00 EC 11", "ECI-26 B3 (UTF-8)" },
        /* 15*/ { DATA_MODE, 0, "à¸", 0, 0, "40 3E 0B 88 10 EC 11 EC 11", "B3 (UTF-8)" },
        /* 16*/ { UNICODE_MODE, 0, "Ж", 0, 0, "80 11 23 80 EC 11 EC 11 EC", "K1 (Shift JIS)" },
        /* 17*/ { UNICODE_MODE, 7, "Ж", 0, 7, "70 74 01 B6 00 EC 11 EC 11", "ECI-7 B1 (ISO 8859-5)" },
        /* 18*/ { UNICODE_MODE, 20, "Ж", 0, 20, "71 48 01 12 38 00 EC 11 EC", "ECI-20 K1 (Shift JIS)" },
        /* 19*/ { UNICODE_MODE, 26, "Ж", 0, 26, "71 A4 02 D0 96 00 EC 11 EC", "ECI-26 B2 (UTF-8)" },
        /* 20*/ { DATA_MODE, 0, "Ж", 0, 0, "40 2D 09 60 EC 11 EC 11 EC", "B2 (UTF-8)" },
        /* 21*/ { UNICODE_MODE, 0, "àº", ZINT_WARN_USES_ECI, 26, "Warning 71 A4 03 E0 BA 81 00 EC 11", "ECI-26 B3 (UTF-8)" },
        /* 22*/ { UNICODE_MODE, 20, "àº", ZINT_ERROR_INVALID_DATA, -1, "Error 800: Invalid character in input data", "ຠnot in Shift JIS" },
        /* 23*/ { UNICODE_MODE, 26, "àº", 0, 26, "71 A4 03 E0 BA 81 00 EC 11", "ECI-26 B3 (UTF-8)" },
        /* 24*/ { DATA_MODE, 0, "àº", 0, 0, "40 3E 0B A8 10 EC 11 EC 11", "B3 (UTF-8)" },
        /* 25*/ { UNICODE_MODE, 0, "\\", 0, 0, "40 15 C0 EC 11 EC 11 EC 11", "B1 (ASCII)" },
        /* 26*/ { UNICODE_MODE, 20, "\\", 0, 20, "71 48 01 00 F8 00 EC 11 EC", "ECI-20 K1 (Shift JIS)" },
        /* 27*/ { UNICODE_MODE, 20, "[", 0, 20, "71 44 01 5B 00 EC 11 EC 11", "B1 (ASCII)" },
        /* 28*/ { UNICODE_MODE, 20, "\177", 0, 20, "71 44 01 7F 00 EC 11 EC 11", "ECI-20 B1 (ASCII)" },
        /* 29*/ { UNICODE_MODE, 0, "Â¥", 0, 0, "40 1A 50 EC 11 EC 11 EC 11", "B1 (ISO 8859-1) (same bytes as ï½¥ Shift JIS below, so ambiguous)" },
        /* 30*/ { UNICODE_MODE, 3, "Â¥", 0, 3, "70 34 01 A5 00 EC 11 EC 11", "ECI-3 B1 (ISO 8859-1)" },
        /* 31*/ { UNICODE_MODE, 20, "Â¥", 0, 20, "71 44 01 5C 00 EC 11 EC 11", "ECI-20 B1 (Shift JIS) (to single-byte backslash codepoint 5C, so byte mode)" },
        /* 32*/ { UNICODE_MODE, 26, "Â¥", 0, 26, "71 A4 02 C2 A5 00 EC 11 EC", "ECI-26 B2 (UTF-8)" },
        /* 33*/ { DATA_MODE, 0, "Â¥", 0, 0, "40 2C 2A 50 EC 11 EC 11 EC", "B2 (UTF-8)" },
        /* 34*/ { UNICODE_MODE, 0, "・", 0, 0, "40 1A 50 EC 11 EC 11 EC 11", "B1 (Shift JIS) single-byte codepoint A5 (same bytes as ¥ ISO 8859-1 above, so ambiguous)" },
        /* 35*/ { UNICODE_MODE, 3, "ï½¥", ZINT_ERROR_INVALID_DATA, -1, "Error 575: Invalid characters in input data", "" },
        /* 36*/ { UNICODE_MODE, 20, "ï½¥", 0, 20, "71 44 01 A5 00 EC 11 EC 11", "ECI-20 B1 (Shift JIS) single-byte codepoint A5" },
        /* 37*/ { UNICODE_MODE, 26, "ï½¥", 0, 26, "71 A4 03 EF BD A5 00 EC 11", "ECI-26 B3 (UTF-8)" },
        /* 38*/ { DATA_MODE, 0, "ï½¥", 0, 0, "40 3E FB DA 50 EC 11 EC 11", "B3 (UTF-8)" },
        /* 39*/ { UNICODE_MODE, 0, "¿", 0, 0, "40 1B F0 EC 11 EC 11 EC 11", "B1 (ISO 8859-1) (same bytes as ソ Shift JIS below, so ambiguous)" },
        /* 40*/ { UNICODE_MODE, 3, "¿", 0, 3, "70 34 01 BF 00 EC 11 EC 11", "ECI-3 B1 (ISO 8859-1)" },
        /* 41*/ { UNICODE_MODE, 20, "¿", ZINT_ERROR_INVALID_DATA, -1, "Error 800: Invalid character in input data", "¿ not in Shift JIS" },
        /* 42*/ { UNICODE_MODE, 26, "¿", 0, 26, "71 A4 02 C2 BF 00 EC 11 EC", "ECI-26 B2 (UTF-8)" },
        /* 43*/ { DATA_MODE, 0, "¿", 0, 0, "40 2C 2B F0 EC 11 EC 11 EC", "B2 (UTF-8)" },
        /* 44*/ { UNICODE_MODE, 0, "ソ", 0, 0, "40 1B F0 EC 11 EC 11 EC 11", "B1 (Shift JIS) single-byte codepoint BF (same bytes as ¿ ISO 8859-1 above, so ambiguous)" },
        /* 45*/ { UNICODE_MODE, 3, "ソ", ZINT_ERROR_INVALID_DATA, -1, "Error 575: Invalid characters in input data", "" },
        /* 46*/ { UNICODE_MODE, 20, "ソ", 0, 20, "71 44 01 BF 00 EC 11 EC 11", "ECI-20 B1 (Shift JIS) single-byte codepoint BF" },
        /* 47*/ { UNICODE_MODE, 26, "ソ", 0, 26, "71 A4 03 EF BD BF 00 EC 11", "ECI-26 B3 (UTF-8)" },
        /* 48*/ { DATA_MODE, 0, "ソ", 0, 0, "40 3E FB DB F0 EC 11 EC 11", "B3 (UTF-8)" },
        /* 49*/ { UNICODE_MODE, 0, "~", 0, 0, "40 17 E0 EC 11 EC 11 EC 11", "B1 (ASCII) (same bytes as ‾ Shift JIS below, so ambiguous)" },
        /* 50*/ { UNICODE_MODE, 3, "~", 0, 3, "70 34 01 7E 00 EC 11 EC 11", "ECI-3 B1 (ASCII)" },
        /* 51*/ { UNICODE_MODE, 20, "~", ZINT_ERROR_INVALID_DATA, -1, "Error 800: Invalid character in input data", "tilde not in Shift JIS (codepoint used for overline)" },
        /* 52*/ { UNICODE_MODE, 0, "‾", 0, 0, "40 17 E0 EC 11 EC 11 EC 11", "B1 (Shift JIS) single-byte codepoint 7E (same bytes as ~ ASCII above, so ambiguous)" },
        /* 53*/ { UNICODE_MODE, 3, "‾", ZINT_ERROR_INVALID_DATA, -1, "Error 575: Invalid characters in input data", "" },
        /* 54*/ { UNICODE_MODE, 20, "‾", 0, 20, "71 44 01 7E 00 EC 11 EC 11", "ECI-20 B1 (Shift JIS) (to single-byte tilde codepoint 7E, so byte mode)" },
        /* 55*/ { UNICODE_MODE, 26, "‾", 0, 26, "71 A4 03 E2 80 BE 00 EC 11", "ECI-26 B3 (UTF-8)" },
        /* 56*/ { DATA_MODE, 0, "‾", 0, 0, "40 3E 28 0B E0 EC 11 EC 11", "B3 (UTF-8)" },
        /* 57*/ { UNICODE_MODE, 0, "点", 0, 0, "80 16 CF 80 EC 11 EC 11 EC", "K1 (Shift JIS)" },
        /* 58*/ { UNICODE_MODE, 3, "点", ZINT_ERROR_INVALID_DATA, -1, "Error 575: Invalid characters in input data", "" },
        /* 59*/ { UNICODE_MODE, 20, "点", 0, 20, "71 48 01 6C F8 00 EC 11 EC", "ECI-20 K1 (Shift JIS)" },
        /* 60*/ { UNICODE_MODE, 26, "点", 0, 26, "71 A4 03 E7 82 B9 00 EC 11", "ECI-26 B3 (UTF-8)" },
        /* 61*/ { DATA_MODE, 0, "点", 0, 0, "40 3E 78 2B 90 EC 11 EC 11", "B3 (UTF-8)" },
        /* 62*/ { DATA_MODE, 0, "\223\137", 0, 0, "80 16 CF 80 EC 11 EC 11 EC", "K1 (Shift JIS)" },
        /* 63*/ { UNICODE_MODE, 0, "¥・点", 0, 0, "40 45 CA 59 35 F0 EC 11 EC", "B4 (Shift JIS) (optimized to byte mode only)" },
        /* 64*/ { UNICODE_MODE, 3, "¥・点", ZINT_ERROR_INVALID_DATA, -1, "Error 575: Invalid characters in input data", "" },
        /* 65*/ { UNICODE_MODE, 20, "¥・点", 0, 20, "71 44 04 5C A5 93 5F 00 EC", "ECI-20 B4 (Shift JIS)" },
        /* 66*/ { UNICODE_MODE, 26, "¥・点", 0, 26, "71 A4 08 C2 A5 EF BD A5 E7 82 B9 00 EC", "ECI-26 B8 (UTF-8)" },
        /* 67*/ { DATA_MODE, 0, "\134\245\223\137", 0, 0, "40 45 CA 59 35 F0 EC 11 EC", "B8 (Shift JIS)" },
        /* 68*/ { DATA_MODE, 0, "¥・点", 0, 0, "40 8C 2A 5E FB DA 5E 78 2B 90 EC 11 EC", "B8 (UTF-8)" },
        /* 69*/ { UNICODE_MODE, 0, "点茗", 0, 0, "80 26 CF EA A8 00 EC 11 EC", "K2 (Shift JIS)" },
        /* 70*/ { UNICODE_MODE, 0, "点茗テ", 0, 0, "80 36 CF EA A8 34 A0 EC 11", "K3 (Shift JIS)" },
        /* 71*/ { UNICODE_MODE, 0, "点茗テ点", 0, 0, "80 46 CF EA A8 34 AD 9F 00", "K4 (Shift JIS)" },
        /* 72*/ { UNICODE_MODE, 0, "点茗テ点茗", 0, 0, "80 56 CF EA A8 34 AD 9F D5 50 00 EC 11", "K5 (Shift JIS)" },
        /* 73*/ { UNICODE_MODE, 0, "点茗テ点茗テ", 0, 0, "80 66 CF EA A8 34 AD 9F D5 50 69 40 EC", "K6 (Shift JIS)" },
        /* 74*/ { UNICODE_MODE, 0, "点茗テ点茗テソ", 0, 0, "80 66 CF EA A8 34 AD 9F D5 50 69 50 06 FC 00 EC", "K6 B1 (Shift JIS)" },
        /* 75*/ { DATA_MODE, 0, "\223\137\344\252\203\145\223\137\344\252\203\145\277", 0, 0, "80 66 CF EA A8 34 AD 9F D5 50 69 50 06 FC 00 EC", "K6 B1 (Shift JIS)" },
        /* 76*/ { DATA_MODE, 0, "点茗テ点茗テソ", 0, 0, "41 5E 78 2B 9E 88 C9 7E 38 38 6E 78 2B 9E 88 C9 7E 38 38 6E FB DB F0 EC 11 EC 11 EC", "B21 (UTF-8)" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_QRCODE;
        symbol->input_mode = data[i].input_mode;
        symbol->eci = data[i].eci;
        symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        #ifdef TEST_QR_INPUT_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, %d, \"%s\", %s, %d, \"%s\", \"%s\" },\n",
                i, testUtilInputModeName(data[i].input_mode), data[i].eci, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret),
                ret < 5 ? symbol->eci : -1, symbol->errtxt, data[i].comment);
        #else
        if (ret < 5) {

            assert_equal(symbol->eci, data[i].expected_eci, "i:%d eci %d != %d\n", i, symbol->eci, data[i].expected_eci);
            assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_qr_gs1(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int ret;
        char* expected;
        char* comment;
    };
    struct item data[] = {
        /*  0*/ { "[01]12345678901234", 0, "51 04 00 B3 AA 37 DE 87 B4", "N16" },
        /*  1*/ { "[01]04912345123459[15]970331[30]128[10]ABC123", 0, "51 07 40 A7 AC EA 80 15 9E 4F CA 52 D2 D3 84 09 D5 E0 28 FD 82 F0 C0 EC 11 EC 11 EC", "N29 A9" },
        /*  2*/ { "[91]12%[20]12", 0, "52 05 99 60 5F B5 35 80 01 08 00 EC 11", "A10(11)" },
        /*  3*/ { "[91]123%[20]12", 0, "52 06 19 60 5E 2B 76 A0 5A 05 E0 EC 11", "A11(12)" },
        /*  4*/ { "[91]1234%[20]12", 0, "52 06 99 60 5E 22 F6 A6 B0 00 21 00 EC", "A12(13)" },
        /*  5*/ { "[91]12345%[20]12", 0, "51 01 F8 F3 A9 48 0F B5 35 80 01 08 00", "N7 A6(7) (same bit count as A13(14))" },
        /*  6*/ { "[91]%%[20]12", 0, "52 05 99 6D A9 B5 35 80 01 08 00 EC 11", "A9(11)" },
        /*  7*/ { "[91]%%%[20]12", 0, "52 06 99 6D A9 B5 36 A6 B0 00 21 00 EC", "A10(13)" },
        /*  8*/ { "[91]A%%%%1234567890123AA%", 0, "52 05 99 63 D1 B5 36 A6 D4 98 40 D1 ED C8 C5 40 C3 20 21 CC DA 80", "A7(11) N13 A3(4)" },
        /*  9*/ { "[91]%23%%6789%%%34567%%%%234%%%%%", 0, "(34) 52 17 19 6D A8 17 76 A6 D4 22 A5 C7 6A 6D 4D A8 22 C7 39 61 DA 9B 53 6A 6B 01 17 B5", "A31(46)" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_QRCODE;
        symbol->input_mode = GS1_MODE;
        symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        #ifdef TEST_QR_GS1_GENERATE_EXPECTED
        printf("        /*%3d*/ { \"%s\", %s, \"%s\", \"%s\" },\n",
                i, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), symbol->errtxt, data[i].comment);
        #else
        if (ret < 5) {

            assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_qr_optimize(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int option_1;
        int ret;
        char* expected;
        char* comment;
    };
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "1", -1, 0, "10 04 40 EC 11 EC 11 EC 11", "N1" },
        /*  1*/ { UNICODE_MODE, "AAA", -1, 0, "20 19 CC 28 00 EC 11 EC 11", "A3" },
        /*  2*/ { UNICODE_MODE, "0123456789", -1, 0, "10 28 0C 56 6A 69 00 EC 11", " N10 (nayuki.io - pure numeric)" },
        /*  3*/ { UNICODE_MODE, "ABCDEF", -1, 0, "20 31 CD 45 2A 14 00 EC 11", "A6 (nayuki.io - pure alphanumeric)" },
        /*  4*/ { UNICODE_MODE, "wxyz", -1, 0, "40 47 77 87 97 A0 EC 11 EC", "B4 (nayuki.io - pure byte)" },
        /*  5*/ { UNICODE_MODE, "「魔法少女ã¾ã©ã‹â˜†ãƒžã‚®ã‚«ã€ã£ã¦ã€ã€€Ð˜ÐИ desu κα?", 1, 0, "(55) 81 D0 1A C0 09 F8 0A ED 56 B8 57 02 8E 12 90 2C 86 F4 31 A1 8A 01 B0 50 42 88 00 10", "K29 (nayuki.io - pure kanji)" },
        /*  6*/ { UNICODE_MODE, "012345A", -1, 0, "20 38 01 0B A2 E4 A0 EC 11", "A7 (nayuki.io - alpha/numeric)" },
        /*  7*/ { UNICODE_MODE, "0123456A", -1, 0, "10 1C 0C 56 58 80 25 00 EC", "N7 A1 (nayuki.io - alpha/numeric) (note same bits as A8)" },
        /*  8*/ { UNICODE_MODE, "012a", -1, 0, "40 43 03 13 26 10 EC 11 EC", "B4 (nayuki.io - numeric/byte)" },
        /*  9*/ { UNICODE_MODE, "0123a", -1, 0, "10 10 0C 34 01 61 00 EC 11", "N4 B1 (nayuki.io - numeric/byte)" },
        /* 10*/ { UNICODE_MODE, "ABCDEa", -1, 0, "40 64 14 24 34 44 56 10 EC", "B6 (nayuki.io - alphanumeric/byte)" },
        /* 11*/ { UNICODE_MODE, "ABCDEFa", -1, 0, "20 31 CD 45 2A 15 00 58 40", "A6 B1 (nayuki.io - alphanumeric/byte)" },
        /* 12*/ { UNICODE_MODE, "THE SQUARE ROOT OF 2 IS 1.41421356237309504880168872420969807856967187537694807317667973799", 1, 0, "(55) 20 D5 2A 53 54 1A A8 4C DC DF 14 29 EC 47 CA D9 9A 88 05 71 10 59 E3 56 32 5D 45 F0", " A26 N65 (nayuki.io - alpha/numeric)" },
        /* 13*/ { UNICODE_MODE, "Golden ratio φ = 1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374......", 1, 0, "(80) 41 44 76 F6 C6 46 56 E2 07 26 17 46 96 F2 08 3D 32 03 D2 03 12 E1 19 26 A0 87 DC BB", "B20 N100 A6 (nayuki.io - alpha/numeric/byte)" },
        /* 14*/ { UNICODE_MODE, "ã“ã‚“ã«ã¡waã€ä¸–ç•Œï¼ Î±Î²Î³Î´", 1, 0, "(34) 41 B8 2B 18 2F 18 2C 98 2B F7 76 18 14 19 0A 28 A4 58 14 92 08 3B F8 3C 08 3C 18 3C", "B27 (nayuki.io - kanji/european **NOT SAME** K4 B2 K4 A1 K4, less bits as nayuki (1.5.0) miscounting byte-mode input as UTF-8)" },
        /* 15*/ { UNICODE_MODE, "ã“ã‚“ã«ã¡ãƒ†waã€ä¸–ç•Œï¼ Î±Î²Î³Î´", 1, 0, "(34) 80 50 98 85 C4 29 21 3F 0D 2A 09 BB B0 C0 A0 C8 51 45 22 C0 A4 90 41 DF C1 E0 41 E0", "K5 B19 (nayuki.io - kanji/european + extra leading kanji **NOT SAME** K5 B2 K4 A1 K4, same reason as above)" },
        /* 16*/ { UNICODE_MODE, "67128177921547861663com.acme35584af52fa3-88d0-093b-6c14-b37ddafb59c528908608sg.com.dash.www0530329356521790265903SG.COM.NETS46968696003522G33250183309051017567088693441243693268766948304B2AE13344004SG.SGQR209710339366720B439682.63667470805057501195235502733744600368027857918629797829126902859SG8236HELLO FOO2517Singapore3272B815", 1, 0, "(232) 10 52 9F 46 70 B3 5D DE 9A 1F A1 7B 1B 7B 69 73 0B 1B 6B 29 99 A9 A9 C1 A3 0B 31 A9", "N20 B47 N9 B15 N22 A11 N14 A1 N47 A19 N15 A8 N65 A20 B8 A8 (nayuki.io - SGQR alpha/numeric/byte)" },
        /* 17*/ { UNICODE_MODE, "纪", -1, ZINT_WARN_USES_ECI, "Warning 71 A4 03 E7 BA AA 00 EC 11", "ECI-26 B3 (UTF-8 E7BAAA, U+7EAA, not in Shift JIS)" },
        /* 18*/ { DATA_MODE, "纪", -1, 0, "40 3E 7B AA A0 EC 11 EC 11", "B3 (UTF-8 or Shift JIS, note ambiguous as 0xE7BA 0xAA happens to be valid Shift JIS 郤ェ as well)" },
        /* 19*/ { UNICODE_MODE, "郤ェ", -1, 0, "40 3E 7B AA A0 EC 11 EC 11", "B3 (Shift JIS or UTF-8 E7BAAA 纪, see above)" },
        /* 20*/ { UNICODE_MODE, "2004年大西洋颶風季是有纪录以æ¥é€ æˆäººå‘˜ä¼¤äº¡å’Œè´¢äº§æŸå¤±æœ€ä¸ºæƒ¨é‡çš„大西洋飓风季之一,于2004å¹´6月1日正å¼å¼€å§‹ï¼ŒåŒå¹´11月30日结æŸï¼Œä¼ ç»Ÿä¸Šè¿™æ ·çš„æ—¥æœŸç•Œå®šäº†ä¸€å¹´ä¸­ç»å¤§å¤šæ•°çƒ­å¸¦æ°”旋在大西洋形æˆçš„æ—¶é—´æ®µlll ku", 1, ZINT_WARN_USES_ECI, "Warning (324) 71 A1 00 43 21 10 04 4B 96 E6 D3 96 92 9F A2 96 FF 9A D2 2F A6 8A DB A6 8A A3 96 B6", "ECI-26 N4 B274 (nayuki.io - kanji/byte/numeric **NOT SAME* N4 K9 B6 K5 etc mixing Shift JIS and UTF-8)" },
        /* 21*/ { UNICODE_MODE, "AB123456A", -1, 0, "20 49 CD 05 E2 2C 73 94 00", "A9" },
        /* 22*/ { UNICODE_MODE, "AB1234567890A", -1, 0, "20 69 CD 05 E2 2C 73 94 33 2A 50 00 EC", "A13" },
        /* 23*/ { UNICODE_MODE, "AB123456789012A", -1, 0, "20 79 CD 05 E2 2C 73 94 33 2A 0B CA 00", "A15" },
        /* 24*/ { UNICODE_MODE, "AB1234567890123A", -1, 0, "20 11 CD 10 34 7B 72 31 50 30 C8 02 50", "A2 N13 A1" },
        /* 25*/ { UNICODE_MODE, "テaABCD1", -1, 0, "40 88 36 56 14 14 24 34 43 10 EC 11 EC", "B8" },
        /* 26*/ { UNICODE_MODE, "テaABCDE1", -1, 0, "40 38 36 56 12 03 1C D4 52 9D C0 EC 11", "B3 A6" },
        /* 27*/ { UNICODE_MODE, "テéaABCDE1", -1, ZINT_WARN_USES_ECI, "Warning 71 A4 06 E3 83 86 C3 A9 61 20 31 CD 45 29 DC 00", "B6 A6" },
        /* 28*/ { UNICODE_MODE, "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£", -1, 0, "(44) 80 83 A8 85 88 25 CA 2F 40 B0 53 C2 44 98 41 00 4A 02 0E A8 F8 F5 0D 30 4C 35 A1 CC", "K8 N1 K8 B3" },
        /* 29*/ { UNICODE_MODE, "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿã¯ã‚‡ãŒæ„è¦‹æƒ³ãƒæ¥­ç‹¬æ¡ˆãƒ¦ãƒ²ã‚¦æ‚£è·ãƒ²å¹³ç¾Žã•毎放ã©ã½ãŸã‘家没ã¹ãŠåŒ–富ã¹ç”ºå¤§ã‚·æƒ…魚ッã§ã‚Œä¸€å†¬ã™ã¼ã‚り。社トå¯åŒ–モマ試音ã°ã˜ã”育é’康演ã´ãŽæ¨©åž‹å›ºã‚¹ã§èƒ½éº©ãœã‚‰ã‚‚ã»æ²³éƒ½ã—ã¡ã»ãƒ©åŽ90作ã®å¹´è¦ã¨ã ã‚€éƒ¨å‹•ã¾è€…æ–­ãƒç¬¬41一1米索焦茂ã’ã‚€ã—れ。測フ物使ã ã¦ç›®æœˆå›½ã‚¹ãƒªã‚«ãƒå¤æ¤œã«ã„ã¸å…72告物ゆã¯è¼‰æ ¸ãƒ­ã‚¢ãƒ¡ãƒ±ç™»è¼¸ã©ã¹ã‚ƒå‚¬è¡Œã‚¢ãƒ•エãƒè­°æ­Œãƒ¯æ²³å€«å‰–ã ã€‚記タケウ因載ヒイホヤç¦3輩彦関トãˆã³è‚区å‹ãƒ¯ãƒªãƒ­æˆç¦ã¼ã‚ˆç•Œç™½ã‚¦ãƒ’キレ中島ã¹ã›ãœã„å„安ã†ã—ã½ãƒªè¦§ç”Ÿãƒ†åŸºä¸€ã§ã‚€ã—ゃ中新トヒキソ声ç¢ã‚¹ã—ã³èµ·ç”°ã‚¢ä¿¡å¤§æœªã‚…ã‚‚ã°ã¡ã€‚", -1, 0, "(589) 80 20 EA 21 62 09 72 8B D0 2C 14 F0 91 26 10 40 04 A0 08 3A A3 E3 D4 34 C1 30 D6 87", "K8 N1 K8 N1 K10 N2 K33 N2 K16 N1 K89 N2 K14 B5 K28 N2 K40 N1 K65" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_QRCODE;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        symbol->debug = ZINT_DEBUG_TEST;

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        #ifdef TEST_QR_OPTIMIZE_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %d, %s, \"%s\", \"%s\" },\n",
                i, testUtilInputModeName(data[i].input_mode), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), data[i].option_1,
                testUtilErrorName(data[i].ret), symbol->errtxt, data[i].comment);
        #else
        assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_qr_encode(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int option_1;
        int option_2;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        char* expected;
    };
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "01234567", 2, 1, 0, 21, 21, "ISO 18004 Annex I I.2 **NOT SAME** uses mask 000 not 010; if force to use 010, same",
                    "111111100011101111111"
                    "100000101110001000001"
                    "101110100110001011101"
                    "101110100101101011101"
                    "101110101101101011101"
                    "100000100001001000001"
                    "111111101010101111111"
                    "000000000000000000000"
                    "101010100010100010010"
                    "110100001011010100010"
                    "000110111011011101110"
                    "110011010101110110010"
                    "001001110111011100001"
                    "000000001010001000010"
                    "111111100000100010001"
                    "100000100010001001011"
                    "101110101110101011101"
                    "101110100101010101110"
                    "101110101101011100101"
                    "100000100001110111000"
                    "111111101001011100101"
               },
        /*  1*/ { UNICODE_MODE, "12345678901234567890123456789012345678901", -1, -1, 0, 21, 21, "Max capacity ECC 1 Version 1 41 numbers",
                    "111111100011001111111"
                    "100000100001001000001"
                    "101110101110001011101"
                    "101110100001001011101"
                    "101110100011001011101"
                    "100000100100001000001"
                    "111111101010101111111"
                    "000000001100100000000"
                    "111011111000011000100"
                    "111000000110111000001"
                    "001001111011110001000"
                    "001110011011011111001"
                    "001100101000001000011"
                    "000000001101100001010"
                    "111111101011011001011"
                    "100000101100010001011"
                    "101110101101010111100"
                    "101110100000111000010"
                    "101110101001100011101"
                    "100000101010111011000"
                    "111111101000100010101"
               },
        /*  2*/ { UNICODE_MODE, "12345678901234567890123456789012345678901", 2, -1, 0, 25, 25, "ECC 2 auto-sets version 2",
                    "1111111010111111001111111"
                    "1000001001001110001000001"
                    "1011101001000001101011101"
                    "1011101010010001001011101"
                    "1011101010011010101011101"
                    "1000001010110000101000001"
                    "1111111010101010101111111"
                    "0000000010001101100000000"
                    "1000101111110100111111001"
                    "1001010011110111010110000"
                    "1100011011001001111100010"
                    "1000100101101010111101101"
                    "1001011100010110100111011"
                    "1111010110101001100101010"
                    "0001101010011111010110111"
                    "0001010000110100101011101"
                    "1100111100101101111110011"
                    "0000000011000111100010001"
                    "1111111010100000101010000"
                    "1000001001001010100011111"
                    "1011101011010110111111000"
                    "1011101001101000011011001"
                    "1011101001111111001010110"
                    "1000001001110101001011000"
                    "1111111011101101111101001"
               },
        /*  3*/ { UNICODE_MODE, "点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点", 4, 10, 0, 57, 57, "Max capacity ECC 4 Version 10 74 kanji",
                    "111111101100111011000010011000100111001001000011001111111"
                    "100000101111111001101100110100110101110011011101001000001"
                    "101110101011001110000011101100101110111011110011001011101"
                    "101110100011001100100010101101000000100111001001001011101"
                    "101110100010101101010001101111101111111001010101001011101"
                    "100000101111100000011000101000111010111011111110001000001"
                    "111111101010101010101010101010101010101010101010101111111"
                    "000000001101101001101010111000101011001011001011100000000"
                    "001110101001110001011101101111101000011110010001111100111"
                    "111000010100110111100000110100100100100011011111001010111"
                    "010101110001111101010100011111010101011011111010011011010"
                    "001100001100010011000100001010100000010011111001011011001"
                    "010011110000011110101000101010110010011010001111110010010"
                    "100111011011110001111001011000011100011001010001001001000"
                    "101000110100110100001111010110101111110110111011011111011"
                    "110010000010100100010011000001111100011011111101111101101"
                    "010110101010000000001010001010110110001100001011010010010"
                    "000100010110111010111001111111000100111011111011001110010"
                    "010101110011111000011101111110000001110111011110110001011"
                    "111011001011101111000111000010000011010110111011011011101"
                    "110100111001000100101110001110000110001001011011100100011"
                    "010000001001000100111101101010111010111011010000011011010"
                    "001010101100100110101110001110011101100110001111111110001"
                    "110000000010010101100110110001100001010001011111010111001"
                    "110111100101101010101111111110110010001010100011011001100"
                    "011000011000011010000010011010000110010011011000011010011"
                    "000011111001011000101110011111111001011001001111111111000"
                    "010110001010110111111010101000101101000111001110100010111"
                    "101110101000111000001101111010100010011001010011101011001"
                    "100110001011111111011001011000111100011011111101100010011"
                    "000111111010000101100111001111110111101010001011111111111"
                    "111010011010000011111011100111010110011110001111110111000"
                    "001011110011010001011000011101011000011011010001011111011"
                    "010001000000011001100100110111111010110011111011001001010"
                    "100100101101111101000110100000110000101100011011011011001"
                    "101000000010101010110110100000100100101010001011010010010"
                    "111011101011000000100001011101000111011001011010111111011"
                    "010111001001001010011100011010011101010110111111011011011"
                    "011001110100111111110110001110110110001001000010001011101"
                    "000100001111101001101110110100101011111100010101011100010"
                    "111101100111011000111001110100100110001011101011010011011"
                    "011100000010100110111111110001110111011111010010101001011"
                    "011100101000100110110101100111010010110001011111011111101"
                    "110000010000001100000001000111010111010001011011100000011"
                    "010001110100100101000001111101001111011011010000010101111"
                    "111110010100001100001111110010110111011110001111101011011"
                    "101001111101101110110110011000100011010011010011110110111"
                    "111110001011001011010011001100110100001001000011011001010"
                    "000000101000111000011000101111100011010011111000111111001"
                    "000000001100010001110100111000110000011010001111100011111"
                    "111111100011101101000011011010110100011001010001101011000"
                    "100000100001001011111100001000111010110011010010100011011"
                    "101110101110111101110110011111101000110011111101111111101"
                    "101110101110110100011011111000011110000100001010000000010"
                    "101110101101001111001011110010011001011011111011111011100"
                    "100000100010000001101111010001101010110110010001011111000"
                    "111111100000011111000100011011010011011001011011001011001"
               },
        /*  4*/ { UNICODE_MODE, "点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点", 4, 27, 0, 125, 125, "Max capacity ECC 4 Version 27 385 kanji",
                    "11111110101001001100111100100011110001010011110000001100010110100011101010111000011101101001011111001111101101101001101111111"
                    "10000010110001101110011001101111000101001011011001100110101000101010011110000000101000100101101110110000011110100110001000001"
                    "10111010100000000100000101000101111001011001010100100100100000000101100011010001100111101010010101101101101101101101001011101"
                    "10111010001100111011000110111100100000010101010111010010101000111001000001110000001100011101100001111100110000011000001011101"
                    "10111010010000100010110110100010111111110011001000011100100111111101110110001011001001101111111101100101001101101011001011101"
                    "10000010100100110000111100010111100010101111100000011100011010001100011100110110111111101000100111001111101001111111001000001"
                    "11111110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111"
                    "00000000111011101111001100100010100010100111111111100111011010001111000110000111001000111000101100110000011110100101100000000"
                    "00111010111100111100001111100100111110110101011011110011101011111110110110010100010111101111110101001101101101101101111100111"
                    "01010001001110001010011100111101111111010010000011001110010000110110000010011011001100000110101111111100110000011111010100100"
                    "01001011010111110101110001011100000100110001011100000001111001011100111000001001001101101001101111101111101111100000101111111"
                    "01001101011110100110000011010101111011000110001011001100001100100000100101101010011111111101111101001001101001111111101001000"
                    "11101011010000001011000000010000011011101110000010110000011111101011011101111011001000100100001100110000011110100000011110101"
                    "10100100011000101010111100001001010011100101101000100110010110101111000100000000110111111101101111001101101101101101101011101"
                    "00101111000111111110001110110110101011110111111111000001011010111111010010110101001100000110100001111110110100001110101100100"
                    "10100100100111101010111001110101110111001100100010100010011001000001000111011110001101101001111111101001101111100000100001111"
                    "00100111011001010100000010011101001110110001001011110011111000000100010001011001111111001111111101001001100001011101011111000"
                    "01001001000110000001110100000101100100100000100010111010010000110001101010000100001000100100001100110100011110100001111011101"
                    "01000011110000011000110011111010110110101101000111111101110100010011100000011011110111111101100101001011101011101100101101101"
                    "11011101001001011001010101110001000010111111010000011000001110110000101100100111001100000110111001111100110100001110100000100"
                    "00101111011110000000010110100100111000010000110000110101000000110100011100010110100101101001111111101001101001100101011111111"
                    "10000000100011100111101111111010111011011000011100011001111100011110010001101011011111001111101101001111100111011101111100000"
                    "01000010110100011000111111001011101101100101001011111100100001100101111110101011001000100101010010100101011110100001101011101"
                    "10010001110100100101110011111111111110011000101101000001000101001100011010001111010111111101101101001101101101101100110101101"
                    "01000110111000011111001000100000101100101111110010001110001011010010010111111001101101100110111000111100101001101011101000100"
                    "01110001111111110101100001111010001100000010110000100011001101001101100101001111100101101001100111101101101101000101111101111"
                    "10100010000110110010001011000001011101000011100001110110110001000011110110110000111101001110101101011000100110111100000100000"
                    "00001100000110110010011101000010001100000100001010001000011011010001110010011010101000100101001010100101011101100001101011101"
                    "10101110100000110101111000101010111101000000000011011000110000000110100001100111001111011101101101101101100101101101001101101"
                    "11011000111001110111001111011011001101110101001101110101011011111001010100101010001101100110101000111110101111001010101000101"
                    "10010111001010111101100110101011001000000000101011000110101101011001100001110111000011101000111101100001001100101101001101111"
                    "11111101101011111000100001100001111101000111101010101001010100010011100011111110011101001111001101011100100101011100011100000"
                    "01001111110111111101000000101100111111001010100110110011001111111101001011101111000000101111101011100101011011100001111111101"
                    "11101000110000111010100001011011100011000000110010011000011010001011111110010111001111001000100101101111100100001101100011010"
                    "11001010100101001110110100001100101010011111001000110110001110101110111011011111001101111010111000101001101111110010101010101"
                    "00111000101010110000101110101101100010101111100010101100111010001110000100110110000011101000101101111111001001101101100011111"
                    "11101111101111111100110011010001111111011010110000111001100011111110110011010001111100101111101100000100100111011111111110000"
                    "01111001001001110011100110110000001100111110101100001001101101010111101110100001100001011001100011101011011101100000101011101"
                    "11000011011111110000011000001011001000110001111001011000011001100000111110100101001101100101111101101101100101101100101101010"
                    "01111000001110010011000110011001101101001011001101000000111111101101011110011001001101111110100000111101101001010011000000101"
                    "01110111000001111000011001110000101001000011111011011100011010011111001010110100000011100001101101101111001111101101111101111"
                    "10010101101010110110000000010100101100001111010100011001010010010100001001101101111101101101110100001100100100111111101101101"
                    "01010010100001110011000010000101001100111111011011100011000111000000100000101111000000111000001111101101011101101000101111101"
                    "11001100111011000101111100100101100000010000100011010010100111110001110100010101001101100101101101101111100001001101100101010"
                    "10011011100101110010001000111011001100000010011101100010101111010001001100010011101101111111011000100101111101010101111000101"
                    "00101101101001000011101111001011010001110101111000001010111011111011011010110011000011000100101101111001001100101100100101011"
                    "11111010100000100111000001010111111000100101001001001010011110101101011010110111011100101101010000001100100101111111101001101"
                    "01000001001110011000110000001010110111100011010010110010110101111101110101111001000001101000001111110111011100001001010111101"
                    "10100010011011000110000101000101100010100000000000110111100101000101100101110010111101100101100101001111101111001110101101010"
                    "10101100001100010010001000111101101111000111100010000010111111000000101010001111001101011010111000111001111000110101101000101"
                    "01011111100111101101111111010110000101100010101111011111111111000001101101000110000110100101001111111101101101001100000111011"
                    "10110001100010010001011111110000000011011010000111001010111100001010000010110110011101001101010000000010100011111111101001101"
                    "11100011100101110101110111010010010100010000010110010101100101001100011011111010001001101001101111101111001100001000101111101"
                    "01010100001001111100100100101000010011011111100010001010110010000001110001011101011100000100100101011001101001101111100100100"
                    "01100111110000010010010111100110010001001101000010000000001001110000000100100101001011111011111100111110011001100101001100001"
                    "01111101001000111110011001000000100001010111011100000100000101101001111100010001000101100101001111100101101110101101111110011"
                    "01110110000101110101001100110111010110000001001000010001001001011001000000110010001001001101101001101010110101111110101001001"
                    "01000001100000101010110100110110100001101111011010111001000011110011110110101100101111101001101111101101001001101001100111111"
                    "11100011000100100100110100011011111110100111111111001101011111101100011100110010111101101101000101011101101001011111001101100"
                    "11011101101010001101000110100000110000100001100111101110011101101111000000000010110011011011111100101000011110100101101100101"
                    "10001111110101110110000011111001111110111101001100001000101111111010110101010110111101101111100111001101101100101101111111111"
                    "01101000101110101100010100110011100011001100001101010000110010001000000000011110111000111000101001110010110101111111100011100"
                    "01111010110111000101111011011001101010100111010101111111111010101110111001001111001101101010101111101101101001000001101011011"
                    "01101000110110110001111111010010100011001100011101001000101010001100100101001000110101001000100101000101101100111111100010100"
                    "11111111110000011110001010001011111111111000011010000101011011111001011100011011010011001111111100111000011100100001111111101"
                    "10110001101000101000010011101000011111100111110010100011010001111111000011000010010100111101100111000101101011101100111111101"
                    "00100010111111100000101101110111001011101101110101000010111010011011010000110000011001100110001001110010110000001111101001000"
                    "10100000000111101111111111010111001001001000101000111010111011101011000101011100000100001001101111101101101101100001110110111"
                    "00000111100001000100111000101100010100110111001100111011111110110100010111011000000101011101000101011111100100111101001101000"
                    "01100101010110000111010100100100011000100110100110101101010110001011101011100110111010100010111100100000011011000001101101101"
                    "01100011000000011011101000011001010000100001000111110011001001111111100001100010100101011101000101000101101101101100111110001"
                    "11010101011001001111010000101000100110110101010000010000110001110010101010100111111001100111101001101010110001101111101001100"
                    "00000110011110010110110110000001111100011010110001011111000010100010011001101111010100001001101111111101101101100100110111111"
                    "10000000100011111010001011010111010011000010011000111000000111100110010000010011000101101100100101001111100101111101001101000"
                    "01010111111100000011100101000111101011100110001100001110101001110001111011110011100111100101011010100001011110100001101101101"
                    "10100101111100111001000011001010100010000001101001111111010110001000011001011111100100111101100101001101101101101100111101101"
                    "01011110111000011000001111001001001010111100010011000110011001101010010011001000101001100111111000101100101000001011001001000"
                    "01100100011111110101001101001110101110011110110100100011010010010111100000010110001101101000101111100101101101100100110111101"
                    "10101110110000100001110011011110111111000100100111100010100100000101110010001001110001001111100101001110100001111101001100101"
                    "00001000111100100001101100111011100100010100001110000000011100110101110111010010111110100101111010101001011110100001100011110"
                    "10110111101110110001111000011001100001001110100111001010100100010000100000000110110100111101101100110111100101101101111101001"
                    "11011101001101100101101110111000100001110100001001111101010110110011010111000011010001100111111001101100101000001011001001000"
                    "10001111100110100010000111100000011100001100001010001110110000110001100101110110010111001001001101001101001111101100110110111"
                    "11111001010001111001100001001111010011001111001000011001010110011101100101011110001000101110100100101110100001111101001101100"
                    "01000011011111100011000000011010010111000101100000111011001101100101001001101111110110100101101010110001011110100001100010001"
                    "11010001111100110000000001000000110001001000010001001000010111010111111111000110011101101100001101101111100101101101111101001"
                    "11010111001011001000010101101101011100000000101010101110001001000010011100101111011100001111111000011101101100010011001000111"
                    "00111001100000111000001110111011011100110001000001101100100001001101100011110110010111110000101101101101001111101100101101000"
                    "11101111111111110100110010001111111111010101010111010001111011111101110110000001111001001111110100101110100001011111111111101"
                    "01101000111101111110100110011011100010110111001101100001110110001000001001010001111110101000101011010001011110100000100010001"
                    "11001010111111100011111001010110101010110011011000011000010110101110011010111101000101101010101101101111100101100101101011111"
                    "01111000100110000000100111100111100011000100101100000000111110001011011011101001010100011000111001111101101100001011100011101"
                    "01101111111001100001111001011000111111000100011011011100000111111001001000111100001111111111101101101101001111111101111110101"
                    "10000101111000100001100001011111110010011111110101100001011011001101101100010101111001001111110101101110100001001111101101101"
                    "01100011110001110111000010100110010100100100011011000011000111000101000110010111001110111100001110100001011110100000000011101"
                    "11001000001011000011111100001101011110010010100010011010111000000101110101111101000101101101101101101111100101101101111101000"
                    "10000110101011110011101000000011110110000011011101001010110001111000001001110011100101100110111001111001101101101100100000111"
                    "00011100101111000101101110101010111111101110111000010010101011001111011110100011010111101001101101001101000111100101101100101"
                    "11001111000100100111100001110110110010111010101001100010011110001110011101000111010001011111110000111110111001001111101101110"
                    "01000000101100011010010000000011011001110001010010110010101001001101110111100001010110101000001111100001000110101001000011001"
                    "10011110100111000111100100110101111000100101100001101111111111111101000001011010110101000101100101101101101101010111111100111"
                    "10000000100100010010001001110101001001010111100011011010101111110110001100110111011101101110111001011001110101101100100000111"
                    "01000111001101101111111110101111001101110010001111110111101110000010101101110110010101101001101110100101101101100101001101100"
                    "10010101100000010010011111000001111011001111000110011010100010011110100011000110010001001101110001011110101001011110101100001"
                    "11010010101111110111110110000010111010000000010111110101111111001001011011111010001110101000001111100101000110100001000111111"
                    "01011100111111111111100100111001101111001110100010010010100011101010010000100101010101001101100100001101101101001111111101011"
                    "01101011111100010110010111000111101111001110000011101000000111010011100100011101010011110110111101101001101011101100100000100"
                    "01011101110110111110011001100000001101010011011100110100010011100011011100000001001101101101101111100100100101111101001101101"
                    "00011010111011110000001100010110011111100011101001110001010000101010100000101010001001000001101001011011101001000110101000001"
                    "00000001001110101010110100100110011001101010011011010001000111101111010111010100101110111101001111100101111110101001000111111"
                    "01100010001100100000110100010010001000100010011110101101001001011010111100001010110101000111100101101101101101001111111101001"
                    "00001100011010001100000110101000001110000111000110000110000101010100100001111010100011100110111101001001100011111101100000101"
                    "10001111110101110010100010111000101001111101001100111000111111011100100101000110110101101001100111100101000101101111011111110"
                    "10010001100110101111010100010011010111001111101100110000110100001011010000100110101001011100101000111010111001001000101001101"
                    "01001111100001000001011011100000110111100101010100111111100101001111110001101111010100100011001111100101101100101111000111100"
                    "10101100000010110111011110011011101101001101011100000000111110000111000101100000110101000111100101001100010101001101111101011"
                    "10000011101010011111101011011010111111011010111010101101011011111010110101010011000010101111111101001001100010100011111110100"
                    "00000000110110101010110010111001100011100101110011010011000010001000000010110010011101101000100110100100111101111101100011010"
                    "11111110011101100111101101110111101011001010010101011010100110101101101001001000011001011010101001111010100001001101101011101"
                    "10000010001001101110011110000111100011001110101001010010110110001011000100001100001100101000101110000101001100110000100011111"
                    "10111010101110000011111001100101111110110000001101110011100111111101101110100000010101101111100101001111110101101100111111000"
                    "10111010100101000001110101011100111010000000000110000101010011110001010010011110111010101000111100101000101010111101101100100"
                    "10111010101000111001001000010000000000000111000110100011000101101001010000100010101101111111000001001100101101111110111111010"
                    "10000010010111001111010001100001010001010110110001100000111101011100000010010111101001001100101101111011011001000001101001110"
                    "11111110000000010001110110000001010111011111000000111111010101110100101000110111000101101011001100000101101101101001100111111"
        },
        /*  5*/ { UNICODE_MODE, "点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点点", 4, 40, 0, 177, 177, "Max capacity ECC 4 Version 40 784 kanji",
                    "111111101010001111111101101110111010110111001110101000010001011011011101001110110011111011010000010101001010011110010000010110111111001001011111101000010010111111001010001111111"
                    "100000101010110001001000101111011001001100100110110000000111110101111011110001101110000111000100101111010011001111100111111001001011011011110011011111111001000010010010101000001"
                    "101110101001001101111001110010010100000000111001001011111000001001111111101010000111011010011010010001111010111001100011000011110100101110001010110001011110011011011010001011101"
                    "101110100011110010000001101101010011100111111111001101100000101100100000111110101110000010101000000010000100011001100001011010011011011001110011001011010011111101101001101011101"
                    "101110100101110010111000011011111101111011011111010111111111110110000100000111110101111110000011101011110001110011111111111111000010010111011111111011101011001011010100001011101"
                    "100000101001101111111111110110001000000111010010011110011000101101011100000010001001100011011101110000101111011110001010010001011111011001011000101000010010111111001010101000001"
                    "111111101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101111111"
                    "000000001010101000111100111110001110000001101000010000111000100000101011100111110000100011011011100100000000100010001111111011001011011011111000111111111001000010010111100000000"
                    "001110101100010001001111000111111110001110001111010001111111111011011010100101110010111111101101110110100110000111111011011011111101101010011111110001011110011011011000011100111"
                    "010000000011010000110010100101111011001000111011000000110110100100010001011011000111000100101100101110001111010001010001010110011011011001110000011011011001010000111111111001111"
                    "011001100011010111001100111001100111110000011011000101111011101100110101100100000110001111011011010010111100101001110011111011100000000110001111111011101011001011010011011110000"
                    "100001011010011111011000010011100000110011111100011101010010010001101001001000001100100011000111001100010000000101110010001011011111011001010001001000010010111111001001010001011"
                    "011100100100100100111110111101111011100110011110001111100000110001001110110101111000001100011010010000011110110001000111111011001010011011111010111111111001000010010111101010101"
                    "110001000100011100001000001010100100010011100101001000100011010010101111101001111110101011101010100010101010110100101011010011111101101010011011000000000110011111011010010011011"
                    "100001101000001001011000111001001101101001110001001001100111010000111001110100000111000010100000110010010011110111101101010001011011011001011000011011011001010000111111111001111"
                    "001000011111011110001101000110101000010010100110000010100000101000001111110101001111011010010001000110111111100001101011101110000000000110001111011011101011001011010011011110000"
                    "110001101011101010001001110101111100011110011100010000010011100110000010110100000001110011010000111111110100011111001010011011011111111001010001001000010010111111001001010001011"
                    "010101001011001100101001001100000010110010011010110001010110011010111110000100010101110001000010110011001000111111001111100101101010011011111010111111011001011000010011101011001"
                    "100011100111101001011100111011111101001010110000010101101001110001010010000100110010010011011111011100011101001010110011010011111011101011000011000000000110011111011010010011011"
                    "100101000111111110000111000000001000011100000010111011010001000000110100001101101001110010011101001000111011000101101101001110011011011001011000011011011001010000111111101011111"
                    "011111111011000001101111101011101011110100111010000010100111100111010110100111101011010101100001000111000100111000110011010011010001000110001111011011101011001011010011011110000"
                    "100110011001110000000000100111100010001010111110111000010011001010001100011011101000100001110000001111000100100111000010011010111111111001010001001011011011110011101101010001111"
                    "111001100111011110111110001100010010001110000000111110011100000110000010010110100110111101000111101010001000100000100111100101101000010010111010111111011001011000010011001011001"
                    "011011000111000100000101010101010111000101101000001111001100001001101001101110101110010001000011000000011110110100100011011010011011101011000011000000000110011111011010011101011"
                    "010111110111010111010011100001000000001101101000010000000001001000101101000110011010000001100111010001011110010001100100111111101011011011011000011011011001010000111111101011111"
                    "011010011000101101000111011111100011111101010110100111110111100100101111101111001100010000100101100100001100110000001011001011010001000110001111010100101110001011011011011110010"
                    "010100110110001011100001100100111001101101010100111101000011011000100010110010011110111011101111000001010001001100001000011010111111111001011001001011011011110011101100110001111"
                    "011100011110011110110001100011101001110010011100101001100001100011101101011001001010011110010010010101111011100001011111111101001000010010111111111111011001011000010011011011001"
                    "110011111101100110111010010011111001010000001100001001111111101000010000001110011111111110100000100100001100100111111011010011010011101101001111100000000110011111011010111111011"
                    "111010001010001001111001001110001111100110011111101000111000101000111010101101001101100010110010010001011110001010001100101110001011011011001000111011011011110001000111100011101"
                    "101010101010000100101010101110101010000011111111110101111010111100101001101110000110101010111011010101001100011010101011001011010001011110011010110100101110001011011011101010010"
                    "011110001010001011000110010110001111001001111101101011101000100011011111001000100111100010111000011110001101101110001000011011011111111001011000101011011011110011101100100011111"
                    "010111111001110000101101100111111111011100101100001001111111111110100110111010010110111111110111101110111100110111111111010001111000010010101111111111011001011000010011111111001"
                    "011101000011010100010000000101000001000000001101010101111011101110111100001100010100000010110011101100111100100110110011001010010011101101011011011010010011011111111001111101010"
                    "110110101000001010101010001100010111100011100001011001010010010001100110100110010101100001001010110111000011010000010010101110001011010011111000011011011011110001000110001011101"
                    "100001001000010111011100111000000010111011101001100100001000111110000111000101100011110011011010000011001010110111011011011011010001011110010111010100101110001011011011111110010"
                    "001000100011000110000011110010101101011010101101010111101011011100011010000101101001011000111101011000011101100011011000000111111111011011001010001011011011110011101101000011111"
                    "101010011001011110001001111001101110101110011110110100011011101111101001000000101110010101111101101011110110100101101111011000011000010010110111110111101101001010011011011010011"
                    "001001100010001010001010100010111111111110011010011010101001110011001110000000011001011101101011101101000000010011100001001010010111101101011011011010010011011111111001111101010"
                    "010111011111110111011101100010010000110110000011110000000010110110000001100000101000001010100101111001101001001111011010110111001011010011111000011011011011110001000110001011101"
                    "010011111110100010001111101011000110111111111000110101011111011010001100010111010011111010010101011100000101010110001011011000110000111110011011110100101110001011011011111110010"
                    "110000001100100101000100010110110001001000101010001111111110010100100000000001010010010001001111010001001100001110001000011111011111011011001010001011010011111101101011000011011"
                    "001011110111001011011111111010111101111010000100100110101110110000010011110110001100110100111010000111101111100010110111011000011110010011010111110111101101001010011011011010011"
                    "101000000011001000011100100011111000010111000011000111010010100010110000100100101111110001011011011001000100010000100001011011110011101101011011011010010011011111111001111101010"
                    "011001101011010001100101011011101011010000100101010110111011000100110101111010111101100010000100101110001011000100100011101011001101010011110101011011011011110001000110001011101"
                    "101001010110110000011010010000110110001011100100010001101111111001000111000101110111010100010000101000100110010010111011011001010010111110011011110001011110011011011001111111010"
                    "011000101101010111000100100110010110010110101101110011011101110011100001001101110010100001011001000100101100110001100000011111011111011011101010001011010011111101101011000011011"
                    "010011000001101111010000000000001111101011100100001011110111100010011110111100001100111001011000110000000010110100000111010001011000010011010111110111101101001010011011011010011"
                    "100110100000111001000111110111010000111111101100101010101111101010001110101101110011111000101001011111110000010101101000001010011011001001011011011010010011011111111001010001010"
                    "001011010001011000101001100000101001001000010000000000101111000001100111101010000111010000000111111100101110110010001011111011001011010011100101011111111001000010010111001010101"
                    "100110111011100111010001111111010110110001100011011110100011010010010010011110101011011001001111010001010101110000000011011001010010101110011011110001011110011011011001011111010"
                    "110100011101010000011101101010000011100001100011010001100101100001010101010000010110011010111100101111111011101110011000010111111011011011101010001011010011111101101010100011011"
                    "101000101111001111010000001010011101001101011000010111011010111101111000101111100000111101111111100000011111101100000111101000000110010111011111110111101101001010011011011110011"
                    "110011010010001111111100001100100010110010101111001110101011111101011111001110110010111111010000010101001010011110000000010011011011001001011011001000010010111111001001110001011"
                    "011111111010110001001001001011010000001110100110010110101100110010011101110001101111100111000100101111010010101000100111111011001011011011100101011111111001000010010110001010101"
                    "110100001001001101111000010010110101100011111011001010000110101011111011101010000111111100011010010001111010111011101011000001110000101110011011110001011110011011011001111111010"
                    "110011111011110010000000001011111011100010111111001101011111101110000000111110101111111110101000000010000101111111111001011110011111011001101111101011010011111101101011111111011"
                    "001010001101110010111000111110001101011101011010010000001000110100100110000111110101100010000011101011110000010010001111111001100010010111011000111011101011001011010010100010000"
                    "110110101001101111111110110110101001100011010001011001011010101100011010000010001001101011011101110000101111111010101010010011011011011001011010101000010010111111001001101011011"
                    "011010001010101000111101111010001110100001101000010000011000100001001101100111110001100011011011100100000000000110001111111010101001011011111000111111111001000010010111100010101"
                    "111011111100010001001111100111111110101110001110010101001111101000011000100101110010111111101101110110100111100011111011011011011111101010011111110001011110011011011000111111010"
                    "010000011011010000110010100000111010001100111111100001000001010010010011011011000110001110101100101110001111010101100001010111011001011001110000011011011001010000111111011001111"
                    "011001101011010111001101111111001111010100011000100010111101001011110101100100000111000101011011010010111100101101111011111001100010000110001111111011101011001011010010011110000"
                    "100001001010011111011001010011100001110101111111100000100100011100001101001000001100011101000111001100010001000110111010001011011101011001010011001000010010111111001000010001011"
                    "011111100100100100111111111011110010100010011111011110011111111101001110100101111001011010011010010000011110010100110111111101001010011011111101011111111001000010010111101010101"
                    "110001001100011100001000001101010101110001100010110010111000000110101001110001111110101101101010100010101011110010110011010011111011101010011011000000000110011111000011010011011"
                    "100000101000001001011000011101001101001001110001001111110011100110111111100100000111011010100000110010010011110001110101010111011001011001010000011011011001010000111111011001111"
                    "001000000111011110001101100110101000010100100000101010111001110100001011110101001110011010010001000110111111100000000011101000000010000110001111111011101011001011001010011110000"
                    "110011101011101010001000010011011100111100011110011100010110000010000000101100000000100111010000111111110101011101101010011011011011111001010011001000010010111111010001010001011"
                    "010100001011001100101001001110001010010110011100001101000000110010111010011100010100011011000010110011001000111111110111100101101000011011111010111111011001011000010011001011001"
                    "100000100111101001011101011001011101101000110001100111100001111001010100000100110010100011011111011100011101001111101011011011111011110011011011011000000110011111011010110011011"
                    "100100000111111110000111100011110001111110000100010101000110011110110100010101101001000100011101001000101011000111010101010110011111011001011000010011011001010000101111011001111"
                    "011101100011000001101111001001110011110100111111101000100011010111010000100111101011001111100001000111011100111111110011001011010011011110001111101011101011001011011011111110000"
                    "100101011001110000000001000111111011101110110010010000010010010010001010011011101001100011110000001111011101000101101010011010111001110001010001001011011011110011110100010001111"
                    "111000100111011110111110101101111011101100001011101110010001010110000000001110100111101101000111101010010000100111000111111101101000011010111010111111011001011000011011101011001"
                    "011001000111000100000101010010110111100011101110110111001010110001101101110110101110001011000011000000010111110010100011011010011111101011000011010000000110011111011010110011011"
                    "010101101111010111010011100001011000101011100110001000010110111000101001010110011011100011100111010001001111110101111100110111101011011011011000001011011001010000110111011001111"
                    "011000011000101101000110111100101010011101001001001111100001100100101101101111001101011010100101100100010101010001111011001011010101010110001111001100101110001011011010011110010"
                    "010101101110001011100000100001100000101101010110000101010010000000100010110010011110110011101111000001000000101111000000010010111001110001010001011011011011110011111101110001111"
                    "011101001110011110110000000010001000010010010010011001111111001011101111001001001010110000010010010101110010100001011111111101001110001010111010100111011001011000000011101011001"
                    "110011100101100110100010110011111000110000011001100001101010011000010010010110011110010010100000100100010100000100101011011011010001111101000011011000000110011111011011010011011"
                    "111001000010001001110001001010010110000110001011011000100000000000111000100101001100010010110010010001000111001001110100110110001011000011011000001011011011110001010110001011101"
                    "101011111010000100111011101011101011100011101110110101110011110100101011111110000110010100111011010101010100111000101011001011010101010110001111010100101110001011001011011110010"
                    "011110011010001011011111110101100111001001110000100011100101010011011101011000100110100000111000011110000101001101010000010011011011101001011001011011011011110011110101110001111"
                    "010111111001110000101100100011111110011100101100110001101111111110100100111010010110111111110111101110101100110011111111011001111010010010111111111111011001011000011011111111001"
                    "011110001011010100011001100010001000100000001100101101101000100110111000001100010101100010110011101100101101100110001011011010010111111101011000111010010011011111111001100011010"
                    "110110101000001010100011001010101111000011110001101001011010101001100010101110010101101011001010110111001011110110101010110110001011000011101010111011011011110001001111101011101"
                    "100010001000010111010100111110001010111011110001111100011000110110000101011101100011100011011010000011000010110010001011001011010011011110001000101100101110001011010011100010010"
                    "001011111011000110001010110111111100011010111101001111111111110100111100001101101000111110111101011000001100000011111000010111111001011011011111111011011011110011111101111111111"
                    "101001000001011110001001111100011110001110001111111100101100011110001011011000101111111101111101101011110111000100111111011000011110001010110010111111101101001010011010001010011"
                    "001011100010001010010010000101001110111110011010111011011000010011001000010000011000010001101011101101011001110110100001011010010111111101011011010010010011011111101001011101010"
                    "010111010111110111010100000101000000010110001010001000010101011111000011110000101001100000100101111001101001001001100010110111001011011011111000001011011011110001011111101011101"
                    "010010111110100010001110001001100110111111101000111100001111101010101100010111010011110001110101011100010100110110011011001000110000110110010111011100101110001011011010011110010"
                    "110000010100100101010100110010101001001000110011001110001011001100100000010001110011011011101111010001000101101010000000010111011111001011001001011011010011111011111011010001011"
                    "001000111111001011001111111001110101111010011101111111111001111001110011101111001100011111011010000111111110100101000111001000011110001011010011110111101101001110011010111000011"
                    "101001000011001000000101000011011000010111011011011110001101110011010000111101101111000011111011011001011100010010101001011011110011111101011101001010010011011011110001011011010"
                    "010010101011010001100100011010001010110000110101001111100000001101110101101010111100000000100100101110000011000110000011110011001101010011111010010011011011110011001110001111101"
                    "101101001110110000000010010010011111101011100101011001011110101001000111001100110111110010010000101000100110010111000011001001010010101110011011011001011110011011011001011011011"
                    "011100100101010111000100000110101110010110100101011011011001011011000001000100110010011001011001000100100100110111000000011111111111001010001000000011110011111011100011100001000"
                    "010110011001101111000000100011111111001011100101011011001001101011011110100101001100110101111000110110000010110011100111001000011000011011010011111110001101001000011011011010011"
                    "100101100000111001001110010010110000011111100101011011110101110011101110111100110011111100101001011011110000010001110000011011111011000001111011011011110011011111101000011011001"
                    "000011011001011000101000100010011000101000000000011000011100100000100111101011000111101010100111111010101110110001010011110011001011011010010000010111011001000010001111001000101"
                    "100111111011100111001001011001000111010111111011011110001101000011010010001111101011011010001111010111001101110000011011011001010010101110011011111000111110011101010001111011010"
                    "111000001101010000001100001110101010000111100011010000011100011001110101010000110110110000011100101001111011101010001000011111111011010011001110011011010011111011111011000011011"
                    "101111110111001111001000001000111100101001011000011110010000101100111000110110000000110101111111100100001111101000111111101000000110011110110011110111001101001110001011011100001"
                    "110000000010001111110100001111100010110000110111000110101010111101011111010110010011110000110000010001010010011100100000011011111011011001011001011001110010111111001001011011001"
                    "011001101010110001010001001001100000001110111110001111101001001010011101111000001111000011100100101011000010101100110111100010001011011010000001001111011001000000010111001000110"
                    "111001010001001101110000010110100101100111111011000011000011110011011011101010000111010101011010010001111010111110101011011001010000111111111111111001011110011011011001011111011"
                    "110100101011110010011000001010000011100110101111010100100011100110000000100110101110000000101000000100001101111111101001011111111111001001001010010011110011111111111010100001011"
                    "001111000101110010110000111010010101011101000010011000011101101100100110011111010100111001000011101111110000010110000111101000000010011111011101110011001011001111001011011010001"
                    "111010100011101001111110110101001001100001010001010000101011110100011010011011101000111001111101110010111111111101101010011011011011011001011001001000010010111001011001110011011"
                    "010111010110101010101101111010111110100001110000010001101101010001101101111111010001110000011011100110010000000100001111100010001001010011000111011111011001000010011110001110111"
                    "111011111000010011001111100111111110101110000110000100101111101000011000110100110011111110101101110100111111100011111011011011011111101010011111100001111110011011000001111111000"
                    "011110001011010110111010100110001010001100100111100001101000110010010011011011000110100010101100101100010111010110001001011111111001011001011000110011111001010110111110100011111"
                    "011110101101010001000101111010101111010000010000100011011010101011010101111101000111101010111011010000100100101010101011101001000010011111001010101010001011001011010011101010010"
                    "100010001010011001001001010110001001110001101111100000101000111100101101000001101101100010100111001100010001000110001010011011011101010001111000110001010010111011001000100011001"
                    "011011111110100010111111111011111010100110011111011111111111111101101010111100111001111111111010010010000110010011111111100100001010001010011111111110111001000100010111111110110"
                    "110110011010011000001000001011001101110111110010110011110001000111101001111001111111111001101010100100100011110110000011011011011011110011011001100001100110011011000011111001000"
                    "100000111110001101001000011100010101001111111001001111100111100111011111100100000110011010000000110000010011110110011101010110111001011001010010011010011001010000111111000011111"
                    "001000001111011000001101100010010000010010101000101010111110110101101101111101001111011101010011000000110110000000000011101001000010000111101101111011101011001111001010011010001"
                    "110011110001101010000000010110100100111010010110011100000001100010100110101100000110011111010110111001111100111110000010011011011011111000010011001001010010111001010000010111010"
                    "010011011001001100111001001111001010010000001100001101111000110011111110011101110011001111100010110101000001011000100111100100001000011011111011011110111001011100010011101011010"
                    "101100101011101011010101011100111101101000101001100110011000111001110110000100010000110100011011011110011101001101101011011011011011110011011111111001000111111011011011011011011"
                    "100100011001111000011111100000111001111110011100010100010111011110010100010100101011010110111011001110101010100101100101010110111111011000110010010011011000010110101111011011101"
                    "010001101001000111111111001001001011110100111111101001111101010111010110100110101110000100000101000101011100111101111011001011010011011111001011101010001011101001011010011010011"
                    "100101001111110100010001000101100011101100101010010001110000010010001000011010101100100101110000001001011101000100111010011011011001110001010001001011011100110001110101010001110"
                    "111111100001011100101110101101110011101110000011101110100001110110000000001111000000001011000001101100010000100110110111111100001010011011111111011111011011011010011011001111011"
                    "011101001101000000010101010011010111100101110110110110000100010001101001110110001110110101100001000000010110010110110011011011011011101011011111010001100010011111011010110011011"
                    "010000101001010011000011100111001000101111100110001000100011111001001011010111011001011010000001110111001111010011110100110110101111011011011010001010011111110010110111011101110"
                    "010100000000101111011111111100101011011111001001001110100011100101001101101110001101001010000110000000010101010000000011001011010011010111101001101100001011101001011011111010011"
                    "011011101000001001101001000001011000101101010110000101010000000000100110110011011101101110101011100001000000101001101000010011111101110001010111011011011011010011111100010111111"
                    "010000001000011010111001000100001000110000010010011000010110101010001011001000001101101010010000010001110011100011110111111100001010001010011110100111111000011010000011101111000"
                    "110000100101100110100010010111011001010000011001100001001011111000010110010111111010010010000010000110010101100011101011011011010011111101000011011000000111011001011010110001011"
                    "110100000000001101110001001111110110100110001011011000010000000000111110100100101101111101110110010011000111101111010100110110101111000011111100001010011111110011010111011011110"
                    "100001100010000010111011101011110011100001101110110101100011010100101111111111100011010110011111110101010100111101110011001011010011010111101011110101001011001011001010011110001"
                    "011101011000001011011111010001111111101111110000100011010110010011011001011000000000101011011111011000000100001011101000010011111101101000010111011010111001010101110101110111110"
                    "011000100110110100101100100101111110011100101100110001111001011111000000111010010110110100010101101100101101110111000111011000011010010011011000111111011111111010011011101001011"
                    "010001000010110110011000100000110000000110001100101100101000100111111010001101010100011010010010001110101100100110100011011011010011111100100011011010010111011001111001010011011"
                    "111001101111000110100011001011011110100001110001101001100010101001100110101111110101111011101010110001001010110001101010110111001111000011111010011011111011010111001110011011101"
                    "100100011110111101010101111010101010111011110001111101110001110110100011011100000110011011011011000011000011010101100011001011010011011110001011001101001100101001010011011110010"
                    "000111111001011110001011010111111101011010111101001111101111110100111100001100101000111110111111111000001101100111111000010111111101011011111111111011011011010011111100111111111"
                    "101110001101100010001000011010001110101100001111111100101000111110001101011000001111100011011111001001110111000110001111011000011010001011011000111111001111101010011011100010011"
                    "000010101011110000010011100010101110111000011010111011001010110011001010010001111000101010001101101101011001010010101001011011110001111100111010110011010000011111101001101011001"
                    "011010001011111011010100000110001000010100001010001000001000111111000011110000001110100010000011111111101000001010001010110111001111011011011000101010011011110001011110100011111"
                    "010011111101010000001110001011111111111101101000111100011111101010101010011110110101111111010110111010010101010111111011001001010010110111001111111101001011001011011011111110011"
                    "111101001100101111010100010101100000001010110011001110011100001100100010000001110010100010101110010011000100001111000000010111111101001010001011011011010011011011111011110011011"
                    "001001101101010001001110011010001100111000011101111111101011011001110001111110101111001001111111000011111110000101000111001000011010001011010110110111101010001110011011001010011"
                    "101111000111111010000101000101111001110001011011011110011010010011010000101100001010110011111111110101010101110110111001011011110001111101011011001010010111111011110000110101010"
                    "010001100101110101100100111010010010010110110101001111110000001101110101110010111111101010100100101000000011100011111011110011001111010011111010010011011011010011001111001011101"
                    "101111011101111110000011110101101111001001100101011001001011101001000111000100110010010100010010101110110111110010110011001001010010101110010001011001011011011011010000011001011"
                    "011110111011001001000100100111100110010000100101011011001101011011000011000100110011000001011001001100100101110111001000011111111011001010001111000011101000011011111011010111000"
                    "010101000010011011000000100000011111101101100101011011011100001011011100111101001001001101111100111110000011110100110111001000011010011011010010111110010111001000011011001000011"
                    "100111100001010001001111110111011000011001100101011011101000010011101100111100110111001000101111100011101001110110111000011011111001000001111011011011111011011111110000111101001"
                    "000011010111110000101001000111010001101100000000011000000101000000100001110011000000110000100000100010111110110011111011110011001111011010011000001111011011011010001111001010101"
                    "100110111011010111001000111111101111110011111011011110011111100011010000000111111001010000001010110111000101110110010011011001010000110110011111011000101001010101010000011111010"
                    "111000010001111110001101001110110011000111100011010000011011011001110001010000101100000010001110011001101010101110001000011111111011001011001001000011011111101011111011010001011"
                    "101111111100000111001001101111100100001101011000011110001001101100111100101110011101000111101001001100000110001011010111101000000010011110110011111111011000011110011011011000001"
                    "110001001001111101110100001001011011010000110111000110110101111101011111001110000000101010101100100001000011111110111000011011111001000001011101010001111011011111011000111011001"
                    "011001110001010101000000101010001001101110111110001111111000001010011101110000001011100001111101110011010010001110011111100010001111011010010010001111011100110000001111001110110"
                    "111011011101110001101000110000010101000111111011000011001110110011011111101010010001100011000010110001110011111101011011011001010000110111111011011001010011001011010000011011011"
                    "110111110001010010010001001110101010000110101111010100111001000110000110111110101111011000101101011100001100111011001001011111111011001001001000000011101010010111111011000001011"
                    "001101000010111010111001111011101101011101000010011000010001101100100010001111010101001101001001010111100000110101110111101000000010011111010011111011011000011111000011011010001"
                    "111000110111000001100111010010111001000001010001010000101101110100011100011011101000101101111100111010111111111101111010011011011001011001010011010000000011100001011000111011011"
                    "010111010010111010111100011110001110100001110000010001101100110001101101100111000111110010011100100110011001100101000111100010001111011011011000001111011011011010001111001000111"
                    "111001110001000011010110100111010110101110000110000100100101001000011010101100100110110010111001101100100110100110011011011011011001110010001011111001101000011011010000011011000"
                    "011110010100100110100010100000110011001100100111100001100100010010010101000011001000111000100111110100000111110110001001011111111011001001011110011011101010010110111111000010111"
                    "111001100100100001001101111100110110010000010000100011011000101011010011111101010000000100101111011000100100001110110011101001000010010111010011111010010111111011000011011101110"
                    "000100010011011001111000010111111000110001101111100000101010111100101111010001111101110000101001110100000001000100111010011011011001011001111001010001011011011011011001111010101"
                    "010101101110101010110110011011111010100110011111011111101111111101101010100100100100111111101001001010001110010111111111100100001110011010011111101110101001010100001111111110110"
                    "000000001011110001011001101110001101110111110010110011111000100111101001101001111000100011111110101100100010110110001011011011011001110011011000110001101000011011011011100011000"
                    "111111100111010101010000111110101101101111111001001111101010100111011111111100000000101010010101101000011010110010101101010110111111001001011010111010010111001000111110101011011"
                    "100000100111000001110100100110001000010010101000101010101000110101101101100101000011100010011110110000110110000110001011101001000010010111101000111011111011011111000011100010001"
                    "101110101000010010001001010011111101011010010110011100011111100010100110110100000010111110101011001001100101111011111010011011011001111000001111110001011100110001011001111111010"
                    "101110101000101101011000101111110010010000001100001101101001010011111110011100010010011011010001110101001001111110100111100100001110011011111001001110101001010100001010101001011"
                    "101110101010001011100101111010101100101000101001100110010011111001110110010100001111001101110110111110001101101110111011011011011011110011010111110001011111101011011011011111100"
                    "100000100000010000101110000100011000011110011100010100000011111110010100001100010010001001110010000000110010100111101101010110111111001000101010011011011000011110111110000000000"
                    "111111100000001110110110101010011010010100111111101001111101110111010110101111000111011001110100010111000100111000011011001011010011010011010101111010000011100001000011111011001"

        },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_QRCODE;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_QR_ENCODE_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %d, %d, %s, %d, %d, \"%s\",\n",
                i, testUtilInputModeName(data[i].input_mode), data[i].data, data[i].option_1, data[i].option_2, testUtilErrorName(data[i].ret),
                symbol->rows, symbol->width, data[i].comment);
        testUtilModulesDump(symbol, "                    ", "\n");
        printf("               },\n");
        #else
        if (ret < 5) {
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);

            if (ret == 0) {
                int width, row;
                ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
                assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);
            }
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_microqr_options(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int option_1;
        int option_2;
        int ret_encode;
        int ret_vector;
        int expected_size;
        int compare_previous;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "12345", -1, -1, 0, 0, 11, -1 }, // ECC auto-set to 1 (L), version auto-set to 1
        /*  1*/ { "12345", 1, -1, 0, 0, 11, 0 }, // ECC 1 (L), version auto-set to 1
        /*  2*/ { "12345", 2, -1, 0, 0, 13, 1 }, // ECC 2 (M), version auto-set to 2
        /*  3*/ { "12345", 3, -1, 0, 0, 17, 1 }, // ECC 3 (Q), version auto-set to 3
        /*  4*/ { "12345", 4, -1, ZINT_ERROR_INVALID_OPTION, -1, 0, -1 },
        /*  5*/ { "12345", -1, 1, 0, 0, 11, -1 }, // ECC auto-set to 1, version 1
        /*  6*/ { "12345", -1, 2, 0, 0, 13, 1 }, // ECC auto-set to 2, version 2
        /*  7*/ { "12345", 2, 2, 0, 0, 13, 0 },
        /*  8*/ { "12345", -1, 3, 0, 0, 15, 1 }, // ECC auto-set to 2, version 3
        /*  9*/ { "12345", 2, 3, 0, 0, 15, 0 },
        /* 10*/ { "12345", 1, 3, 0, 0, 15, 1 },
        /* 11*/ { "12345", -1, 4, 0, 0, 17, 1 }, // ECC auto-set to 3, version 4
        /* 12*/ { "12345", 3, 4, 0, 0, 17, 0 }, // ECC auto-set to 3, version 4
        /* 13*/ { "12345", 2, 4, 0, 0, 17, 1 },
        /* 14*/ { "12345", -1, 5, 0, 0, 11, -1 }, // Size > 4 ignored
        /* 15*/ { "12345", 1, 5, 0, 0, 11, 0 }, // Ignored also if ECC given
        /* 16*/ { "12345", 1, 1, 0, 0, 11, 0 }, // ECC 1, version 1
        /* 17*/ { "12345", 1, 2, 0, 0, 13, 1 }, // ECC 1, version 2
        /* 18*/ { "12345", 1, 3, 0, 0, 15, 1 }, // ECC 1, version 3
        /* 19*/ { "12345", 1, 4, 0, 0, 17, 1 }, // ECC 1, version 4
        /* 20*/ { "12345", 2, 1, ZINT_ERROR_INVALID_OPTION, -1, 0, -1 },
        /* 21*/ { "12345", 2, 2, 0, -1, 13, -1 }, // ECC 2, version 2
        /* 22*/ { "12345", 2, 3, 0, -1, 15, 1 }, // ECC 2, version 3
        /* 23*/ { "12345", 2, 4, 0, -1, 17, 1 }, // ECC 2, version 4
        /* 24*/ { "12345", 3, 1, ZINT_ERROR_INVALID_OPTION, -1, 0, -1 },
        /* 25*/ { "12345", 3, 2, ZINT_ERROR_INVALID_OPTION, -1, 0, -1 },
        /* 26*/ { "12345", 3, 3, ZINT_ERROR_INVALID_OPTION, -1, 0, -1 },
        /* 27*/ { "12345", 3, 4, 0, -1, 17, -1 }, // ECC 3, version 4
        /* 28*/ { "12345", 4, 4, ZINT_ERROR_INVALID_OPTION, -1, 0, -1 },
        /* 29*/ { "12345", 5, -1, 0, 0, 11, -1 }, // ECC > 4 ignored
        /* 30*/ { "12345", 5, 1, 0, 0, 11, 0 }, // Ignored also if size given
        /* 31*/ { "123456", 1, 1, ZINT_ERROR_TOO_LONG, -1, 0, -1 },
        /* 32*/ { "123456", 1, -1, 0, 0, 13, -1 }, // ECC 1 (L), version auto-set to 2
        /* 33*/ { "123456", 1, 2, 0, 0, 13, 0 },
        /* 34*/ { "ABCDEF", 2, 2, ZINT_ERROR_TOO_LONG, -1, 0, -1 },
        /* 35*/ { "ABCDEF", 1, -1, 0, 0, 13, -1 }, // ECC 1 (L), version auto-set to 2
        /* 36*/ { "ABCDEF", 1, 2, 0, 0, 13, 0 },
        /* 37*/ { "ABCDE", 2, -1, 0, 0, 13, -1 }, // ECC 2 (M), version auto-set to 2
        /* 38*/ { "ABCDE", 2, 2, 0, 0, 13, 0 }, // ECC 2 (M), version auto-set to 2
        /* 39*/ { "ABCDEABCDEABCD", 1, -1, 0, 0, 15, -1 }, // 14 alphanumerics, ECC 1, version auto-set to 3
        /* 40*/ { "ABCDEABCDEABCD", 1, 3, 0, 0, 15, 0 },
        /* 41*/ { "ABCDEABCDEABCD", 2, 3, ZINT_ERROR_TOO_LONG, -1, 0, -1 },
        /* 42*/ { "ABCDEABCDEA", 2, 3, 0, 0, 15, -1 }, // 11 alphanumerics, ECC 2, version 3
        /* 43*/ { "ABCDEFGHIJABCDEFGHIJA", 1, -1, 0, 0, 17, -1 }, // 21 alphanumerics, ECC 1, version auto-set to 4
        /* 44*/ { "ABCDEFGHIJABCDEFGHIJA", 1, 4, 0, 0, 17, 0 },
        /* 45*/ { "ABCDEFGHIJABCDEFGHIJA", 2, 4, ZINT_ERROR_TOO_LONG, -1, 0, -1 },
        /* 46*/ { "ABCDEFGHIJABCDEFGH", 2, 4, 0, 0, 17, -1 }, // 18 alphanumerics, ECC 2, version 4
        /* 47*/ { "ABCDEFGHIJABCDEFGH", 3, 4, ZINT_ERROR_TOO_LONG, -1, 0, -1 },
        /* 48*/ { "ABCDEFGHIJABC", 3, 4, 0, 0, 17, -1 }, // 13 alphanumerics, ECC 3 (Q), version 4
    };
    int data_size = sizeof(data) / sizeof(struct item);

    struct zint_symbol previous_symbol;

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_MICROQR;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt);
        if (data[i].compare_previous != -1) {
            ret = testUtilSymbolCmp(symbol, &previous_symbol);
            assert_equal(!ret, !data[i].compare_previous, "i:%d testUtilSymbolCmp !ret %d != %d\n", i, ret, data[i].compare_previous);
        }
        memcpy(&previous_symbol, symbol, sizeof(previous_symbol));

        if (data[i].ret_vector != -1) {
            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
            assert_equal(symbol->width, data[i].expected_size, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_size);
            assert_equal(symbol->rows, data[i].expected_size, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_size);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_microqr_input(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int ret;
        char* expected;
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, not in Shift JIS, UTF-8 C3A9
    // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in Shift JIS 0x83C0, UTF-8 CEB2
    // ภU+0E01 in ISO 8859-11 Thai (but not other ISO 8859 or Win page), not in Shift JIS, UTF-8 E0B881
    // Ж U+0416 in ISO 8859-5 Cyrillic (but not other ISO 8859), Win 1251, in Shift JIS 0x8447 (\204\107), UTF-8 D096
    // ຠU+0E81 Lao not in any ISO 8859 (or Win page) or Shift JIS, UTF-8 E0BA81
    // ¥ U+00A5 in ISO 8859-1 0xA5 (\245), in Shift JIS single-byte 0x5C (\134) (backslash); 0xA5 same codepoint as single-byte half-width katakana ・ (U+FF65) in Shift JIS (below), UTF-8 C2A5
    // ï½¥ U+FF65 half-width katakana, not in ISO/Win, in Shift JIS single-byte 0xA5 (\245), UTF-8 EFBDA5
    // ¿ U+00BF in ISO 8859-1 0xBF (\277), not in Shift JIS; 0xBF same codepoint as single-byte half-width katakana ソ (U+FF7F) in Shift JIS (below), UTF-8 C2BF
    // ソ U+FF7F half-width katakana, not in ISO/Win, in Shift JIS single-byte 0xBF (\277), UTF-8 EFBDBF
    // ‾ U+203E overline, not in ISO/Win, in Shift JIS single-byte 0x7E (\176) (tilde), UTF-8 E280BE
    // 点 U+70B9 kanji, in Shift JIS 0x935F (\223\137), UTF-8 E782B9
    // 茗 U+8317 kanji, in Shift JIS 0xE4AA (\344\252), UTF-8 E88C97
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "é", 0, "87 A4 00 EC 11 EC 11 EC 00", "B1 (ISO 8859-1)" },
        /*  1*/ { DATA_MODE, "é", 0, "8B 0E A4 00 EC 11 EC 11 00", "B2 (UTF-8)" },
        /*  2*/ { UNICODE_MODE, "β", 0, "C8 80 00 00 EC 11 EC 11 00", "K1 (Shift JIS)" },
        /*  3*/ { UNICODE_MODE, "à¸", ZINT_ERROR_INVALID_DATA, "Error 800: Invalid character in input data", "ภnot in Shift JIS" },
        /*  4*/ { UNICODE_MODE, "Ж", 0, "C8 91 C0 00 EC 11 EC 11 00", "K1 (Shift JIS)" },
        /*  5*/ { UNICODE_MODE, "àº", ZINT_ERROR_INVALID_DATA, "Error 800: Invalid character in input data", "ຠnot in Shift JIS" },
        /*  6*/ { UNICODE_MODE, "\\", 0, "85 70 00 EC 11 EC 11 EC 00", "B1 (ASCII)" },
        /*  7*/ { UNICODE_MODE, "Â¥", 0, "86 94 00 EC 11 EC 11 EC 00", "B1 (ISO 8859-1) (same bytes as ï½¥ Shift JIS below, so ambiguous)" },
        /*  8*/ { UNICODE_MODE, "・", 0, "86 94 00 EC 11 EC 11 EC 00", "B1 (Shift JIS) single-byte codepoint A5 (same bytes as ¥ ISO 8859-1 above, so ambiguous)" },
        /*  9*/ { UNICODE_MODE, "¿", 0, "86 FC 00 EC 11 EC 11 EC 00", "B1 (ISO 8859-1) (same bytes as ソ Shift JIS below, so ambiguous)" },
        /* 10*/ { UNICODE_MODE, "ソ", 0, "86 FC 00 EC 11 EC 11 EC 00", "B1 (Shift JIS) (same bytes as ¿ ISO 8859-1 above, so ambiguous)" },
        /* 11*/ { UNICODE_MODE, "~", 0, "85 F8 00 EC 11 EC 11 EC 00", "B1 (ASCII) (same bytes as ‾ Shift JIS below, so ambiguous)" },
        /* 12*/ { UNICODE_MODE, "‾", 0, "85 F8 00 EC 11 EC 11 EC 00", "B1 (Shift JIS) (same bytes as ~ ASCII above, so ambiguous)" },
        /* 13*/ { UNICODE_MODE, "点", 0, "CB 67 C0 00 EC 11 EC 11 00", "K1 (Shift JIS)" },
        /* 14*/ { DATA_MODE, "\223\137", 0, "CB 67 C0 00 EC 11 EC 11 00", "K1 (Shift JIS)" },
        /* 15*/ { DATA_MODE, "点", 0, "8F 9E 0A E4 00 EC 11 EC 00", "B3 (UTF-8)" },
        /* 16*/ { UNICODE_MODE, "茗", 0, "CE AA 80 00 EC 11 EC 11 00", "K1 (Shift JIS)" },
        /* 17*/ { DATA_MODE, "\344\252", 0, "CE AA 80 00 EC 11 EC 11 00", "K1 (Shift JIS)" },
        /* 18*/ { DATA_MODE, "茗", 0, "8F A2 32 5C 00 EC 11 EC 00", "B3 (UTF-8)" },
        /* 19*/ { UNICODE_MODE, "¥点", 0, "8D 72 4D 7C 00 EC 11 EC 00", "B3 (Shift JIS) (optimized from B1 K1)" },
        /* 20*/ { DATA_MODE, "\134\223\137", 0, "8D 72 4D 7C 00 EC 11 EC 00", "B3 (Shift JIS) (optimized from B1 K1)" },
        /* 21*/ { DATA_MODE, "¥点", 0, "97 0A 97 9E 0A E4 00 EC 00", "B5 (UTF-8)" },
        /* 22*/ { UNICODE_MODE, "点茗", 0, "D3 67 F5 54 00 EC 11 EC 00", "K2 (Shift JIS)" },
        /* 23*/ { DATA_MODE, "\223\137\344\252", 0, "D3 67 F5 54 00 EC 11 EC 00", "K2 (Shift JIS)" },
        /* 24*/ { DATA_MODE, "点茗", 0, "9B 9E 0A E7 A2 32 5C 00 00", "B6 (UTF-8)" },
        /* 25*/ { UNICODE_MODE, "点茗・", 0, "D3 67 F5 55 0D 28 00 EC 00", "K2 B1 (Shift JIS)" },
        /* 26*/ { DATA_MODE, "\223\137\344\252\245", 0, "D3 67 F5 55 0D 28 00 EC 00", "K2 B1 (Shift JIS)" },
        /* 27*/ { DATA_MODE, "点茗・", 0, "A7 9E 0A E7 A2 32 5F BE F6 94 00", "B9 (UTF-8)" },
        /* 28*/ { UNICODE_MODE, "¥点茗・", 0, "99 72 4D 7F 92 AA 94 00 00", "B6 (Shift JIS) (optimized from B1 K2 B1)" },
        /* 29*/ { DATA_MODE, "\134\223\137\344\252\245", 0, "99 72 4D 7F 92 AA 94 00 00", "B6 (Shift JIS) (optimized from B1 K2 B1)" },
        /* 30*/ { DATA_MODE, "¥点茗・", 0, "4B C2 A5 E7 82 B9 E8 8C 97 EF BD A5 00 00", "B11 (UTF-8)" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_MICROQR;
        symbol->input_mode = data[i].input_mode;
        symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        #ifdef TEST_MICROQR_INPUT_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %s, \"%s\", \"%s\" },\n",
                i, testUtilInputModeName(data[i].input_mode), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret),
                symbol->errtxt, data[i].comment);
        #else
        if (ret < 5) {
            assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

// Check MICROQR padding (4-bit final codeword for M1 and M3 in particular)
static void test_microqr_padding(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int option_1;
        int ret;
        char* expected;
        char* comment;
    };
    struct item data[] = {
        /*  0*/ { "1", -1, 0, "22 00 00", "M1, bits left 13" },
        /*  1*/ { "12", -1, 0, "43 00 00", "M1, bits left 10" },
        /*  2*/ { "123", -1, 0, "63 D8 00", "M1, bits left 7" },
        /*  3*/ { "1234", -1, 0, "83 DA 00", "M1, bits left 3" },
        /*  4*/ { "12345", -1, 0, "A3 DA D0", "M1, bits left 0" },
        /*  5*/ { "12345678", 1, 0, "40 F6 E4 4E 00", "M2-L, bits left 8" },
        /*  6*/ { "123456789", 1, 0, "48 F6 E4 62 A0", "M2-L, bits left 5" },
        /*  7*/ { "1234567890", 1, 0, "50 F6 E4 62 A0", "M2-L, bits left 1" },
        /*  8*/ { "12345678", 2, 0, "40 F6 E4 4E", "M2-M, bits left 0" },
        /*  9*/ { "ABCDEF", 1, 0, "E3 9A 8A 54 28", "M2-L, bits left 3" },
        /* 10*/ { "ABCDE", 2, 0, "D3 9A 8A 4E", "M2-M, bits left 0" },
        /* 11*/ { "123456789012345678901", 1, 0, "2A 3D B9 18 A8 18 AC D4 DC 28 00", "M3-L, bits left 7" },
        /* 12*/ { "1234567890123456789012", 1, 0, "2C 3D B9 18 A8 18 AC D4 DC 29 00", "M3-L, bits left 3" },
        /* 13*/ { "12345678901234567890123", 1, 0, "2E 3D B9 18 A8 18 AC D4 DC 29 70", "M3-L, bits left 0" },
        /* 14*/ { "123456789012345678", 2, 0, "24 3D B9 18 A8 18 AC D4 C0", "M3-M, bits left 1" },
        /* 15*/ { "ABCDEFGHIJKLMN", 1, 0, "78 E6 A2 95 0A B8 59 EB 99 7E A0", "M3-L, bits left 1" },
        /* 16*/ { "ABCDEFGHIJK", 2, 0, "6C E6 A2 95 0A B8 59 EA 80", "M3-M, bits left 1" },
        /* 17*/ { "1234567890123456789012345678901234", 1, 0, "11 0F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0 F6 80", "M4-L, bits left 5" },
        /* 18*/ { "12345678901234567890123456789012345", 1, 0, "11 8F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0 F6 B4", "M4-L, bits left 1" },
        /* 19*/ { "123456789012345ABCDEFGHIJK", 1, 0, "07 8F 6E 46 2A 06 2B 25 67 35 14 A8 55 C2 CF 54", "M4-L, bits left 0" },
        /* 20*/ { "123456789012345678901234567890", 2, 0, "0F 0F 6E 46 2A 06 2B 35 37 0A 75 46 FB D0", "M4-M, bits left 3" },
        /* 21*/ { "123456789012345678901", 3, 0, "0A 8F 6E 46 2A 06 2B 35 37 0A", "M4-Q, bits left 1" },
        /* 22*/ { "ABCDEFGHIJKLMNOPQRSTU", 1, 0, "35 39 A8 A5 42 AE 16 7A E6 5F AC 51 95 B4 25 E0", "M4-L, bits left 4" },
        /* 23*/ { "ABCDEFGHIJKLMNOPQR", 2, 0, "32 39 A8 A5 42 AE 16 7A E6 5F AC 51 95 A0", "M4-M, bits left 5" },
        /* 24*/ { "ABCDEFGHIJKLM", 3, 0, "2D 39 A8 A5 42 AE 16 7A E6 56", "M4-Q, bits left 0" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_MICROQR;
        symbol->input_mode = UNICODE_MODE;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_MICROQR_PADDING_GENERATE_EXPECTED
        printf("        /*%3d*/ { \"%s\", %d, %s, \"%s\", \"%s\" },\n",
                i, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), data[i].option_1,
                testUtilErrorName(data[i].ret), symbol->errtxt, data[i].comment);
        #else
        if (ret < 5) {
            assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_microqr_optimize(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int option_1;
        int option_2;
        int ret;
        char* expected;
        char* comment;
    };
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "1", -1, -1, 0, "22 00 00", "N1" },
        /*  1*/ { UNICODE_MODE, "A123", 1, 2, 0, "92 86 3D 80 EC", "A1 N3" },
        /*  2*/ { UNICODE_MODE, "AAAAAA", 1, -1, 0, "E3 98 73 0E 60", "A6" },
        /*  3*/ { UNICODE_MODE, "AA123456", 1, -1, 0, "A3 98 61 ED C8", "A2 N6" },
        /*  4*/ { UNICODE_MODE, "01a", 1, 3, 0, "04 06 16 10 00 EC 11 EC 11 EC 00", "N3 B1" },
        /*  5*/ { UNICODE_MODE, "01a", 1, 4, 0, "43 30 31 61 00 00 EC 11 EC 11 EC 11 EC 11 EC 11", "B3" },
        /*  6*/ { UNICODE_MODE, "ã“ã‚“waã€Î±Î²", 1, -1, 0, "46 82 B1 82 F1 77 61 66 00 10 FF 88 00 00 EC 11", "B6 K3" },
        /*  7*/ { UNICODE_MODE, "ã“ã‚“ã«waã€Î±Î²", 1, -1, 0, "66 13 10 B8 85 25 09 DD 85 98 00 43 FE 20 00 00", "K3 B2 K3" },
        /*  8*/ { UNICODE_MODE, "ã“ã‚“AB123\177", 1, 3, 0, "D0 4C 42 E2 91 CD 06 3D C2 FE 00", "K2 A2 N3 B1" },
        /*  9*/ { UNICODE_MODE, "ã“ã‚“AB123\177", 1, 4, 0, "64 13 10 B8 92 9C D0 5E 1A 0B F8 00 EC 11 EC 11", "K2 A5 B1" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_MICROQR;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }
        symbol->debug = ZINT_DEBUG_TEST;

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_MICROQR_OPTIMIZE_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %d, %d, %s, \"%s\", \"%s\" },\n",
                i, testUtilInputModeName(data[i].input_mode), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), data[i].option_1, data[i].option_2,
                testUtilErrorName(data[i].ret), symbol->errtxt, data[i].comment);
        #else
        assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_microqr_encode(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int option_1;
        int option_2;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        char* expected;
    };
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "12345", -1, -1, 0, 11, 11, "Max capacity M1 5 numbers",
                    "11111110101"
                    "10000010110"
                    "10111010100"
                    "10111010000"
                    "10111010111"
                    "10000010011"
                    "11111110100"
                    "00000000011"
                    "11001110011"
                    "01010001100"
                    "11110000011"
               },
        /*  1*/ { UNICODE_MODE, "1234567890", -1, -1, 0, 13, 13, "Max capacity M2-L 10 numbers",
                    "1111111010101"
                    "1000001010110"
                    "1011101010001"
                    "1011101011011"
                    "1011101000110"
                    "1000001011101"
                    "1111111010011"
                    "0000000011101"
                    "1101101010100"
                    "0111100000010"
                    "1111001001101"
                    "0110010100110"
                    "1001101111111"
               },
        /*  2*/ { UNICODE_MODE, "12345678", 2, -1, 0, 13, 13, "Max capacity M2-M 8 numbers",
                    "1111111010101"
                    "1000001011000"
                    "1011101011101"
                    "1011101001101"
                    "1011101001000"
                    "1000001010001"
                    "1111111000001"
                    "0000000000111"
                    "1110011110000"
                    "0111000000000"
                    "1110010000111"
                    "0101011001100"
                    "1100110101001"
               },
        /*  3*/ { UNICODE_MODE, "12345678901234567890123", -1, -1, 0, 15, 15, "Max capacity M3-L 23 numbers",
                    "111111101010101"
                    "100000100110110"
                    "101110100011111"
                    "101110100100110"
                    "101110101101010"
                    "100000101010111"
                    "111111101111110"
                    "000000001000010"
                    "111101100000100"
                    "011110110100111"
                    "110111110001111"
                    "001111011000101"
                    "110000101011000"
                    "010011000101101"
                    "100111010001111"
               },
        /*  4*/ { UNICODE_MODE, "123456789012345678", 2, -1, 0, 15, 15, "Max capacity M3-L 18 numbers",
                    "111111101010101"
                    "100000100010110"
                    "101110101101111"
                    "101110101110110"
                    "101110101011010"
                    "100000101000111"
                    "111111100001110"
                    "000000001110010"
                    "100001101110100"
                    "010101111000111"
                    "101010111001111"
                    "001101001000100"
                    "110001101011001"
                    "001110000101101"
                    "110011111001111"
               },
        /*  5*/ { UNICODE_MODE, "12345678901234567890123456789012345", -1, -1, 0, 17, 17, "Max capacity M4-L 35 numbers",
                    "11111110101010101"
                    "10000010111010001"
                    "10111010000011001"
                    "10111010101000100"
                    "10111010000011001"
                    "10000010111100001"
                    "11111110101011100"
                    "00000000000111001"
                    "10010111011011001"
                    "00101001011010011"
                    "11101001100101000"
                    "00100011110000100"
                    "11101101010110010"
                    "01100001101110010"
                    "11100000000010011"
                    "01110010010111010"
                    "11001001111110111"
               },
        /*  6*/ { UNICODE_MODE, "123456789012345678901234567890", 2, -1, 0, 17, 17, "Max capacity M4-M 30 numbers",
                    "11111110101010101"
                    "10000010011010001"
                    "10111010000011001"
                    "10111010001000100"
                    "10111010100011001"
                    "10000010011100001"
                    "11111110001011100"
                    "00000000000111001"
                    "10100101011011001"
                    "01000111000010011"
                    "11001000110101000"
                    "00101011111000100"
                    "10100001001110011"
                    "00000001010110011"
                    "11010010101010000"
                    "00001111000111000"
                    "11100110111110111"
               },
        /*  7*/ { UNICODE_MODE, "123456789012345678901", 3, -1, 0, 17, 17, "Max capacity M4-Q 21 numbers",
                    "11111110101010101"
                    "10000010010101101"
                    "10111010010010101"
                    "10111010100010111"
                    "10111010000101010"
                    "10000010110001101"
                    "11111110010010000"
                    "00000000101101010"
                    "10110001110101010"
                    "00000010001001111"
                    "10011101011110100"
                    "00001100000100111"
                    "11111001110010001"
                    "01110100011101101"
                    "11110001010001110"
                    "00000001110011011"
                    "11011110011010100"
               },
        /*  8*/ { UNICODE_MODE, "点茗テ点茗テ点茗テ", -1, -1, 0, 17, 17, "Max capacity M4-L 9 Kanji",
                    "11111110101010101"
                    "10000010111110010"
                    "10111010000011101"
                    "10111010110011010"
                    "10111010001011001"
                    "10000010110110110"
                    "11111110101100100"
                    "00000000010011011"
                    "10010111011110100"
                    "00001010100100110"
                    "11101010001000010"
                    "00010111101000010"
                    "11000100010110000"
                    "01001111010011101"
                    "10000100101100011"
                    "01011000000010111"
                    "11001111011101001"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_MICROQR;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_MICROQR_ENCODE_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %d, %d, %s, %d, %d, \"%s\",\n",
                i, testUtilInputModeName(data[i].input_mode), data[i].data, data[i].option_1, data[i].option_2, testUtilErrorName(data[i].ret),
                symbol->rows, symbol->width, data[i].comment);
        testUtilModulesDump(symbol, "                    ", "\n");
        printf("               },\n");
        #else
        if (ret < 5) {
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);

            if (ret == 0) {
                int width, row;
                ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
                assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);
            }
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_upnqr_input(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int ret;
        char* expected;
        char* comment;
    };
    // Ä„ U+0104 in ISO 8859-2 0xA1, in other ISO 8859 and Win 1250, UTF-8 C484
    // Å” U+0154 in ISO 8859-2 0xC0, in Win 1250 but not other ISO 8859 or Win page, UTF-8 C594
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, not in Shift JIS, UTF-8 C3A9
    // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in Shift JIS 0x83C0, UTF-8 CEB2
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "ĄŔ", 0, "(415) 70 44 00 02 A1 C0 00 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC", "ECI-4 B2 (ISO 8859-2)" },
        /*  1*/ { UNICODE_MODE, "é", 0, "(415) 70 44 00 01 E9 00 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11", "ECI-4 B1 (ISO 8859-2)" },
        /*  2*/ { UNICODE_MODE, "β", ZINT_ERROR_INVALID_DATA, "Error 572: Invalid characters in input data", "β not in ISO 8859-2" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_UPNQR;
        symbol->input_mode = data[i].input_mode;
        symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);
        assert_equal(symbol->eci, 4, "i:%d ZBarcode_Encode symbol->eci %d != 4\n", i, symbol->eci);

        #ifdef TEST_UPNQR_INPUT_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %s, \"%s\", \"%s\" },\n",
                i, testUtilInputModeName(data[i].input_mode), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret),
                symbol->errtxt, data[i].comment);
        #else
        if (ret < 5) {
            assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_upnqr_encode(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int option_1;
        int option_2;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        char* expected;
    };

    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "Ą˘Å¤ĽŚ§¨ŠŞŤŹŽŻ°ą˛ł´ľśˇ¸šşťźËžżŔÃÂĂÄĹĆÇČÉĘËĚÃÃŽÄŽÄŃŇÓÔÅÖ×ŘŮÚŰÜÃŢßŕáâăäĺćçÄéęëěíîÄđńňóôőö÷řůúűüýţ˙", -1, -1, 0, 77, 77, "ISO 8859-2",
                    "11111110000111101001000110101100101001111110111011001111111000110000001111111"
                    "10000010001011100100110111111011110100001011110000100001001110011010101000001"
                    "10111010110101111111101101111101001010110101111011011110100001100100101011101"
                    "10111010100110111001110101101000011101101000110011100111001111101000101011101"
                    "10111010100110010010011011111101001001111101101111101001101111001011101011101"
                    "10000010101011011010010010001010010101101010111000100011001110100010001000001"
                    "11111110101010101010101010101010101010101010101010101010101010101010101111111"
                    "00000000110101001100101010001100001011110010011000111100111000000000100000000"
                    "10111110010111011110010011111001111100101111111111100001010110011010001111100"
                    "10000001110110110001011001111100101000111010111001001101111100111000111100000"
                    "11111110110010111100110011101011110100001111110110101111010110000010001011010"
                    "00001100011100001010101111010101001111110100011101010110101000110000010100000"
                    "11010011100111011010010001110000010010101001110101111101001110000010101001010"
                    "10000100100110010010011000011101010111111100111011010111100100100001011100000"
                    "11101110110010111100110111110010001010001011110000110001011110000011101011010"
                    "00001100011110101011101111011101101010010010011011011010110000111001110100000"
                    "11011111111100011010010101110001111101001111110011000011010110000010001001010"
                    "10010000100101010010011100001100101000011010111000101001111100101000111100010"
                    "11110110111100011100110011100011110101001111110110101011110110000010001111001"
                    "00111100010001101011101111000010101111100010001101110100011000111100110010011"
                    "11000111111100011010010111101111011010110111100110111100110110000111111111001"
                    "10000000111001110010011100010010001111100010101011110110011100101010111010000"
                    "11111110100100111100110001101111110010010111110011111000010110000001110010010"
                    "00111000000011101011111101001011010100010010000101011010111000111101011100000"
                    "11111111110110011010001011111110000001001111101111101011010110000001111110010"
                    "11101000100001111010011010001011010000011010101000111001111100101111100011100"
                    "10001010111100101100110110101110000101001111111010100011110100000101101010010"
                    "01011000101001110011101110001011001000000011011000111000011011111100100010101"
                    "01101111101010001010011011111110011011010110011111111010110001000100111111001"
                    "01100101111101101010010101101011001010000011000101100000011011001101101001110"
                    "01010110111100110000110110010110010101010110010101001010110010000010010101111"
                    "11110000101111101011011001101011010110001010000000110000011001111111001010010"
                    "01000010001010001010001111001110000011000111110110011011110110100100110110101"
                    "10110101111001101010100101101011010110011010100110010000111100101110101101110"
                    "01111110011100110001111110010110000011001111101000111011010111001000001100100"
                    "01111101101001101001101001001011010110011001011110010000001101110011100101110"
                    "00011110001000001001011110001110000011001100001101111010100101111010100000000"
                    "00110001111011111101110101101011010110001101010111110001000101110001110010010"
                    "00111111111101100001110110010110000011011010010001011011101100110010000101001"
                    "11111100101101010011000001101111010110000101100110110000000001011101110110011"
                    "10011110101001010101000111101100000011010000010100011010111001100100100011001"
                    "00110000111011111100100100001011010110000110100110010000011001001111101001110"
                    "00111111111100101111110110110110000011010111101000111010101100100000011000101"
                    "00111100101101001100100001001100010111100010111110010100011110000111101111111"
                    "00011110101000110101001110001101100010010110101100111110110110001100110010001"
                    "00110001011010010000110111100000110110000011110110010000010110101111110111110"
                    "11111111111100101001111011111011100010010110101111111110110100001000111110101"
                    "00111000101101001011000110001111010111100101001000110110000011110110100011111"
                    "00011010110001110111001110101000000010110000001010111000101001111101101010001"
                    "00111000100011110100110010001001010110100101011000110100000011011111100011110"
                    "11111111100101101100111011111000000011010010001111110110111000101000111110101"
                    "00111101101101001000000100110000001010000011011000111000010011001111100011111"
                    "00011111100000110000101100100101110101010110000110000010110001110101010110001"
                    "00111100100011110000110010000100100000000011001100101000011011000110100011110"
                    "11000010000101001110011100001101110101010110000110001010110000101001010110101"
                    "00101100101110101001000110101000101111100101011000110100001011010111100011111"
                    "00011110001010110000101011101111111010110000000110011100101001111101110110001"
                    "00011100001000010000110010100000101111100101001100110110000011010110000011100"
                    "11000011000101101110011100010011100010010010000100010000011000111000110110110"
                    "00000101111010001001000010001001010010010101011010111010100011010110000011100"
                    "00011110011001110000101100100101000101001000000000000011001001111110010110010"
                    "00111100000101110000110101000000010000011101001010101001100011010010100011010"
                    "11100110111101101110001011001111100101001010000010000011111000111101010111001"
                    "00010001110110000001001101010000001001100101011000111100000011010111100011111"
                    "10010010000001111000111010111101111000110000000110001100101001111001010110101"
                    "10010000000111110000111011001000101001100101000101111110000011010001100011110"
                    "01001110100011111110011101000111110100010010001101001000011010111010110110010"
                    "00001001111000001001000001001000010111110100010010100110100001010111100010101"
                    "01111010010011110000101011111101100010101001101111111101001111011101111110101"
                    "00000000110101101000111110001000110011111100101000100111100101010101100011101"
                    "11111110001101111010001010101111100100001011101010100001011101011010101011100"
                    "10000010111110000001101010001000001011111101001000111110000011010001100010010"
                    "10111010110101110101011111111101111100100000011111100101101000111011111111101"
                    "10111010110001100110111110110000101001111101010001101110100010110000010010010"
                    "10111010101011111111010111011111110100001010011011000001111000110011100101010"
                    "10000010011100010001111111000000001011100000001000111111100001011101111000001"
                    "11111110110101111101111001011101111100101101111101100101000101100100011101000"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_UPNQR;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_UPNQR_ENCODE_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %d, %d, %s, %d, %d, \"%s\",\n",
                i, testUtilInputModeName(data[i].input_mode), data[i].data, data[i].option_1, data[i].option_2, testUtilErrorName(data[i].ret),
                symbol->rows, symbol->width, data[i].comment);
        testUtilModulesDump(symbol, "                    ", "\n");
        printf("               },\n");
        #else
        if (ret < 5) {
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);

            if (ret == 0) {
                int width, row;
                ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
                assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);
            }
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_rmqr_options(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int option_1;
        int option_2;
        int ret_encode;
        int ret_vector;
        int expected_rows;
        int expected_width;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "12345", -1, -1, 0, 0, 11, 27 }, // ECC auto-set to H, version auto-set to 11 (R11x27)
        /*  1*/ { "12345", 4, 11, 0, 0, 11, 27 },
        /*  2*/ { "12345", 1, -1, ZINT_ERROR_INVALID_OPTION, -1, 0, 0 }, // ECC L not available
        /*  3*/ { "12345", 3, -1, ZINT_ERROR_INVALID_OPTION, -1, 0, 0 }, // ECC Q not available
        /*  4*/ { "123456789", 4, 11, 0, 0, 11, 27 }, // Max capacity ECC H, version 11, 9 numbers
        /*  5*/ { "1234567890", 4, 11, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /*  6*/ { "12345678901234", 2, 11, 0, 0, 11, 27 }, // Max capacity ECC M, version 11, 14 numbers
        /*  7*/ { "123456789012345", 2, 11, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /*  8*/ { "ABCDEF", 4, 11, 0, 0, 11, 27 }, // Max capacity ECC H, version 11, 6 letters
        /*  9*/ { "ABCDEFG", 4, 11, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 10*/ { "ABCDEFGH", 2, 11, 0, 0, 11, 27 }, // Max capacity ECC M, version 11, 8 letters
        /* 11*/ { "ABCDEFGHI", 2, 11, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 12*/ { "\177\177\177\177", 4, 11, 0, 0, 11, 27 }, // Max capacity ECC H, version 11, 4 bytes
        /* 13*/ { "\177\177\177\177\177", 4, 11, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 14*/ { "\177\177\177\177\177\177", 2, 11, 0, 0, 11, 27 }, // Max capacity ECC M, version 11, 6 bytes
        /* 15*/ { "\177\177\177\177\177\177\177", 2, 11, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 16*/ { "点茗", 4, 11, 0, 0, 11, 27 }, // Max capacity ECC H, version 11, 2 kanji
        /* 17*/ { "点茗点", 4, 11, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 18*/ { "点茗点", 2, 11, 0, 0, 11, 27 }, // Max capacity ECC M, version 11, 3 kanji
        /* 19*/ { "点茗点茗", 2, 11, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 20*/ { "12345", -1, 1, 0, 0, 7, 43 }, // ECC auto-set to M, version 1 (R7x43)
        /* 21*/ { "12345", 2, 1, 0, 0, 7, 43 },
        /* 22*/ { "12345", 4, 1, 0, 0, 7, 43 }, // Max capacity ECC H, version 1, 5 numbers
        /* 23*/ { "123456", 4, 1, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 24*/ { "123456789012", 2, 1, 0, 0, 7, 43 }, // Max capacity ECC M, version 1, 12 numbers
        /* 25*/ { "1234567890123", 2, 1, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 26*/ { "ABC", 4, 1, 0, 0, 7, 43 }, // Max capacity ECC H, version 1, 3 letters
        /* 27*/ { "ABCD", 4, 1, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 28*/ { "ABCDEFG", 2, 1, 0, 0, 7, 43 }, // Max capacity ECC M, version 1, 7 letters
        /* 29*/ { "ABCDEFGH", 2, 1, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 30*/ { "\177\177", 4, 1, 0, 0, 7, 43 }, // Max capacity ECC H, version 1, 2 bytes
        /* 31*/ { "\177\177\177", 4, 1, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 32*/ { "\177\177\177\177\177", 2, 1, 0, 0, 7, 43 }, // Max capacity ECC M, version 1, 5 bytes
        /* 33*/ { "\177\177\177\177\177\177", 2, 1, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 34*/ { "点", 4, 1, 0, 0, 7, 43 }, // Max capacity ECC H, version 1, 1 kanji
        /* 35*/ { "点茗", 4, 1, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 36*/ { "点茗点", 2, 1, 0, 0, 7, 43 }, // Max capacity ECC M, version 1, 3 kanji
        /* 37*/ { "点茗点茗", 2, 1, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 38*/ { "12345678901234567890123", 4, 7, 0, 0, 9, 59 }, // Max capacity ECC H, version 7 (R9x59), 23 numbers
        /* 39*/ { "123456789012345678901234", 4, 7, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 40*/ { "点茗点茗点茗", 4, 7, 0, 0, 9, 59 }, // Max capacity ECC H, version 7, 6 kanji
        /* 41*/ { "点茗点茗点茗点", 4, 7, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 42*/ { "点茗点茗点茗点茗", 4, 13, 0, 0, 11, 59 }, // Max capacity ECC H, version 13 (R11x59), 8 kanji
        /* 43*/ { "点茗点茗点茗点茗点", 4, 13, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 44*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点", 4, 20, 0, 0, 13, 77 }, // Max capacity ECC H, version 20 (R13x77), 17 kanji
        /* 45*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗", 4, 20, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 46*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点点茗点茗点茗点", 4, 26, 0, 0, 15, 99 }, // Max capacity ECC H, version 26 (R15x99), 24 kanji
        /* 47*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点点茗", 4, 26, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 48*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗", 4, 32, 0, 0, 17, 139 }, // Max capacity ECC H, version 32 (R17x139), 46 kanji
        /* 49*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点", 4, 32, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 50*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗", -1, 32, 0, 0, 17, 139 }, // ECC auto-set to M, version 32
        /* 51*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗", -1, 32, 0, 0, 17, 139 }, // Max capacity ECC M, version 32, 92 kanji
        /* 52*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点茗点", 4, 32, ZINT_ERROR_TOO_LONG, -1, 0, 0 },
        /* 53*/ { "点茗点", -1, 33, 0, 0, 7, 43 }, // ECC auto-set to M, version 33 (R7xAuto-width) auto-sets R7x43
        /* 54*/ { "点茗点", 4, 33, 0, 0, 7, 59 }, // ECC set to H, version 33 (R7xAuto-width) auto-sets R7x59
        /* 55*/ { "点茗点", -1, 34, 0, 0, 9, 43 }, // ECC auto-set to H, version 34 (R9xAuto-width) auto-sets R9x43
        /* 56*/ { "点茗点", -1, 35, 0, 0, 11, 27 }, // ECC auto-set to M, version 35 (R11xAuto-width) auto-sets R11x27
        /* 57*/ { "点茗点茗点茗点", 4, 35, 0, 0, 11, 59 }, // ECC set to H, version 35 (R11xAuto-width) auto-sets R11x59
        /* 58*/ { "点茗点茗点茗点", -1, 35, 0, 0, 11, 43 }, // ECC auto-set to M, version 35 (R11xAuto-width) auto-sets R11x43
        /* 59*/ { "点茗点茗点茗点茗", -1, 36, 0, 0, 13, 43 }, // ECC auto-set to M, version 36 (R13xAuto-width) auto-sets R13x43
        /* 60*/ { "点茗点茗点茗点茗", 4, 36, 0, 0, 13, 59 }, // ECC set to H, version 36 (R13xAuto-width) auto-sets R13x59
        /* 61*/ { "点茗点茗点茗点茗点", -1, 37, 0, 0, 15, 43 }, // ECC auto-set to M, version 37 (R15xAuto-width) auto-sets R15x43
        /* 62*/ { "点茗点茗点茗点茗点", 4, 37, 0, 0, 15, 59 }, // ECC set to H, version 37 (R15xAuto-width) auto-sets R15x59
        /* 63*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗", -1, 38, 0, 0, 17, 43 }, // ECC auto-set to M, version 38 (R17xAuto-width) auto-sets R17x43
        /* 64*/ { "点茗点茗点茗点茗点茗点茗点茗点茗点茗", 4, 38, 0, 0, 17, 77 }, // ECC set to H, version 38 (R17xAuto-width) auto-sets R17x77
        /* 65*/ { "点茗点", -1, 39, ZINT_ERROR_INVALID_OPTION, -1, 0, 0 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_RMQR;
        symbol->input_mode = UNICODE_MODE;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret_encode, symbol->errtxt);

        if (data[i].ret_vector != -1) {
            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_rmqr_input(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int ret;
        char* expected;
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, not in Shift JIS, UTF-8 C3A9
    // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in Shift JIS 0x83C0, UTF-8 CEB2
    // ภU+0E01 in ISO 8859-11 Thai (but not other ISO 8859 or Win page), not in Shift JIS, UTF-8 E0B881
    // Ж U+0416 in ISO 8859-5 Cyrillic (but not other ISO 8859), Win 1251, in Shift JIS 0x8447, UTF-8 D096
    // ຠU+0E81 Lao not in any ISO 8859 (or Win page) or Shift JIS, UTF-8 E0BA81
    // ¥ U+00A5 in ISO 8859-1 0xA5 (\245), in Shift JIS single-byte 0x5C (\134) (backslash); 0xA5 same codepoint as single-byte half-width katakana ・ (U+FF65) in Shift JIS (below), UTF-8 C2A5
    // ï½¥ U+FF65 half-width katakana, not in ISO/Win, in Shift JIS single-byte 0xA5 (\245), UTF-8 EFBDA5
    // ¿ U+00BF in ISO 8859-1 0xBF (\277), not in Shift JIS; 0xBF same codepoint as single-byte half-width katakana ソ (U+FF7F) in Shift JIS (below), UTF-8 C2BF
    // ソ U+FF7F half-width katakana, not in ISO/Win, in Shift JIS single-byte 0xBF (\277), UTF-8 EFBDBF
    // ‾ U+203E overline, not in ISO/Win, in Shift JIS single-byte 0x7E (\176) (tilde), UTF-8 E280BE
    // 点 U+70B9 kanji, in Shift JIS 0x935F (\223\137), UTF-8 E782B9
    // 茗 U+8317 kanji, in Shift JIS 0xE4AA (\344\252), UTF-8 E88C97
    // テ U+30C6 katakana, in Shift JIS 0x8365 (\203\145), UTF-8 E38386
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "é", 0, "67 A4 00 EC 11", "B1 (ISO 8859-1)" },
        /*  1*/ { DATA_MODE, "é", 0, "6B 0E A4 00 EC", "B2 (UTF-8)" },
        /*  2*/ { DATA_MODE, "\351", 0, "67 A4 00 EC 11", "B1 (ISO 8859-1)" },
        /*  3*/ { UNICODE_MODE, "β", 0, "88 80 00 EC 11", "K1 (Shift JIS)" },
        /*  4*/ { UNICODE_MODE, "à¸", ZINT_ERROR_INVALID_DATA, "Error 800: Invalid character in input data", "ภnot in ISO 8859-1 or Shift JIS" },
        /*  5*/ { UNICODE_MODE, "Ж", 0, "88 91 C0 EC 11", "K1 (Shift JIS)" },
        /*  6*/ { UNICODE_MODE, "¥・点", 0, "71 72 96 4D 7C", "B2 K1 (Shift JIS) (optimized to byte mode only)" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_RMQR;
        symbol->input_mode = data[i].input_mode;
        symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        #ifdef TEST_RMQR_INPUT_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %s, \"%s\", \"%s\" },\n",
                i, testUtilInputModeName(data[i].input_mode), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret),
                symbol->errtxt, data[i].comment);
        #else
        if (ret < 5) {
            assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_rmqr_gs1(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int ret;
        char* expected;
        char* comment;
    };
    struct item data[] = {
        /*  0*/ { "[01]12345678901234", 0, "A6 00 59 D5 1B EF 43 DA 00 EC 11 EC", "N16" },
        /*  1*/ { "[01]04912345123459[15]970331[30]128[10]ABC123", 0, "A5 D0 29 EB 3A A0 05 67 93 F2 94 B4 B4 E2 4E AF 01 47 EC 17 86", "N29 A9" },
        /*  2*/ { "[91]12%[20]12", 0, "A4 9C 79 32 25 1D 24 32 48 00 EC 11", "N4 B2 N4" },
        /*  3*/ { "[91]123%[20]12", 0, "A4 BC 79 74 3D A9 31 21 92 40 EC 11", "N5 A2 N4" },
        /*  4*/ { "[91]1234%[20]12", 0, "A4 DC 79 D4 C8 94 74 90 C9 20 EC 11", "N6 B2 N4" },
        /*  5*/ { "[91]12345%[20]12", 0, "A4 FC 79 D4 A8 7B 52 62 43 24 80 EC", "N7 A2(3) N4" },
        /*  6*/ { "[91]1A%[20]12", 0, "A8 E6 58 1B ED 49 89 0C 92 00 EC 11", "A6(7) N4" },
        /*  7*/ { "[91]%%[20]12", 0, "A4 56 D9 92 92 8E 92 19 24 00 EC 11", "N2 B3 N4" },
        /*  8*/ { "[91]%%%[20]12", 0, "A4 56 DA 12 92 92 8E 92 19 24 00 EC", "N2 B4 N4" },
        /*  9*/ { "[91]A%%%%12345678A%A", 0, "A8 A6 58 F4 4C C6 4A 4A 4A 48 1E DC 89 C8 87 A3 5C 00 EC", "A4(5) B3 N8 A3(4)" },
        /* 10*/ { "[91]%23%%6789%%%34567%%%%234%%%%%", 0, "(33) AA 63 2D B5 02 EE D4 DA 84 54 B8 ED 4D A9 B5 04 58 E7 2C 3B 53 6A 6D 4D 60 22 F6 A3", "A27(38) B4" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_RMQR;
        symbol->input_mode = GS1_MODE;
        symbol->debug = ZINT_DEBUG_TEST; // Needed to get codeword dump in errtxt

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret);

        #ifdef TEST_RMQR_GS1_GENERATE_EXPECTED
        printf("        /*%3d*/ { \"%s\", %s, \"%s\", \"%s\" },\n",
                i, testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), testUtilErrorName(data[i].ret), symbol->errtxt, data[i].comment);
        #else
        if (ret < 5) {

            assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_rmqr_optimize(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int option_1;
        int ret;
        char* expected;
        char* comment;
    };
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "1", -1, 0, "21 10 EC 11 EC", "N1" },
        /*  1*/ { UNICODE_MODE, "AAA", -1, 0, "46 73 0A 00 EC", "A3" },
        /*  2*/ { UNICODE_MODE, "0123456789", -1, 0, "2A 03 15 9A 9A 40 EC", " N10 (nayuki.io - pure numeric)" },
        /*  3*/ { UNICODE_MODE, "ABCDEF", -1, 0, "4C 73 51 4A 85 00 EC", "A6 (nayuki.io - pure alphanumeric)" },
        /*  4*/ { UNICODE_MODE, "wxyz", -1, 0, "71 DD E1 E5 E8", "B4 (nayuki.io - pure byte)" },
        /*  5*/ { UNICODE_MODE, "「魔法少女ã¾ã©ã‹â˜†ãƒžã‚®ã‚«ã€ã£ã¦ã€ã€€Ð˜ÐИ desu κα?", -1, 0, "(53) 8E 80 D6 00 4F C0 57 6A B5 C2 B8 14 70 94 81 64 37 A1 8D 0C 50 0D 82 82 14 40 00 80", "K29 (nayuki.io - pure kanji)" },
        /*  6*/ { UNICODE_MODE, "012A", -1, 0, "48 00 43 20 EC", "A4" },
        /*  7*/ { UNICODE_MODE, "0123A", -1, 0, "24 03 0D 09 40", "N4 A1 (nayuki.io - alpha/numeric)" },
        /*  8*/ { UNICODE_MODE, "0a", -1, 0, "68 C1 84 00 EC", "B2 (nayuki.io - numeric/byte)" },
        /*  9*/ { UNICODE_MODE, "01a", -1, 0, "22 02 CB 08 EC", "N2 B1 (nayuki.io - numeric/byte)" },
        /* 10*/ { UNICODE_MODE, "ABCa", -1, 0, "71 05 09 0D 84", "B4 (nayuki.io - alphanumeric/byte)" },
        /* 11*/ { UNICODE_MODE, "ABCDa", -1, 0, "48 73 51 4B 2C 20 EC", "A4 B1 (same bits as B5)" },
        /* 12*/ { UNICODE_MODE, "THE SQUARE ROOT OF 2 IS 1.41421356237309504880168872420969807856967187537694807317667973799", -1, 0, "(48) 46 A9 52 9A A0 D5 42 66 E6 F8 A1 4F 62 3E 56 CC D4 40 2B 98 2C F1 AB 19 2E A2 F8 61", " A26 N65 (nayuki.io - alpha/numeric)" },
        /* 13*/ { UNICODE_MODE, "Golden ratio φ = 1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374......", -1, 0, "(73) 65 11 DB DB 19 19 5B 88 1C 98 5D 1A 5B C8 20 F4 C8 0F 48 0C 4B 8B 24 D4 10 FB 97 6E", "B20 N100 A6 (nayuki.io - alpha/numeric/byte)" },
        /* 14*/ { UNICODE_MODE, "ã“ã‚“ã«ã¡waã€ä¸–ç•Œï¼ Î±Î²Î³Î´", -1, 0, "84 09 88 5C 42 92 13 F6 B7 76 18 14 19 0A 28 A4 58 14 92 08 40 FF 88 00 40 22 02", "K4 B7 K4 (nayuki.io - kanji/european)" },
        /* 15*/ { UNICODE_MODE, "6547861663com.acme35584af52fa3-88d0-093b-6c14-b37ddafb59c528908608sg.com.dash.www05303790265903SG.COM.NETS46967004B2AE13344004SG.SGQR209710339382.6359SG8236HELLO FOO2517Singapore3272B815", -1, 0, "(152) 20 AA 3B 12 29 8D 97 B1 B7 B6 97 30 B1 B6 B2 99 9A 9A 9C 1A 30 B3 1A 99 33 30 99 96", "N10 B47 N9 B15 N14 A38 N12 A25 B8 A8 (nayuki.io - SGQR alpha/numeric/byte)" },
        /* 16*/ { UNICODE_MODE, "2004年大西洋颶風季是有以æ¥é€ æˆäººå¤±æƒ¨é‡çš„大季之一,于2004å¹´6月1日正å¼å§‹ï¼ŒåŒå¹´11月30æ—¥æŸï¼Œä¸Šçš„æ—¥æœŸç•Œå®šäº†ä¸€å¹´ä¸­å¤§å¤šæ•°æ°”旋在大西洋形æˆçš„æ®µlll ku", -1, 0, "(127) 20 43 21 21 87 27 32 95 77 90 AD F0 33 D5 CF 0E BA 58 46 17 22 19 0C 62 5D 62 DB 14", "N4 K24 N4 B6 K7 B6 K26 B6 (nayuki.io - kanji/byte/numeric, non-Shift JIS removed)" },
        /* 17*/ { UNICODE_MODE, "AB1234567A", -1, 0, "4A 39 A0 BC 45 8E 72 8A 00 EC 11 EC", "A10" },
        /* 18*/ { UNICODE_MODE, "AB12345678A", -1, 0, "42 39 A5 03 DB 91 39 04 A0 EC 11 EC", "A2 N8 A1" },
        /* 19*/ { UNICODE_MODE, "テaA1", -1, 0, "76 0D 95 85 04 C4 00", "B4" },
        /* 20*/ { UNICODE_MODE, "テaAB1", -1, 0, "6E 0D 95 85 19 CD 04", "B3 A3" },
        /* 21*/ { UNICODE_MODE, "貫やãè­˜ç¦ã±ã„å†2間変字全ノレ没無8è£èбã»ã‚ƒéŽæ³•ã²ãªã”札17能ã¤ãƒ¼ã³ã‚ŒæŠ•覧マå‹å‹•エヨé¡ç•Œã‚ˆã¿ä½œçš‡ãƒŠãƒ²ãƒ‹æ‰“題ヌルヲ掲布益フãŒã€‚å…¥35能ト権話ã—ã“を断兆モヘ細情ãŠã˜å4減エヘイãƒå´æ©Ÿ", -1, 0, "(152) 82 0E A2 16 20 97 28 BD 02 C1 4F 09 12 61 08 04 A0 83 AA 3E 3D 43 4C 13 0D 68 73 1F", "K8 N1 K8 N1 K10 N2 K33 N2 K16 N1 K7" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char escaped[1024];

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_RMQR;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        symbol->debug = ZINT_DEBUG_TEST;

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_RMQR_OPTIMIZE_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %d, %s, \"%s\", \"%s\" },\n",
                i, testUtilInputModeName(data[i].input_mode), testUtilEscape(data[i].data, length, escaped, sizeof(escaped)), data[i].option_1,
                testUtilErrorName(data[i].ret), symbol->errtxt, data[i].comment);
        #else
        assert_zero(strcmp(symbol->errtxt, data[i].expected), "i:%d strcmp(%s, %s) != 0\n", i, symbol->errtxt, data[i].expected);
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_rmqr_encode(void)
{
    testStart("");

    int ret;
    struct item {
        int input_mode;
        unsigned char* data;
        int option_1;
        int option_2;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        char* expected;
    };
    struct item data[] = {
        /*  0*/ { UNICODE_MODE, "0123456", 4, 11, 0, 11, 27, "Draft ISO 2018-6-8 Annex H I.2, currently no image to compare to",
                    "111111101010101010101010111"
                    "100000100110111010101101101"
                    "101110100001100000010110101"
                    "101110101111100000001001010"
                    "101110100100011000101000111"
                    "100000101110011000111110010"
                    "111111100110100101001011111"
                    "000000001101001111010010001"
                    "111000011011111000011110101"
                    "100100100010000011111010001"
                    "111010101010101010101011111"
               },
        /*  1*/ { UNICODE_MODE, "1234567890123456", 2, 17, 0, 13, 27, "Draft ISO 2018-6-8 6.2 Figure 1 **NOT SAME**",
                    "111111101010101010101010111"
                    "100000100001111000111110101"
                    "101110101100010111110111001"
                    "101110100110001110010100000"
                    "101110101111001001101001001"
                    "100000100010001110011110000"
                    "111111100000001100000010101"
                    "000000001111100000010001100"
                    "111001101110000001110011111"
                    "011111011101010000100010001"
                    "100000101000011010101010101"
                    "101101101100110111000010001"
                    "111010101010101010101011111"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_RMQR;
        symbol->input_mode = data[i].input_mode;
        if (data[i].option_1 != -1) {
            symbol->option_1 = data[i].option_1;
        }
        if (data[i].option_2 != -1) {
            symbol->option_2 = data[i].option_2;
        }

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ZBarcode_Encode ret %d != %d (%s)\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_RMQR_ENCODE_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", %d, %d, %s, %d, %d, \"%s\",\n",
                i, testUtilInputModeName(data[i].input_mode), data[i].data, data[i].option_1, data[i].option_2, testUtilErrorName(data[i].ret),
                symbol->rows, symbol->width, data[i].comment);
        testUtilModulesDump(symbol, "                    ", "\n");
        printf("               },\n");
        #else
        if (ret < 5) {
            assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
            assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);

            if (ret == 0) {
                int width, row;
                ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
                assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, ret, width, row, data[i].data);
            }
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_qr_options();
    test_qr_input();
    test_qr_gs1();
    test_qr_optimize();
    test_qr_encode();

    test_microqr_options();
    test_microqr_input();
    test_microqr_padding();
    test_microqr_optimize();
    test_microqr_encode();

    test_upnqr_input();
    test_upnqr_encode();

    test_rmqr_options();
    test_rmqr_input();
    test_rmqr_gs1();
    test_rmqr_optimize();
    test_rmqr_encode();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_raster.c.












































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

static void test_chk_extendable(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int ret;

        int expected_height;
        int expected_rows;
        int expected_width;
        int expected_bitmap_width;
        int expected_bitmap_height;
        int expected_addon_text_row;
        int expected_addon_text_col;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { BARCODE_EANX_CHK, "1234567890128+12", 0, 50, 1, 124, 288, 118, 5, 224 },
        /* 1*/ { BARCODE_UPCA_CHK, "12345678905+12345", 0, 50, 1, 151, 342, 118, 5, 258 },
        /* 2*/ { BARCODE_UPCE_CHK, "12345670+12", 0, 50, 1, 80, 200, 118, 5, 147 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode_and_Buffer(symbol, data[i].data, length, 0);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
        assert_nonnull(symbol->bitmap, "i:%d (%d) symbol->bitmap NULL\n", i, data[i].symbology);

        assert_equal(symbol->height, data[i].expected_height, "i:%d (%d) symbol->height %d != %d\n", i, data[i].symbology, symbol->height, data[i].expected_height);
        assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%d) symbol->rows %d != %d\n", i, data[i].symbology, symbol->rows, data[i].expected_rows);
        assert_equal(symbol->width, data[i].expected_width, "i:%d (%d) symbol->width %d != %d\n", i, data[i].symbology, symbol->width, data[i].expected_width);
        assert_equal(symbol->bitmap_width, data[i].expected_bitmap_width, "i:%d (%d) symbol->bitmap_width %d != %d\n", i, data[i].symbology, symbol->bitmap_width, data[i].expected_bitmap_width);
        assert_equal(symbol->bitmap_height, data[i].expected_bitmap_height, "i:%d (%d) symbol->bitmap_height %d != %d\n", i, data[i].symbology, symbol->bitmap_height, data[i].expected_bitmap_height);

        int addon_text_bits_set = 0;
        int row = data[i].expected_addon_text_row;
        for (int column = data[i].expected_addon_text_col; column < data[i].expected_addon_text_col + 48; column++) {
            int j = (row * symbol->bitmap_width + column) * 3;
            if (symbol->bitmap[j] == 0 && symbol->bitmap[j + 1] == 0 && symbol->bitmap[j + 2] == 0) { // Black
                addon_text_bits_set = 1;
                break;
            }
        }
        assert_nonzero(addon_text_bits_set, "i:%d (%d) addon_text_bits_set zero\n", i, data[i].symbology);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_chk_extendable();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_rss.c.












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

//#define TEST_RSS_BINARY_DIV_MODULO_DIVISOR_GENERATE_EXPECTED 1
//#define TEST_EXAMPLES_GENERATE_EXPECTED 1
//#define TEST_GENERAL_FIELD_GENERATE_EXPECTED 1
//#define TEST_BINARY_BUFFER_SIZE_GENERATE_EXPECTED 1

static void test_binary_div_modulo_divisor(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int ret_encode;
        float w;
        float h;
        int ret_vector;

        int expected_rows;
        int expected_width;
        unsigned char* expected;
    };
    struct item data[] = {
        /* 0*/ { BARCODE_RSS14, "1234567890123", 0, 100, 30, 0, 1, 96, "010111010010000001001110000000010100001011111010110100011001100101111111110001011011000111000101" },
        /* 1*/ { BARCODE_RSS14, "0000004537076", 0, 100, 30, 0, 1, 96, "010101001000000001000100000000010111111100101010111101111101010101111111110111010100100000000101" },
        /* 2*/ { BARCODE_RSS14, "0000004537077", 0, 100, 30, 0, 1, 96, "010101001000000001000111000000010111111101001010101010110000000101111100000111011111111011010101" },
        /* 3*/ { BARCODE_RSS14, "0000004537078", 0, 100, 30, 0, 1, 96, "010101001000000001000111000000010111111101001010101011010000000101111000000011011111111011010101" },
        /* 4*/ { BARCODE_RSS14, "0000000001596", 0, 100, 30, 0, 1, 96, "010101001000000001001111100000010111111100101010111101111101010101111100000111011111111011010101" },
        /* 5*/ { BARCODE_RSS14, "0000000001597", 0, 100, 30, 0, 1, 96, "010101001000000001011111000000010111111100101010101010110000000101111100000111011111110111010101" },
        /* 6*/ { BARCODE_RSS14, "0000000001598", 0, 100, 30, 0, 1, 96, "010101001000000001011111000000010111111100101010101011010000000101111000000011011111110111010101" },
        /* 7*/ { BARCODE_RSS_LTD, "1234567890123", 0, 100, 30, 0, 1, 74, "01001100111100101000100111010110101011001001010010101001010000011100011101" },
        /* 8*/ { BARCODE_RSS_LTD, "0000002013570", 0, 100, 30, 0, 1, 74, "01010101010100000010000001110100101101011001010111111110111111010101010101" },
        /* 9*/ { BARCODE_RSS_LTD, "0000002013571", 0, 100, 30, 0, 1, 74, "01010101010100000011000000110101011010100011010101010101000000100000011101" },
        /*10*/ { BARCODE_RSS_LTD, "0000002013572", 0, 100, 30, 0, 1, 74, "01010101010100000011000000110101010010111001010101010101000000110000001101" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret_encode);

        #ifdef TEST_RSS_BINARY_DIV_MODULO_DIVISOR_GENERATE_EXPECTED
        printf("        /*%2d*/ { %s, \"%s\", %d, %.0f, %.0f, %d, %d, %d, ",
                i, testUtilBarcodeName(data[i].symbology), data[i].data, ret, data[i].w, data[i].h, data[i].ret_vector, symbol->rows, symbol->width);
        testUtilModulesDump(symbol, "", " },\n");
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d\n", i, symbol->rows, data[i].expected_rows);
        assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d\n", i, symbol->width, data[i].expected_width);

        int width, row;
        ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
        assert_zero(ret, "i:%d testUtilModulesCmp ret %d != 0 width %d row %d\n", i, ret, width, row);

        ret = ZBarcode_Buffer_Vector(symbol, 0);
        assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

// Replicate examples from GS1 General Specifications 19.1 and ISO/IEC 24724:2011
static void test_examples(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        unsigned char* expected;
    };
    // Verified manually against GS1 General Specifications 19.1 and ISO/IEC 24724:2011
    struct item data[] = {
        /* 0*/ { BARCODE_RSS14, "0950110153001", 0, 1, 96, "Figure 5.5.2.1.1-1. GS1 DataBar Omnidirectional",
                    "010000010100000101000111110000010111101101011100100011011101000101100000000111001110110111001101"
               },
        /* 1*/ { BARCODE_RSS_EXP, "[01]90614141000015[3202]000150", 0, 1, 151, "Figure 5.5.2.3.1-1. GS1 DataBar Expanded",
                    "0101100011001100001011111111000010100100010000111101110011100010100010111100000011100111010111111011010100000100000110001111110000101000000100011010010"
               },
        /* 2*/ { BARCODE_RSS_EXPSTACK, "[01]90614141000015[3202]000150", 0, 5, 102, "Figure 5.5.2.3.2-1. GS1 DataBar Expanded Stacked",
                    "010110001100110000101111111100001010010001000011110111001110001010001011110000001110011101011111101101"
                    "000001110011001111010000000010100101101110111100001000110001110101100100001010100001100010100000010000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001011111011111001010000001010010111111011100100000000000000000000000000000000000000000000000000000"
                    "001010100000100000110001111110000101000000100011010010000000000000000000000000000000000000000000000000"
               },
        /* 3*/ { BARCODE_RSS14, "2001234567890", 0, 1, 96, "24724:2011 Figure 1 — GS1 DataBar Omnidirectional",
                    "010100011101000001001111111000010100110110111110110000010010100101100000000111000110110110001101"
               },
        /* 4*/ { BARCODE_RSS14, "0441234567890", 0, 1, 96, "24724:2011 Figure 2 — GS1 DataBar Omnidirectional",
                    "010010001000010001000111000000010101000001100110101100100100000101111110000011000010100011100101"
               },
        /* 5*/ { BARCODE_RSS14, "0001234567890", 0, 1, 96, "24724:2011 Figure 4 — GS1 DataBar Truncated",
                    "010101001000000001001111111000010111001011011110111001010110000101111111000111001100111101110101"
               },
        /* 6*/ { BARCODE_RSS14STACK, "0001234567890", 0, 3, 50, "24724:2011 Figure 5 — GS1 DataBar Stacked",
                    "01010100100000000100111111100001011100101101111010"
                    "00001010101011111010000000111010100011010010000000"
                    "10111001010110000101111111000111001100111101110101"
               },
        /* 7*/ { BARCODE_RSS14STACK_OMNI, "0003456789012", 0, 5, 50, "24724:2011 Figure 6 — GS1 DataBar Stacked Omnidirectional",
                    "01010100100000000100111110000001010011100110011010"
                    "00001011011111111010000001010100101100011001100000"
                    "00000101010101010101010101010101010101010101010000"
                    "00001000100010111010010101010000111101001101110000"
                    "10110111011101000101100000000111000010110010001101"
               },
        /* 8*/ { BARCODE_RSS_LTD, "1501234567890", 0, 1, 74, "24724:2011 Figure 7 — GS1 DataBar Limited",
                    "01000110011000110110101001110100101011010011010010010110001101110011001101"
               },
        /* 9*/ { BARCODE_RSS_LTD, "0031234567890", 0, 1, 74, "24724:2011 Figure 8 — (a) GS1 DataBar Limited",
                    "01010100000100100010000101110010101101101001010110000010100100101100000101"
               },
        /*10*/ { BARCODE_RSS_EXP, "[01]98898765432106[3202]012345[15]991231", 0, 1, 200, "24724:2011 Figure 10 — GS1 DataBar Expanded",
                    "01001000011000110110111111110000101110000110010100011010000001100010101111110000111010011100000010010100111110111001100011111100001011101100000100100100011110010110001011111111001110001101111010000101"
               },
        /*11*/ { BARCODE_RSS_EXP, "[01]90012345678908[3103]001750", 0, 1, 151, "24724:2011 Figure 11 — GS1 DataBar Expanded",
                    "0101110010000010011011111111000010111000010011000101011110111001100010111100000011100101110001110111011110101111000110001111110000101011000010011111010"
               },
        /*12*/ { BARCODE_RSS_EXPSTACK, "[01]98898765432106[3202]012345[15]991231", 0, 5, 102, "24724:2011 Figure 12 — GS1 DataBar Expanded Stacked symbol",
                    "010010000110001101101111111100001011100001100101000110100000011000101011111100001110100111000000100101"
                    "000001111001110010010000000010100100011110011010111001011111100111010100000010100001011000111111010000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000011101000010011100001000000001011100101100001110110110111110010001001010000001010011000100000110000"
                    "101000010111101100011100111111110100011010011110001001001000001101110100001111110001100111011111001010"
               },
        /*13*/ { BARCODE_RSS_EXPSTACK, "[01]95012345678903[3103]000123", 0, 5, 102, "24724:2011 Figure 13 — GS1 DataBar Expanded Stacked",
                    "010100010001111000101111111100001010111000001100010111000110001001101011110000001110010111000111011101"
                    "000011101110000111010000000010100101000111110011101000111001110110010100001010100001101000111000100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000000001010000111001010000001010010111011011111100000000000000000000000000000000000000000000000000000"
                    "001011110101111000110001111110000101000100100000011010000000000000000000000000000000000000000000000000"
               },
        /*14*/ { BARCODE_RSS_LTD, "0009876543210", 0, 1, 74, "24724:2011 Figure F.2 — GS1 DataBar Limited",
                    "01010100100100110000110000010101101001011001010001000101000100000100100101"
               },
        /*15*/ { BARCODE_RSS_EXP, "[10]12A", 0, 1, 102, "24724:2011 Figure F.3 — GS1 DataBar Expanded",
                    "010100000110100000101111111100001010001000000010110101111100100111001011110000000010011101111111010101"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_EXAMPLES_GENERATE_EXPECTED
        if (ret == 0) {
            printf("        /*%2d*/ { %s, \"%s\", %d, %d, %d, \"%s\",\n",
                    i, testUtilBarcodeName(symbol->symbology), data[i].data, ret, symbol->rows, symbol->width, data[i].comment);
            testUtilModulesDump(symbol, "                    ", "\n");
            printf("               },\n");
        } else {
            printf("        /*%2d*/ { %s, \"%s\", %s, %d, %d, \"%s\", \"\" },\n",
                    i, testUtilBarcodeName(symbol->symbology), data[i].data, testUtilErrorName(ret), symbol->rows, symbol->width, data[i].comment);
        }
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data);

        if (ret == 0) {
            int width, row;
            ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
            assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

// Test general-purpose data compaction
static void test_general_field(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
        unsigned char* expected;
    };
    // Verified manually against bwipp and tec-it.com (bottom separator differs from tec-it.com where noted)
    struct item data[] = {
        /* 0*/ { BARCODE_RSS_EXP, "[91]1", 0, 1, 102, "Single numeric",
                    "010100000001000101101111111100001011001000010000010110111110101100001011110000000010101111100001011101"
               },
        /* 1*/ { BARCODE_RSS_EXP, "[91]12", 0, 1, 102, "2 numerics",
                    "010010000010000101101111111100001011001000010000010101111100101110001011110000000010101111100001011101"
               },
        /* 2*/ { BARCODE_RSS_EXP, "[91]123", 0, 1, 102, "Odd-numbered numeric",
                    "010100000110000100101111111100001011001000010000010100011111010111001011110000000010000011000110100101"
               },
        /* 3*/ { BARCODE_RSS_EXP, "[91]1234", 0, 1, 102, "Even-numbered numeric",
                    "010110010000001000101111111100001011001000010000010100111110001011101011110000000010001101111001011101"
               },
        /* 4*/ { BARCODE_RSS_EXP, "[91]A1234567C", 0, 1, 183, "Alphanumeric followed by 7 digits and alphanumeric",
                    "010100000111001001101111111100001011000001000101110101111110111101001011111100001110100110111110111100001111010110011000111111000010110001000001101101110111101111010010111111110011101"
               },
        /* 5*/ { BARCODE_RSS_EXP, "[91]A123456C", 0, 1, 151, "Alphanumeric followed by 6 digits and alphanumeric",
                    "0101100111001000001011111111000010110010000100000101011111101111010010111100000011101001101111101111000011110101100110001111110000101000100011000111010"
               },
        /* 6*/ { BARCODE_RSS_EXP, "[91]A12345B", 0, 1, 151, "Alphanumeric followed by 5 digits and alphanumeric",
                    "0101111001000001001011111111000010110010000100000101011111101111010010111100000011100000010111001001010000111101000010001111110000101100000001001010010"
               },
        /* 7*/ { BARCODE_RSS_EXP, "[91]A1234567", 0, 1, 151, "Alphanumeric followed by 7 digits, terminating",
                    "0101100100011100001011111111000010110010000100000101011111101111010010111100000011101001101111101111000011110110100110001111110000101101011110111100010"
               },
        /* 8*/ { BARCODE_RSS_EXP, "[91]A123456", 0, 1, 134, "Alphanumeric followed by 6 digits, terminating",
                    "01000101001100000010111111110000101100000100010111010111111011110100101111000000111010011011111011110000111101011001100011111100001010"
               },
        /* 9*/ { BARCODE_RSS_EXP, "[91]A12345", 0, 1, 134, "Alphanumeric followed by 5 digits, terminating",
                    "01000110010100000010111111110000101100000100010111010111111011110100101111000000111010011011111011110000101100111110100011111100001010"
               },
        /*10*/ { BARCODE_RSS_EXP, "[91]A1234", 0, 1, 134, "Alphanumeric followed by 4 digits, terminating",
                    "01011101000010000110111111110000101100000100010111010111111011110100101111000000111010011011111011110001101111100100100011111100001010"
               },
        /*11*/ { BARCODE_RSS_EXP, "[91]A123", 0, 1, 134, "Alphanumeric followed by 3 digits, terminating",
                    "01000010110010000010111111110000101100000100010111010111111011110100101111000000111000000101110010010001000010000101100011111100001010"
               },
        /*12*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEFGb", 0, 1, 249, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 4 digits",
                    "010000100011100110101111111100001011001000010000010101101111110011101011111000000110000110110100011100001110000101011000111111000010100111000010110001000000100110110010111111110011101000001110010001010011011111100110001111000000101110111010011000010"
               },
        /*13*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEFb", 0, 1, 249, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 digits",
                    "010111010001110001101111111100001011001000010000010101101111110011101011111000000110000110110100011100001110000101011000111111000010100111000010110001000000100110110010111111110011101000001110010001001100011011100110001111000000101101000111001110010"
               },
        /*14*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEF", 0, 1, 232, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 digits",
                    "0100001011010000111011111111000010110000010001011101011011111100111010111110000001100001101101000111000011100001010110001111110000101001110000101100010000001001101100101111111100111010000011100100010011100111000101100011110000001010"
               },
        /*15*/ { BARCODE_RSS_EXP, "[91]a1234ABCDEb", 0, 1, 232, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 4 digits",
                    "0100001011011000011011111111000010110000010001011101011011111100111010111110000001100100011100100111011110010111110010001111110000101111100011001010010110001000011110101111111100111011100101111000110111001000011110100011110000001010"
               },
        /*16*/ { BARCODE_RSS_EXP, "[91]a1234ABCDE", 0, 1, 200, "ISO-646 followed by 9 non-ISO-646 terminating, starting 4 digits",
                    "01001000011000111010111111110000101100100001000001010110111111001110101111110000111000011011010001110000111000010101100011111100001010011100001011000100000010011011001011111111001110010011100000100101"
               },
        /*17*/ { BARCODE_RSS_EXP, "[91]aABCDEF12345b", 0, 1, 249, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 6 letters",
                    "010000100010100111101111111100001011001000010000010101101111110011101011111000000110100001110001011100010000010100011000111111000010111101000100100001100111010000110010111111110011101000001110011011000100000110101110001111000000101011110010001110010"
               },
        /*18*/ { BARCODE_RSS_EXP, "[91]aABCDEF1234b", 0, 1, 249, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 6 letters",
                    "010110111100110000101111111100001011001000010000010101101111110011101011111000000110100001110001011100010000010100011000111111000010111101000100100001100111010000110010111111110011101000001110011011000100001001110110001111000000101111110110110001010"
               },
        /*19*/ { BARCODE_RSS_EXP, "[91]aABCDE12345b", 0, 1, 249, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 5 letters",
                    "010000100010011011101111111100001011001000010000010101101111110011101011111000000110100001110001011100010000010100011000111111000010111101000100100001100100001110011010111111110011100110110010000111000101111000101110001111000000101111011001101000010"
               },
        /*20*/ { BARCODE_RSS_EXP, "[91]aABCDE1234", 0, 1, 200, "ISO-646 followed by 10 non-ISO-646 terminating, starting 5 letters",
                    "01000101100011100010111111110000101100100001000001010110111111001110101111110000111010000111000101110001000001010001100011111100001011110100010010000110000100101111001011111111001110010010001110011101"
               },
        /*21*/ { BARCODE_RSS_EXP, "[91]aABCDE1234b", 0, 1, 232, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 5 letters",
                    "0100010000110011011011111111000010110000010001011101011011111100111010111110000001100001000110110111010000010110000010001111110000101000011101001100011001000011100110101111111100111011001100100001110111001000011110100011110000001010"
               },
        /*22*/ { BARCODE_RSS_EXP, "[91]aABCDE1234", 0, 1, 200, "ISO-646 followed by 9 non-ISO-646 terminating, starting 5 letters",
                    "01000101100011100010111111110000101100100001000001010110111111001110101111110000111010000111000101110001000001010001100011111100001011110100010010000110000100101111001011111111001110010010001110011101"
               },
        /*23*/ { BARCODE_RSS_EXPSTACK, "[91]1", 0, 1, 102, "Single numeric",
                    "010100000001000101101111111100001011001000010000010110111110101100001011110000000010101111100001011101"
               },
        /*24*/ { BARCODE_RSS_EXPSTACK, "[91]12", 0, 1, 102, "2 numerics",
                    "010010000010000101101111111100001011001000010000010101111100101110001011110000000010101111100001011101"
               },
        /*25*/ { BARCODE_RSS_EXPSTACK, "[91]123", 0, 1, 102, "Odd-numbered numeric",
                    "010100000110000100101111111100001011001000010000010100011111010111001011110000000010000011000110100101"
               },
        /*26*/ { BARCODE_RSS_EXPSTACK, "[91]1234", 0, 1, 102, "Even-numbered numeric",
                    "010110010000001000101111111100001011001000010000010100111110001011101011110000000010001101111001011101"
               },
        /*27*/ { BARCODE_RSS_EXPSTACK, "[91]A1234567C", 0, 5, 102, "Alphanumeric followed by 7 digits and alphanumeric",
                    "010100000111001001101111111100001011000001000101110101111110111101001011111100001110100110111110111101"
                    "000011111000110110010000000010100100111110111010001010000001000010100100000010100001011001000001000000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000000100000000101101000010000100010010011111011100100101000000011001100101000011000000000000000000000"
                    "101110011111111010010111101111011101101100000100011010000111111000110011010111100001000000000000000000"
               },
        /*28*/ { BARCODE_RSS_EXPSTACK, "[91]A123456C", 0, 5, 102, "Alphanumeric followed by 6 digits and alphanumeric",
                    "010110011100100000101111111100001011001000010000010101111110111101001011110000001110100110111110111101"
                    "000001100011011111010000000010100100110111101111101010000001000010100100001010100001011001000001000000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001100001010011001010000001010010111011100111000000000000000000000000000000000000000000000000000000"
                    "001000011110101100110001111110000101000100011000111010000000000000000000000000000000000000000000000000"
               },
        /*29*/ { BARCODE_RSS_EXPSTACK, "[91]A12345B", 0, 5, 102, "Alphanumeric followed by 5 digits and alphanumeric",
                    "010111100100000100101111111100001011001000010000010101111110111101001011110000001110000001011100100101"
                    "000000011011111011010000000010100100110111101111101010000001000010100100001010100001111110100011010000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001111000010111101010000001010010011111110110100000000000000000000000000000000000000000000000000000"
                    "001010000111101000010001111110000101100000001001010010000000000000000000000000000000000000000000000000"
               },
        /*30*/ { BARCODE_RSS_EXPSTACK, "[91]A1234567", 0, 5, 102, "Alphanumeric followed by 7 digits, terminating **NOTE** bottom separator differs from tec-it.com, same as bwipp",
                    "010110010001110000101111111100001011001000010000010101111110111101001011110000001110100110111110111101"
                    "000001101110001111010000000010100100110111101111101010000001000010100100001010100001011001000001000000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001100001001011001010000001010010010100001000010000000000000000000000000000000000000000000000000000"
                    "001000011110110100110001111110000101101011110111100010000000000000000000000000000000000000000000000000"
               },
        /*31*/ { BARCODE_RSS_EXPSTACK, "[91]A123456", 0, 5, 102, "Alphanumeric followed by 6 digits, terminating **NOTE** ditto",
                    "010100001100111000101111111100001011001000010000010101111110111101001011110000001110100110111110111101"
                    "000011110011000111010000000010100100110111101111101010000001000010100100001010100001011001000001000000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001100001010011001010000001010010011101011111110000000000000000000000000000000000000000000000000000"
                    "001000011110101100110001111110000101100010100000001010000000000000000000000000000000000000000000000000"
               },
        /*32*/ { BARCODE_RSS_EXPSTACK, "[91]A12345", 0, 5, 102, "Alphanumeric followed by 5 digits, terminating **NOTE** ditto",
                    "010100100011000011101111111100001011001000010000010101111110111101001011110000001110100110111110111101"
                    "000011011100111100010000000010100100110111101111101010000001000010100100001010100001011001000001000000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001101001100000101010000001010010011101011111110000000000000000000000000000000000000000000000000000"
                    "001000010110011111010001111110000101100010100000001010000000000000000000000000000000000000000000000000"
               },
        /*33*/ { BARCODE_RSS_EXPSTACK, "[91]A1234", 0, 5, 102, "Alphanumeric followed by 4 digits, terminating **NOTE** ditto",
                    "010111000010010001101111111100001011001000010000010101111110111101001011110000001110100110111110111101"
                    "000000111101101110010000000010100100110111101111101010000001000010100100001010100001011001000001000000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001001000001101101010000001010010000111011101110000000000000000000000000000000000000000000000000000"
                    "001000110111110010010001111110000101111000100010001010000000000000000000000000000000000000000000000000"
               },
        /*34*/ { BARCODE_RSS_EXPSTACK, "[91]A123", 0, 5, 102, "Alphanumeric followed by 3 digits, terminating **NOTE** ditto",
                    "010110000100111000101111111100001011001000010000010101111110111101001011110000001110000001011100100101"
                    "000001111011000111010000000010100100110111101111101010000001000010100100001010100001111110100011010000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001011110111101001010000001010010101111100001010000000000000000000000000000000000000000000000000000"
                    "001000100001000010110001111110000101010000011110100010000000000000000000000000000000000000000000000000"
               },
        /*35*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEFGb", 0, 9, 102, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 4 digits **NOTE** ditto",
                    "010000100011100110101111111100001011001000010000010101101111110011101011111000000110000110110100011101"
                    "000011011100011001010000000010100100110111101111101010010000001100010100000101010001111001001011100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000011011000111110100001000000001011001001101111110111001011110001101001010000001010010101111000110000"
                    "101000100111000001011100111111110100110110010000001000110100001110010100001111110001101010000111000010"
                    "000011011000111110100001000000001011001001101111110111001011110001101001010000001010010101111000110000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000011001000000110010100001010100100010001011001100000000000000000000000000000000000000000000000000000"
                    "010100110111111001100011110000001011101110100110000100000000000000000000000000000000000000000000000000"
               },
        /*36*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEFb", 0, 9, 102, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 4 digits",
                    "010111010001110001101111111100001011001000010000010101101111110011101011111000000110000110110100011101"
                    "000000101110001110010000000010100100110111101111101010010000001100010100000101010001111001001011100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000011011000111110100001000000001011001001101111110111001011110001101001010000001010010101111000110000"
                    "101000100111000001011100111111110100110110010000001000110100001110010100001111110001101010000111000010"
                    "000011011000111110100001000000001011001001101111110111001011110001101001010000001010010101111000110000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000000111001000110010100001010100100101110001100000000000000000000000000000000000000000000000000000000"
                    "010011000110111001100011110000001011010001110011100100000000000000000000000000000000000000000000000000"
               },
        /*37*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEF", 0, 9, 102, "ISO-646 followed by 10 non-ISO-646 terminating, starting 4 digits **NOTE** ditto",
                    "010110111001000011101111111100001011001000010000010101101111110011101011111000000110000110110100011101"
                    "000001000110111100010000000010100100110111101111101010010000001100010100000101010001111001001011100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000011011000111110100001000000001011001001101111110111001011110001101001010000001010010101111000110000"
                    "101000100111000001011100111111110100110110010000001000110100001110010100001111110001101010000111000010"
                    "000011011000111110100001000000001011001001101111110111001011110001101001010000001010010101111000110000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000000011000111010010100001010100101011111000010100000000000000000000000000000000000000000000000000000"
                    "010011100111000101100011110000001010100000111101000100000000000000000000000000000000000000000000000000"
               },
        /*38*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDEb", 0, 9, 102, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 4 digits **NOTE** ditto",
                    "010110111001100001101111111100001011001000010000010101101111110011101011111000000110010001110010011101"
                    "000001000110011110010000000010100100110111101111101010010000001100010100000101010001101110001101100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000011100001011000100001000000001010000111101110010110101100111000001001010000001010110000010110000000"
                    "101100011110100111011100111111110101111000010001101001010011000111110100001111110001001111101001111010"
                    "000011100001011000100001000000001010000111101110010110101100111000001001010000001010110000010110000000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000000110111100001010100001010100101011111000010100000000000000000000000000000000000000000000000000000"
                    "010111001000011110100011110000001010100000111101000100000000000000000000000000000000000000000000000000"
               },
        /*39*/ { BARCODE_RSS_EXPSTACK, "[91]a1234ABCDE", 0, 5, 102, "ISO-646 followed by 9 non-ISO-646 terminating, starting 4 digits",
                    "010010000110001110101111111100001011001000010000010101101111110011101011111100001110000110110100011101"
                    "000001111001110001010000000010100100110111101111101010010000001100010100000010100001111001001011100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000010111110001101100001000000001011001001101111110111001011110001101001010000001010010101111000110000"
                    "101001000001110010011100111111110100110110010000001000110100001110010100001111110001101010000111000010"
               },
        /*40*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDEF12345b", 0, 9, 102, "ISO-646 followed by 11 non-ISO-646 non-terminating, starting 6 letters",
                    "010000100010100111101111111100001011001000010000010101101111110011101011111000000110100001110001011101"
                    "000011011101011000010000000010100100110111101111101010010000001100010100000101010001011110001110100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000010011000111110100001000000001011001111010001100111101101110100001001010000001010011101011111010000"
                    "101101100111000001011100111111110100110000101110011000010010001011110100001111110001100010100000100010"
                    "000010011000111110100001000000001011001111010001100111101101110100001001010000001010011101011111010000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000010111110010100010100001010100101000011011100000000000000000000000000000000000000000000000000000000"
                    "010001000001101011100011110000001010111100100011100100000000000000000000000000000000000000000000000000"
               },
        /*41*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDEF1234b", 0, 9, 102, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 6 letters **NOTE** ditto",
                    "010110111100110000101111111100001011001000010000010101101111110011101011111000000110100001110001011101"
                    "000001000011001111010000000010100100110111101111101010010000001100010100000101010001011110001110100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000010011000111110100001000000001011001111010001100111101101110100001001010000001010011101011111010000"
                    "101101100111000001011100111111110100110000101110011000010010001011110100001111110001100010100000100010"
                    "000010011000111110100001000000001011001111010001100111101101110100001001010000001010011101011111010000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000010111101100010010100001010100100000010010011100000000000000000000000000000000000000000000000000000"
                    "010001000010011101100011110000001011111101101100010100000000000000000000000000000000000000000000000000"
               },
        /*42*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE12345b", 0, 9, 102, "ISO-646 followed by 10 non-ISO-646 non-terminating, starting 5 letters **NOTE** ditto",
                    "010000100010011011101111111100001011001000010000010101101111110011101011111000000110100001110001011101"
                    "000011011101100100010000000010100100110111101111101010010000001100010100000101010001011110001110100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001111011001001100001000000001010011000111101100111101101110100001001010000001010011101011111010000"
                    "101110000100110110011100111111110101100111000010011000010010001011110100001111110001100010100000100010"
                    "000001111011001001100001000000001010011000111101100111101101110100001001010000001010011101011111010000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000010100001110100010100001010100100001001100101100000000000000000000000000000000000000000000000000000"
                    "010001011110001011100011110000001011110110011010000100000000000000000000000000000000000000000000000000"
               },
        /*43*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE1234", 0, 5, 102, "ISO-646 followed by 10 non-ISO-646 terminating, starting 5 letters",
                    "010001011000111000101111111100001011001000010000010101101111110011101011111100001110100001110001011101"
                    "000010100111000111010000000010100100110111101111101010010000001100010100000010100001011110001110100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001100011101101100001000000001011000010110111100111101101110100001001010000001010011101011111010000"
                    "101110011100010010011100111111110100111101001000011000010010001011110100001111110001100010100000100010"
               },
        /*44*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE1234b", 0, 9, 102, "ISO-646 followed by 9 non-ISO-646 non-terminating, starting 5 letters **NOTE** ditto",
                    "010000100001110110101111111100001011001000010000010101101111110011101011111000000110000100011011011101"
                    "000011011110001001010000000010100100110111101111101010010000001100010100000101010001111011100100100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001111011001100100001000000001010011000111101100111001101000111101001010000001010111110010111110000"
                    "101110000100110011011100111111110101100111000010011000110010111000010100001111110001000001101000001010"
                    "000001111011001100100001000000001010011000111101100111001101000111101001010000001010111110010111110000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000000110111100001010100001010100101011111000010100000000000000000000000000000000000000000000000000000"
                    "010111001000011110100011110000001010100000111101000100000000000000000000000000000000000000000000000000"
               },
        /*45*/ { BARCODE_RSS_EXPSTACK, "[91]aABCDE1234", 0, 5, 102, "ISO-646 followed by 9 non-ISO-646 terminating, starting 5 letters",
                    "010001011000111000101111111100001011001000010000010101101111110011101011111100001110100001110001011101"
                    "000010100111000111010000000010100100110111101111101010010000001100010100000010100001011110001110100000"
                    "000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000"
                    "000001100011101101100001000000001011000010110111100111101101110100001001010000001010011101011111010000"
                    "101110011100010010011100111111110100111101001000011000010010001011110100001111110001100010100000100010"
               },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_GENERAL_FIELD_GENERATE_EXPECTED
        if (ret == 0) {
            printf("        /*%2d*/ { %s, \"%s\", %d, %d, %d, \"%s\",\n",
                    i, testUtilBarcodeName(symbol->symbology), data[i].data, ret, symbol->rows, symbol->width, data[i].comment);
            testUtilModulesDump(symbol, "                    ", "\n");
            printf("               },\n");
        } else {
            printf("        /*%2d*/ { %s, \"%s\", %s, %d, %d, \"%s\", \"\" },\n",
                    i, testUtilBarcodeName(symbol->symbology), data[i].data, testUtilErrorName(ret), symbol->rows, symbol->width, data[i].comment);
        }
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d %s symbol->rows %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d %s symbol->width %d != %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width, data[i].data);

        if (ret == 0) {
            int width, row;
            ret = testUtilModulesCmp(symbol, data[i].expected, &width, &row);
            assert_zero(ret, "i:%d %s testUtilModulesCmp ret %d != 0 width %d row %d (%s)\n", i, testUtilBarcodeName(data[i].symbology), ret, width, row, data[i].data);
        }
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_binary_buffer_size(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int ret;

        int expected_rows;
        int expected_width;
        char* comment;
    };
    struct item data[] = {
        /* 0*/ { "[91]1", 0, 1, 102, "Minimum digit" },
        /* 1*/ { "[91]+", 0, 1, 102, "Minimum ISO-646" },
        /* 2*/ { "[00]123456789012345678[00]123456789012345678[00]123456789012345678[91]12345678", 0, 1, 543, "70 == any AIs max" },
        /* 3*/ { "[00]123456789012345678[00]123456789012345678[00]123456789012345678[91]123456789", ZINT_ERROR_TOO_LONG, 0, 0, "71 > any AIs max" },
        /* 4*/ { "[01]12345678901234[00]123456789012345678[00]123456789012345678[91]1234567890123456", 0, 1, 543, "74 == 01 + other AIs max" },
        /* 5*/ { "[01]12345678901234[00]123456789012345678[00]123456789012345678[91]12345678901234567", ZINT_ERROR_TOO_LONG, 0, 0, "75 > 01 + other AIs max" },
        /* 6*/ { "[01]92345678901234[3920]123456789012345[00]123456789012345678[91]1234567890123456789", 0, 1, 543, "77 (incl. FNC1 after 3920) == 01 + 392x + other AIs max" },
        /* 7*/ { "[01]92345678901234[3920]123456789012345[00]123456789012345678[91]12345678901234567890", ZINT_ERROR_TOO_LONG, 0, 0, "78 > 01 + 392x + other AIs max" },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_RSS_EXP;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d %s\n", i, ret, data[i].ret, symbol->errtxt);

        #ifdef TEST_BINARY_BUFFER_SIZE_GENERATE_EXPECTED
        printf("        /*%2d*/ { \"%s\", %s, %d, %d, \"%s\" },\n",
                i, data[i].data, testUtilErrorName(ret), symbol->rows, symbol->width, data[i].comment);
        #else

        assert_equal(symbol->rows, data[i].expected_rows, "i:%d symbol->rows %d != %d (%s)\n", i, symbol->rows, data[i].expected_rows, data[i].data);
        assert_equal(symbol->width, data[i].expected_width, "i:%d symbol->width %d != %d (%s)\n", i, symbol->width, data[i].expected_width, data[i].data);
        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_binary_div_modulo_divisor();
    test_examples();
    test_general_field();
    test_binary_buffer_size();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_sjis.c.


































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"
#include "test_sjis_tab.h"
#include "../sjis.h"

// As control convert to Shift JIS using simple table generated from https://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT plus simple processing
static int sjis_wctomb_zint2(unsigned int* r, unsigned int wc)
{
    if (wc < 0x20 || wc == 0x7F) {
        *r = wc;
        return 1;
    }
    // Shortcut
    if ((wc > 0x00F7 && wc < 0x0391) || (wc > 0x0451 && wc < 0x2010) || (wc > 0x9FA0 && wc < 0xE000) || (wc > 0xE757 && wc < 0xFF01) || wc > 0xFFE5) {
        return 0;
    }
    if (wc >= 0xE000 && wc <= 0xE757) { // PUA mappings, not in SHIFTJIS.TXT
        if (wc <= 0xE0BB) {
            *r = wc - 0xE000 + 0xF040 + (wc >= 0xE000 + 0x3F);
        } else if (wc <= 0xE177) {
            *r = wc - 0xE0BC + 0xF140 + (wc >= 0xE0BC + 0x3F);
        } else if (wc <= 0xE233) {
            *r = wc - 0xE178 + 0xF240 + (wc >= 0xE178 + 0x3F);
        } else if (wc <= 0xE2EF) {
            *r = wc - 0xE234 + 0xF340 + (wc >= 0xE234 + 0x3F);
        } else if (wc <= 0xE3AB) {
            *r = wc - 0xE2F0 + 0xF440 + (wc >= 0xE2F0 + 0x3F);
        } else if (wc <= 0xE467) {
            *r = wc - 0xE3AC + 0xF540 + (wc >= 0xE3AC + 0x3F);
        } else if (wc <= 0xE523) {
            *r = wc - 0xE468 + 0xF640 + (wc >= 0xE468 + 0x3F);
        } else if (wc <= 0xE5DF) {
            *r = wc - 0xE524 + 0xF740 + (wc >= 0xE524 + 0x3F);
        } else if (wc <= 0xE69B) {
            *r = wc - 0xE5E0 + 0xF840 + (wc >= 0xE5E0 + 0x3F);
        } else {
            *r = wc - 0xE69C + 0xF940 + (wc >= 0xE69C + 0x3F);
        }
        return 2;
    }
    int tab_length = sizeof(test_sjis_tab) / sizeof(unsigned int);
    for (int i = test_sjis_tab_ind[wc >> 12]; i < tab_length; i += 2) {
        if (test_sjis_tab[i + 1] == wc) {
            *r = test_sjis_tab[i];
            return *r > 0xFF ? 2 : 1;
        }
    }
    return 0;
}

static void test_sjis_wctomb_zint(void)
{
    testStart("");

    int ret, ret2;
    unsigned int val, val2;

    for (unsigned int i = 0; i < 0xFFFE; i++) {
        if (i >= 0xD800 && i <= 0xDFFF) { // UTF-16 surrogates
            continue;
        }
        val = val2 = 0;
        ret = sjis_wctomb_zint(&val, i);
        ret2 = sjis_wctomb_zint2(&val2, i);
        if (i == 0xFF3C) { // Extra mapping full-width reverse solidus U+FF3C to 0x815F, duplicate of U+005C (backslash)
            assert_equal(ret, 2, "i:%d 0x%04X ret %d != 2, val 0x%04X\n", i, i, ret, val);
            assert_equal(val, 0x815F, "i:%d 0x%04X val 0x%04X != 0x815F\n", i, i, val);
            assert_zero(ret2, "i:%d 0x%04X ret2 %d != 0, val2 0x%04X\n", i, i, ret2, val2);
        } else {
            assert_equal(ret, ret2, "i:%d 0x%04X ret %d != ret2 %d, val 0x%04X, val2 0x%04X\n", i, i, ret, ret2, val, val2);
        }
        if (ret2) {
            assert_equal(val, val2, "i:%d 0x%04X val 0x%04X != val2 0x%04X\n", i, i, val, val2);
        }
    }

    testFinish();
}

static void test_sjis_utf8tomb(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int length;
        int ret;
        size_t ret_length;
        unsigned int expected_jisdata[20];
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 plus other ISO 8859 (but not in ISO 8859-7 or ISO 8859-11), Win 1250 plus other Win, not in Shift JIS, UTF-8 C3A9
    // β U+03B2 in ISO 8859-7 Greek (but not other ISO 8859 or Win page), in Shift JIS 0x83C0, UTF-8 CEB2
    // Ж U+0416 in ISO 8859-5 Cyrillic (but not other ISO 8859), Win 1251, in Shift JIS 0x8447, UTF-8 D096
    // ¥ U+00A5 in ISO 8859-1 0xA5 (\245), in Shift JIS single-byte 0x5C (\134) (backslash); 0xA5 same codepoint as single-byte half-width katakana ・ (U+FF65) in Shift JIS (below), UTF-8 C2A5
    // ï½¥ U+FF65 half-width katakana, not in ISO/Win, in Shift JIS single-byte 0xA5 (\245), UTF-8 EFBDA5
    // ソ U+FF7F half-width katakana, not in ISO/Win, in Shift JIS single-byte 0xBF (\277), UTF-8 EFBDBF
    // ‾ U+203E overline, not in ISO/Win, in Shift JIS single-byte 0x7E (\176) (tilde), UTF-8 E280BE
    // ï¼¼ U+FF3C full-width reverse solidus, in Shift JIS 0x815F, duplicate of mapping of U+005C, UTF-8 EFBCBC
    // 点 U+70B9 kanji, in Shift JIS 0x935F (\223\137), UTF-8 E782B9
    // 茗 U+8317 kanji, in Shift JIS 0xE4AA (\344\252), UTF-8 E88C97
    // テ U+30C6 katakana, in Shift JIS 0x8365 (\203\145), UTF-8 E38386
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "é", -1, ZINT_ERROR_INVALID_DATA, -1, {}, "" },
        /*  1*/ { "~", -1, ZINT_ERROR_INVALID_DATA, -1, {}, "" },
        /*  2*/ { "β", -1, 0, 1, { 0x83C0 }, "" },
        /*  3*/ { "Â¥", -1, 0, 1, { 0x5C }, "" },
        /*  4*/ { "aβcЖ¥・ソ‾\\\点茗テ", -1, 0, 13, { 'a', 0x83C0, 'c', 0x8447, 0x5C, 0xA5, 0xBF, 0x7E, 0x815F, 0x815F, 0x935F, 0xE4AA, 0x8365 }, "" },
    };

    int data_size = sizeof(data) / sizeof(struct item);

    struct zint_symbol symbol;
    unsigned int jisdata[20];

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        ret = sjis_utf8tomb(&symbol, data[i].data, &ret_length, jisdata);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d (%s)\n", i, ret, data[i].ret, symbol.errtxt);
        if (ret == 0) {
            assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %zu != %zu\n", i, ret_length, data[i].ret_length);
            for (int j = 0; j < ret_length; j++) {
                assert_equal(jisdata[j], data[i].expected_jisdata[j], "i:%d jisdata[%d] %04X != %04X\n", i, j, jisdata[j], data[i].expected_jisdata[j]);
            }
        }
    }

    testFinish();
}

static void test_sjis_utf8tosb(void)
{
    testStart("");

    int ret;
    struct item {
        int eci;
        unsigned char* data;
        int length;
        int ret;
        size_t ret_length;
        unsigned int expected_jisdata[20];
        char* comment;
    };
    // é U+00E9 in ISO 8859-1 0xE9, Win 1250 plus other Win, in QR Kanji mode first byte range 0x81..9F, 0xE0..EB
    // β U+03B2 in ISO 8859-7 Greek 0xE2 (but not other ISO 8859 or Win page)
    // ¥ U+00A5 in ISO 8859-1 0xA5, outside first byte range 0x81..9F, 0xE0..EB
    // ú U+00FA in ISO 8859-1 0xFA, outside first byte range
    // à U+00EO in ISO 8859-1 0xE0, in first byte range
    // ë U+00EB in ISO 8859-1 0xEB, in first byte range
    // ì U+00EC in ISO 8859-1 0xEC, outside first byte range
    // µ U+00B5 in ISO 8859-1 0xB5, outside first byte range
    // À U+00C0 in ISO 8859-1 0xC0, outside first byte range and 0xEBxx second byte range
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { 3, "é", -1, 0, 1, { 0xE9 }, "" },
        /*  1*/ { 3, "β", -1, ZINT_ERROR_INVALID_DATA, -1, {}, "" },
        /*  2*/ { 9, "β", -1, 0, 1, { 0xE2 }, "" },
        /*  3*/ { 3, "Â¥", -1, 0, 1, { 0xA5 }, "" },
        /*  4*/ { 3, "éa", -1, 0, 1, { 0xE961 }, "In QR Kanji mode range" },
        /*  5*/ { 3, "éaúbàcëdìeµ", -1, 0, 8, { 0xE961, 0xFA, 0x62, 0xE063, 0xEB64, 0xEC, 0x65, 0xB5 }, "" },
        /*  6*/ { 3, "ëÀ", -1, 0, 2, { 0xEB, 0xC0 }, "Outside QR Kanji mode range" },
    };

    int data_size = sizeof(data) / sizeof(struct item);

    unsigned int jisdata[20];

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        ret = sjis_utf8tosb(data[i].eci, data[i].data, &ret_length, jisdata);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);
        if (ret == 0) {
            assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %zu != %zu\n", i, ret_length, data[i].ret_length);
            for (int j = 0; j < ret_length; j++) {
                assert_equal(jisdata[j], data[i].expected_jisdata[j], "i:%d jisdata[%d] %04X != %04X\n", i, j, jisdata[j], data[i].expected_jisdata[j]);
            }
        }
    }

    testFinish();
}

static void test_sjis_cpy(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int length;
        int ret;
        size_t ret_length;
        unsigned int expected_jisdata[20];
        char* comment;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { "\351", -1, 0, 1, { 0xE9 }, "In QR Kanji mode first-byte range but only one byte" },
        /*  1*/ { "\351\141", -1, 0, 1, { 0xE961 }, "In QR Kanji mode range" },
        /*  0*/ { "\201", -1, 0, 1, { 0x81 }, "In QR Kanji mode first-byte range but only one byte" },
        /*  0*/ { "\201\141", -1, 0, 1, { 0x8161 }, "In QR Kanji mode range" },
        /*  0*/ { "\201\077\201\100\237\374\237\375\340\077\340\100\353\277\353\300", -1, 0, 12, { 0x81, 0x3F, 0x8140, 0x9FFC, 0x9F, 0xFD, 0xE0, 0x3F, 0xE040, 0xEBBF, 0xEB, 0xC0 }, "" },
    };

    int data_size = sizeof(data) / sizeof(struct item);

    unsigned int jisdata[20];

    for (int i = 0; i < data_size; i++) {

        int length = data[i].length == -1 ? strlen(data[i].data) : data[i].length;
        size_t ret_length = length;

        sjis_cpy(data[i].data, &ret_length, jisdata);
        assert_equal(ret_length, data[i].ret_length, "i:%d ret_length %zu != %zu\n", i, ret_length, data[i].ret_length);
        for (int j = 0; j < ret_length; j++) {
            assert_equal(jisdata[j], data[i].expected_jisdata[j], "i:%d jisdata[%d] %04X != %04X\n", i, j, jisdata[j], data[i].expected_jisdata[j]);
        }
    }

    testFinish();
}

int main()
{
    test_sjis_wctomb_zint();
    test_sjis_utf8tomb();
    test_sjis_utf8tosb();
    test_sjis_cpy();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_sjis_tab.h.






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
/* Generated by gen_test_tab.php from SHIFTJIS.TXT */
static const unsigned int test_sjis_tab[] = {
    0x0020, 0x0020,
    0x0021, 0x0021,
    0x0022, 0x0022,
    0x0023, 0x0023,
    0x0024, 0x0024,
    0x0025, 0x0025,
    0x0026, 0x0026,
    0x0027, 0x0027,
    0x0028, 0x0028,
    0x0029, 0x0029,
    0x002A, 0x002A,
    0x002B, 0x002B,
    0x002C, 0x002C,
    0x002D, 0x002D,
    0x002E, 0x002E,
    0x002F, 0x002F,
    0x0030, 0x0030,
    0x0031, 0x0031,
    0x0032, 0x0032,
    0x0033, 0x0033,
    0x0034, 0x0034,
    0x0035, 0x0035,
    0x0036, 0x0036,
    0x0037, 0x0037,
    0x0038, 0x0038,
    0x0039, 0x0039,
    0x003A, 0x003A,
    0x003B, 0x003B,
    0x003C, 0x003C,
    0x003D, 0x003D,
    0x003E, 0x003E,
    0x003F, 0x003F,
    0x0040, 0x0040,
    0x0041, 0x0041,
    0x0042, 0x0042,
    0x0043, 0x0043,
    0x0044, 0x0044,
    0x0045, 0x0045,
    0x0046, 0x0046,
    0x0047, 0x0047,
    0x0048, 0x0048,
    0x0049, 0x0049,
    0x004A, 0x004A,
    0x004B, 0x004B,
    0x004C, 0x004C,
    0x004D, 0x004D,
    0x004E, 0x004E,
    0x004F, 0x004F,
    0x0050, 0x0050,
    0x0051, 0x0051,
    0x0052, 0x0052,
    0x0053, 0x0053,
    0x0054, 0x0054,
    0x0055, 0x0055,
    0x0056, 0x0056,
    0x0057, 0x0057,
    0x0058, 0x0058,
    0x0059, 0x0059,
    0x005A, 0x005A,
    0x005B, 0x005B,
    0x815F, 0x005C,
    0x005D, 0x005D,
    0x005E, 0x005E,
    0x005F, 0x005F,
    0x0060, 0x0060,
    0x0061, 0x0061,
    0x0062, 0x0062,
    0x0063, 0x0063,
    0x0064, 0x0064,
    0x0065, 0x0065,
    0x0066, 0x0066,
    0x0067, 0x0067,
    0x0068, 0x0068,
    0x0069, 0x0069,
    0x006A, 0x006A,
    0x006B, 0x006B,
    0x006C, 0x006C,
    0x006D, 0x006D,
    0x006E, 0x006E,
    0x006F, 0x006F,
    0x0070, 0x0070,
    0x0071, 0x0071,
    0x0072, 0x0072,
    0x0073, 0x0073,
    0x0074, 0x0074,
    0x0075, 0x0075,
    0x0076, 0x0076,
    0x0077, 0x0077,
    0x0078, 0x0078,
    0x0079, 0x0079,
    0x007A, 0x007A,
    0x007B, 0x007B,
    0x007C, 0x007C,
    0x007D, 0x007D,
    0x8191, 0x00A2,
    0x8192, 0x00A3,
    0x005C, 0x00A5,
    0x8198, 0x00A7,
    0x814E, 0x00A8,
    0x81CA, 0x00AC,
    0x818B, 0x00B0,
    0x817D, 0x00B1,
    0x814C, 0x00B4,
    0x81F7, 0x00B6,
    0x817E, 0x00D7,
    0x8180, 0x00F7,
    0x839F, 0x0391,
    0x83A0, 0x0392,
    0x83A1, 0x0393,
    0x83A2, 0x0394,
    0x83A3, 0x0395,
    0x83A4, 0x0396,
    0x83A5, 0x0397,
    0x83A6, 0x0398,
    0x83A7, 0x0399,
    0x83A8, 0x039A,
    0x83A9, 0x039B,
    0x83AA, 0x039C,
    0x83AB, 0x039D,
    0x83AC, 0x039E,
    0x83AD, 0x039F,
    0x83AE, 0x03A0,
    0x83AF, 0x03A1,
    0x83B0, 0x03A3,
    0x83B1, 0x03A4,
    0x83B2, 0x03A5,
    0x83B3, 0x03A6,
    0x83B4, 0x03A7,
    0x83B5, 0x03A8,
    0x83B6, 0x03A9,
    0x83BF, 0x03B1,
    0x83C0, 0x03B2,
    0x83C1, 0x03B3,
    0x83C2, 0x03B4,
    0x83C3, 0x03B5,
    0x83C4, 0x03B6,
    0x83C5, 0x03B7,
    0x83C6, 0x03B8,
    0x83C7, 0x03B9,
    0x83C8, 0x03BA,
    0x83C9, 0x03BB,
    0x83CA, 0x03BC,
    0x83CB, 0x03BD,
    0x83CC, 0x03BE,
    0x83CD, 0x03BF,
    0x83CE, 0x03C0,
    0x83CF, 0x03C1,
    0x83D0, 0x03C3,
    0x83D1, 0x03C4,
    0x83D2, 0x03C5,
    0x83D3, 0x03C6,
    0x83D4, 0x03C7,
    0x83D5, 0x03C8,
    0x83D6, 0x03C9,
    0x8446, 0x0401,
    0x8440, 0x0410,
    0x8441, 0x0411,
    0x8442, 0x0412,
    0x8443, 0x0413,
    0x8444, 0x0414,
    0x8445, 0x0415,
    0x8447, 0x0416,
    0x8448, 0x0417,
    0x8449, 0x0418,
    0x844A, 0x0419,
    0x844B, 0x041A,
    0x844C, 0x041B,
    0x844D, 0x041C,
    0x844E, 0x041D,
    0x844F, 0x041E,
    0x8450, 0x041F,
    0x8451, 0x0420,
    0x8452, 0x0421,
    0x8453, 0x0422,
    0x8454, 0x0423,
    0x8455, 0x0424,
    0x8456, 0x0425,
    0x8457, 0x0426,
    0x8458, 0x0427,
    0x8459, 0x0428,
    0x845A, 0x0429,
    0x845B, 0x042A,
    0x845C, 0x042B,
    0x845D, 0x042C,
    0x845E, 0x042D,
    0x845F, 0x042E,
    0x8460, 0x042F,
    0x8470, 0x0430,
    0x8471, 0x0431,
    0x8472, 0x0432,
    0x8473, 0x0433,
    0x8474, 0x0434,
    0x8475, 0x0435,
    0x8477, 0x0436,
    0x8478, 0x0437,
    0x8479, 0x0438,
    0x847A, 0x0439,
    0x847B, 0x043A,
    0x847C, 0x043B,
    0x847D, 0x043C,
    0x847E, 0x043D,
    0x8480, 0x043E,
    0x8481, 0x043F,
    0x8482, 0x0440,
    0x8483, 0x0441,
    0x8484, 0x0442,
    0x8485, 0x0443,
    0x8486, 0x0444,
    0x8487, 0x0445,
    0x8488, 0x0446,
    0x8489, 0x0447,
    0x848A, 0x0448,
    0x848B, 0x0449,
    0x848C, 0x044A,
    0x848D, 0x044B,
    0x848E, 0x044C,
    0x848F, 0x044D,
    0x8490, 0x044E,
    0x8491, 0x044F,
    0x8476, 0x0451,
    0x815D, 0x2010,
    0x815C, 0x2015,
    0x8161, 0x2016,
    0x8165, 0x2018,
    0x8166, 0x2019,
    0x8167, 0x201C,
    0x8168, 0x201D,
    0x81F5, 0x2020,
    0x81F6, 0x2021,
    0x8164, 0x2025,
    0x8163, 0x2026,
    0x81F1, 0x2030,
    0x818C, 0x2032,
    0x818D, 0x2033,
    0x81A6, 0x203B,
    0x007E, 0x203E,
    0x818E, 0x2103,
    0x81F0, 0x212B,
    0x81A9, 0x2190,
    0x81AA, 0x2191,
    0x81A8, 0x2192,
    0x81AB, 0x2193,
    0x81CB, 0x21D2,
    0x81CC, 0x21D4,
    0x81CD, 0x2200,
    0x81DD, 0x2202,
    0x81CE, 0x2203,
    0x81DE, 0x2207,
    0x81B8, 0x2208,
    0x81B9, 0x220B,
    0x817C, 0x2212,
    0x81E3, 0x221A,
    0x81E5, 0x221D,
    0x8187, 0x221E,
    0x81DA, 0x2220,
    0x81C8, 0x2227,
    0x81C9, 0x2228,
    0x81BF, 0x2229,
    0x81BE, 0x222A,
    0x81E7, 0x222B,
    0x81E8, 0x222C,
    0x8188, 0x2234,
    0x81E6, 0x2235,
    0x81E4, 0x223D,
    0x81E0, 0x2252,
    0x8182, 0x2260,
    0x81DF, 0x2261,
    0x8185, 0x2266,
    0x8186, 0x2267,
    0x81E1, 0x226A,
    0x81E2, 0x226B,
    0x81BC, 0x2282,
    0x81BD, 0x2283,
    0x81BA, 0x2286,
    0x81BB, 0x2287,
    0x81DB, 0x22A5,
    0x81DC, 0x2312,
    0x849F, 0x2500,
    0x84AA, 0x2501,
    0x84A0, 0x2502,
    0x84AB, 0x2503,
    0x84A1, 0x250C,
    0x84AC, 0x250F,
    0x84A2, 0x2510,
    0x84AD, 0x2513,
    0x84A4, 0x2514,
    0x84AF, 0x2517,
    0x84A3, 0x2518,
    0x84AE, 0x251B,
    0x84A5, 0x251C,
    0x84BA, 0x251D,
    0x84B5, 0x2520,
    0x84B0, 0x2523,
    0x84A7, 0x2524,
    0x84BC, 0x2525,
    0x84B7, 0x2528,
    0x84B2, 0x252B,
    0x84A6, 0x252C,
    0x84B6, 0x252F,
    0x84BB, 0x2530,
    0x84B1, 0x2533,
    0x84A8, 0x2534,
    0x84B8, 0x2537,
    0x84BD, 0x2538,
    0x84B3, 0x253B,
    0x84A9, 0x253C,
    0x84B9, 0x253F,
    0x84BE, 0x2542,
    0x84B4, 0x254B,
    0x81A1, 0x25A0,
    0x81A0, 0x25A1,
    0x81A3, 0x25B2,
    0x81A2, 0x25B3,
    0x81A5, 0x25BC,
    0x81A4, 0x25BD,
    0x819F, 0x25C6,
    0x819E, 0x25C7,
    0x819B, 0x25CB,
    0x819D, 0x25CE,
    0x819C, 0x25CF,
    0x81FC, 0x25EF,
    0x819A, 0x2605,
    0x8199, 0x2606,
    0x818A, 0x2640,
    0x8189, 0x2642,
    0x81F4, 0x266A,
    0x81F3, 0x266D,
    0x81F2, 0x266F,
    0x8140, 0x3000,
    0x8141, 0x3001,
    0x8142, 0x3002,
    0x8156, 0x3003,
    0x8158, 0x3005,
    0x8159, 0x3006,
    0x815A, 0x3007,
    0x8171, 0x3008,
    0x8172, 0x3009,
    0x8173, 0x300A,
    0x8174, 0x300B,
    0x8175, 0x300C,
    0x8176, 0x300D,
    0x8177, 0x300E,
    0x8178, 0x300F,
    0x8179, 0x3010,
    0x817A, 0x3011,
    0x81A7, 0x3012,
    0x81AC, 0x3013,
    0x816B, 0x3014,
    0x816C, 0x3015,
    0x8160, 0x301C,
    0x829F, 0x3041,
    0x82A0, 0x3042,
    0x82A1, 0x3043,
    0x82A2, 0x3044,
    0x82A3, 0x3045,
    0x82A4, 0x3046,
    0x82A5, 0x3047,
    0x82A6, 0x3048,
    0x82A7, 0x3049,
    0x82A8, 0x304A,
    0x82A9, 0x304B,
    0x82AA, 0x304C,
    0x82AB, 0x304D,
    0x82AC, 0x304E,
    0x82AD, 0x304F,
    0x82AE, 0x3050,
    0x82AF, 0x3051,
    0x82B0, 0x3052,
    0x82B1, 0x3053,
    0x82B2, 0x3054,
    0x82B3, 0x3055,
    0x82B4, 0x3056,
    0x82B5, 0x3057,
    0x82B6, 0x3058,
    0x82B7, 0x3059,
    0x82B8, 0x305A,
    0x82B9, 0x305B,
    0x82BA, 0x305C,
    0x82BB, 0x305D,
    0x82BC, 0x305E,
    0x82BD, 0x305F,
    0x82BE, 0x3060,
    0x82BF, 0x3061,
    0x82C0, 0x3062,
    0x82C1, 0x3063,
    0x82C2, 0x3064,
    0x82C3, 0x3065,
    0x82C4, 0x3066,
    0x82C5, 0x3067,
    0x82C6, 0x3068,
    0x82C7, 0x3069,
    0x82C8, 0x306A,
    0x82C9, 0x306B,
    0x82CA, 0x306C,
    0x82CB, 0x306D,
    0x82CC, 0x306E,
    0x82CD, 0x306F,
    0x82CE, 0x3070,
    0x82CF, 0x3071,
    0x82D0, 0x3072,
    0x82D1, 0x3073,
    0x82D2, 0x3074,
    0x82D3, 0x3075,
    0x82D4, 0x3076,
    0x82D5, 0x3077,
    0x82D6, 0x3078,
    0x82D7, 0x3079,
    0x82D8, 0x307A,
    0x82D9, 0x307B,
    0x82DA, 0x307C,
    0x82DB, 0x307D,
    0x82DC, 0x307E,
    0x82DD, 0x307F,
    0x82DE, 0x3080,
    0x82DF, 0x3081,
    0x82E0, 0x3082,
    0x82E1, 0x3083,
    0x82E2, 0x3084,
    0x82E3, 0x3085,
    0x82E4, 0x3086,
    0x82E5, 0x3087,
    0x82E6, 0x3088,
    0x82E7, 0x3089,
    0x82E8, 0x308A,
    0x82E9, 0x308B,
    0x82EA, 0x308C,
    0x82EB, 0x308D,
    0x82EC, 0x308E,
    0x82ED, 0x308F,
    0x82EE, 0x3090,
    0x82EF, 0x3091,
    0x82F0, 0x3092,
    0x82F1, 0x3093,
    0x814A, 0x309B,
    0x814B, 0x309C,
    0x8154, 0x309D,
    0x8155, 0x309E,
    0x8340, 0x30A1,
    0x8341, 0x30A2,
    0x8342, 0x30A3,
    0x8343, 0x30A4,
    0x8344, 0x30A5,
    0x8345, 0x30A6,
    0x8346, 0x30A7,
    0x8347, 0x30A8,
    0x8348, 0x30A9,
    0x8349, 0x30AA,
    0x834A, 0x30AB,
    0x834B, 0x30AC,
    0x834C, 0x30AD,
    0x834D, 0x30AE,
    0x834E, 0x30AF,
    0x834F, 0x30B0,
    0x8350, 0x30B1,
    0x8351, 0x30B2,
    0x8352, 0x30B3,
    0x8353, 0x30B4,
    0x8354, 0x30B5,
    0x8355, 0x30B6,
    0x8356, 0x30B7,
    0x8357, 0x30B8,
    0x8358, 0x30B9,
    0x8359, 0x30BA,
    0x835A, 0x30BB,
    0x835B, 0x30BC,
    0x835C, 0x30BD,
    0x835D, 0x30BE,
    0x835E, 0x30BF,
    0x835F, 0x30C0,
    0x8360, 0x30C1,
    0x8361, 0x30C2,
    0x8362, 0x30C3,
    0x8363, 0x30C4,
    0x8364, 0x30C5,
    0x8365, 0x30C6,
    0x8366, 0x30C7,
    0x8367, 0x30C8,
    0x8368, 0x30C9,
    0x8369, 0x30CA,
    0x836A, 0x30CB,
    0x836B, 0x30CC,
    0x836C, 0x30CD,
    0x836D, 0x30CE,
    0x836E, 0x30CF,
    0x836F, 0x30D0,
    0x8370, 0x30D1,
    0x8371, 0x30D2,
    0x8372, 0x30D3,
    0x8373, 0x30D4,
    0x8374, 0x30D5,
    0x8375, 0x30D6,
    0x8376, 0x30D7,
    0x8377, 0x30D8,
    0x8378, 0x30D9,
    0x8379, 0x30DA,
    0x837A, 0x30DB,
    0x837B, 0x30DC,
    0x837C, 0x30DD,
    0x837D, 0x30DE,
    0x837E, 0x30DF,
    0x8380, 0x30E0,
    0x8381, 0x30E1,
    0x8382, 0x30E2,
    0x8383, 0x30E3,
    0x8384, 0x30E4,
    0x8385, 0x30E5,
    0x8386, 0x30E6,
    0x8387, 0x30E7,
    0x8388, 0x30E8,
    0x8389, 0x30E9,
    0x838A, 0x30EA,
    0x838B, 0x30EB,
    0x838C, 0x30EC,
    0x838D, 0x30ED,
    0x838E, 0x30EE,
    0x838F, 0x30EF,
    0x8390, 0x30F0,
    0x8391, 0x30F1,
    0x8392, 0x30F2,
    0x8393, 0x30F3,
    0x8394, 0x30F4,
    0x8395, 0x30F5,
    0x8396, 0x30F6,
    0x8145, 0x30FB,
    0x815B, 0x30FC,
    0x8152, 0x30FD,
    0x8153, 0x30FE,
    0x88EA, 0x4E00,
    0x929A, 0x4E01,
    0x8EB5, 0x4E03,
    0x969C, 0x4E07,
    0x8FE4, 0x4E08,
    0x8E4F, 0x4E09,
    0x8FE3, 0x4E0A,
    0x89BA, 0x4E0B,
    0x9573, 0x4E0D,
    0x975E, 0x4E0E,
    0x98A0, 0x4E10,
    0x894E, 0x4E11,
    0x8A8E, 0x4E14,
    0x98A1, 0x4E15,
    0x90A2, 0x4E16,
    0x99C0, 0x4E17,
    0x8B75, 0x4E18,
    0x95B8, 0x4E19,
    0x8FE5, 0x4E1E,
    0x97BC, 0x4E21,
    0x95C0, 0x4E26,
    0x98A2, 0x4E2A,
    0x9286, 0x4E2D,
    0x98A3, 0x4E31,
    0x8BF8, 0x4E32,
    0x98A4, 0x4E36,
    0x8ADB, 0x4E38,
    0x924F, 0x4E39,
    0x8EE5, 0x4E3B,
    0x98A5, 0x4E3C,
    0x98A6, 0x4E3F,
    0x98A7, 0x4E42,
    0x9454, 0x4E43,
    0x8B76, 0x4E45,
    0x9456, 0x4E4B,
    0x93E1, 0x4E4D,
    0x8CC1, 0x4E4E,
    0x9652, 0x4E4F,
    0xE568, 0x4E55,
    0x98A8, 0x4E56,
    0x8FE6, 0x4E57,
    0x98A9, 0x4E58,
    0x89B3, 0x4E59,
    0x8BE3, 0x4E5D,
    0x8CEE, 0x4E5E,
    0x96E7, 0x4E5F,
    0x9BA4, 0x4E62,
    0x9790, 0x4E71,
    0x93FB, 0x4E73,
    0x8AA3, 0x4E7E,
    0x8B54, 0x4E80,
    0x98AA, 0x4E82,
    0x98AB, 0x4E85,
    0x97B9, 0x4E86,
    0x975C, 0x4E88,
    0x9188, 0x4E89,
    0x98AD, 0x4E8A,
    0x8E96, 0x4E8B,
    0x93F1, 0x4E8C,
    0x98B0, 0x4E8E,
    0x895D, 0x4E91,
    0x8CDD, 0x4E92,
    0x8CDC, 0x4E94,
    0x88E4, 0x4E95,
    0x986A, 0x4E98,
    0x9869, 0x4E99,
    0x8DB1, 0x4E9B,
    0x889F, 0x4E9C,
    0x98B1, 0x4E9E,
    0x98B2, 0x4E9F,
    0x98B3, 0x4EA0,
    0x9653, 0x4EA1,
    0x98B4, 0x4EA2,
    0x8CF0, 0x4EA4,
    0x88E5, 0x4EA5,
    0x9692, 0x4EA6,
    0x8B9C, 0x4EA8,
    0x8B9D, 0x4EAB,
    0x8B9E, 0x4EAC,
    0x92E0, 0x4EAD,
    0x97BA, 0x4EAE,
    0x98B5, 0x4EB0,
    0x98B6, 0x4EB3,
    0x98B7, 0x4EB6,
    0x906C, 0x4EBA,
    0x8F59, 0x4EC0,
    0x906D, 0x4EC1,
    0x98BC, 0x4EC2,
    0x98BA, 0x4EC4,
    0x98BB, 0x4EC6,
    0x8B77, 0x4EC7,
    0x8DA1, 0x4ECA,
    0x89EE, 0x4ECB,
    0x98B9, 0x4ECD,
    0x98B8, 0x4ECE,
    0x95A7, 0x4ECF,
    0x8E65, 0x4ED4,
    0x8E64, 0x4ED5,
    0x91BC, 0x4ED6,
    0x98BD, 0x4ED7,
    0x9574, 0x4ED8,
    0x90E5, 0x4ED9,
    0x8157, 0x4EDD,
    0x98BE, 0x4EDE,
    0x98C0, 0x4EDF,
    0x91E3, 0x4EE3,
    0x97DF, 0x4EE4,
    0x88C8, 0x4EE5,
    0x98BF, 0x4EED,
    0x89BC, 0x4EEE,
    0x8BC2, 0x4EF0,
    0x9287, 0x4EF2,
    0x8C8F, 0x4EF6,
    0x98C1, 0x4EF7,
    0x9443, 0x4EFB,
    0x8AE9, 0x4F01,
    0x98C2, 0x4F09,
    0x88C9, 0x4F0A,
    0x8CDE, 0x4F0D,
    0x8AEA, 0x4F0E,
    0x959A, 0x4F0F,
    0x94B0, 0x4F10,
    0x8B78, 0x4F11,
    0x89EF, 0x4F1A,
    0x98E5, 0x4F1C,
    0x9360, 0x4F1D,
    0x948C, 0x4F2F,
    0x98C4, 0x4F30,
    0x94BA, 0x4F34,
    0x97E0, 0x4F36,
    0x904C, 0x4F38,
    0x8E66, 0x4F3A,
    0x8E97, 0x4F3C,
    0x89BE, 0x4F3D,
    0x92CF, 0x4F43,
    0x9241, 0x4F46,
    0x98C8, 0x4F47,
    0x88CA, 0x4F4D,
    0x92E1, 0x4F4E,
    0x8F5A, 0x4F4F,
    0x8DB2, 0x4F50,
    0x9743, 0x4F51,
    0x91CC, 0x4F53,
    0x89BD, 0x4F55,
    0x98C7, 0x4F57,
    0x975D, 0x4F59,
    0x98C3, 0x4F5A,
    0x98C5, 0x4F5B,
    0x8DEC, 0x4F5C,
    0x98C6, 0x4F5D,
    0x9B43, 0x4F5E,
    0x98CE, 0x4F69,
    0x98D1, 0x4F6F,
    0x98CF, 0x4F70,
    0x89C0, 0x4F73,
    0x95B9, 0x4F75,
    0x98C9, 0x4F76,
    0x98CD, 0x4F7B,
    0x8CF1, 0x4F7C,
    0x8E67, 0x4F7F,
    0x8AA4, 0x4F83,
    0x98D2, 0x4F86,
    0x98CA, 0x4F88,
    0x97E1, 0x4F8B,
    0x8E98, 0x4F8D,
    0x98CB, 0x4F8F,
    0x98D0, 0x4F91,
    0x98D3, 0x4F96,
    0x98CC, 0x4F98,
    0x8B9F, 0x4F9B,
    0x88CB, 0x4F9D,
    0x8BA0, 0x4FA0,
    0x89BF, 0x4FA1,
    0x9B44, 0x4FAB,
    0x9699, 0x4FAD,
    0x958E, 0x4FAE,
    0x8CF2, 0x4FAF,
    0x904E, 0x4FB5,
    0x97B5, 0x4FB6,
    0x95D6, 0x4FBF,
    0x8C57, 0x4FC2,
    0x91A3, 0x4FC3,
    0x89E2, 0x4FC4,
    0x8F72, 0x4FCA,
    0x98D7, 0x4FCE,
    0x98DC, 0x4FD0,
    0x98DA, 0x4FD1,
    0x98D5, 0x4FD4,
    0x91AD, 0x4FD7,
    0x98D8, 0x4FD8,
    0x98DB, 0x4FDA,
    0x98D9, 0x4FDB,
    0x95DB, 0x4FDD,
    0x98D6, 0x4FDF,
    0x904D, 0x4FE1,
    0x9693, 0x4FE3,
    0x98DD, 0x4FE4,
    0x98DE, 0x4FE5,
    0x8F43, 0x4FEE,
    0x98EB, 0x4FEF,
    0x946F, 0x4FF3,
    0x9555, 0x4FF5,
    0x98E6, 0x4FF6,
    0x95EE, 0x4FF8,
    0x89B4, 0x4FFA,
    0x98EA, 0x4FFE,
    0x98E4, 0x5005,
    0x98ED, 0x5006,
    0x9171, 0x5009,
    0x8CC2, 0x500B,
    0x947B, 0x500D,
    0xE0C5, 0x500F,
    0x98EC, 0x5011,
    0x937C, 0x5012,
    0x98E1, 0x5014,
    0x8CF4, 0x5016,
    0x8CF3, 0x5019,
    0x98DF, 0x501A,
    0x8ED8, 0x501F,
    0x98E7, 0x5021,
    0x95ED, 0x5023,
    0x926C, 0x5024,
    0x98E3, 0x5025,
    0x8C91, 0x5026,
    0x98E0, 0x5028,
    0x98E8, 0x5029,
    0x98E2, 0x502A,
    0x97CF, 0x502B,
    0x98E9, 0x502C,
    0x9860, 0x502D,
    0x8BE4, 0x5036,
    0x8C90, 0x5039,
    0x98EE, 0x5043,
    0x98EF, 0x5047,
    0x98F3, 0x5048,
    0x88CC, 0x5049,
    0x95CE, 0x504F,
    0x98F2, 0x5050,
    0x98F1, 0x5055,
    0x98F5, 0x5056,
    0x98F4, 0x505A,
    0x92E2, 0x505C,
    0x8C92, 0x5065,
    0x98F6, 0x506C,
    0x8EC3, 0x5072,
    0x91A4, 0x5074,
    0x92E3, 0x5075,
    0x8BF4, 0x5076,
    0x98F7, 0x5078,
    0x8B55, 0x507D,
    0x98F8, 0x5080,
    0x98FA, 0x5085,
    0x9654, 0x508D,
    0x8C86, 0x5091,
    0x8E50, 0x5098,
    0x94F5, 0x5099,
    0x98F9, 0x509A,
    0x8DC3, 0x50AC,
    0x9762, 0x50AD,
    0x98FC, 0x50B2,
    0x9942, 0x50B3,
    0x98FB, 0x50B4,
    0x8DC2, 0x50B5,
    0x8F9D, 0x50B7,
    0x8C58, 0x50BE,
    0x9943, 0x50C2,
    0x8BCD, 0x50C5,
    0x9940, 0x50C9,
    0x9941, 0x50CA,
    0x93AD, 0x50CD,
    0x919C, 0x50CF,
    0x8BA1, 0x50D1,
    0x966C, 0x50D5,
    0x9944, 0x50D6,
    0x97BB, 0x50DA,
    0x9945, 0x50DE,
    0x9948, 0x50E3,
    0x9946, 0x50E5,
    0x916D, 0x50E7,
    0x9947, 0x50ED,
    0x9949, 0x50EE,
    0x994B, 0x50F5,
    0x994A, 0x50F9,
    0x95C6, 0x50FB,
    0x8B56, 0x5100,
    0x994D, 0x5101,
    0x994E, 0x5102,
    0x89AD, 0x5104,
    0x994C, 0x5109,
    0x8EF2, 0x5112,
    0x9951, 0x5114,
    0x9950, 0x5115,
    0x994F, 0x5116,
    0x98D4, 0x5118,
    0x9952, 0x511A,
    0x8F9E, 0x511F,
    0x9953, 0x5121,
    0x9744, 0x512A,
    0x96D7, 0x5132,
    0x9955, 0x5137,
    0x9954, 0x513A,
    0x9957, 0x513B,
    0x9956, 0x513C,
    0x9958, 0x513F,
    0x9959, 0x5140,
    0x88F2, 0x5141,
    0x8CB3, 0x5143,
    0x8C5A, 0x5144,
    0x8F5B, 0x5145,
    0x929B, 0x5146,
    0x8BA2, 0x5147,
    0x90E6, 0x5148,
    0x8CF5, 0x5149,
    0x8D8E, 0x514B,
    0x995B, 0x514C,
    0x96C6, 0x514D,
    0x9365, 0x514E,
    0x8E99, 0x5150,
    0x995A, 0x5152,
    0x995C, 0x5154,
    0x937D, 0x515A,
    0x8A95, 0x515C,
    0x995D, 0x5162,
    0x93FC, 0x5165,
    0x9153, 0x5168,
    0x995F, 0x5169,
    0x9960, 0x516A,
    0x94AA, 0x516B,
    0x8CF6, 0x516C,
    0x985A, 0x516D,
    0x9961, 0x516E,
    0x8BA4, 0x5171,
    0x95BA, 0x5175,
    0x91B4, 0x5176,
    0x8BEF, 0x5177,
    0x9354, 0x5178,
    0x8C93, 0x517C,
    0x9962, 0x5180,
    0x9963, 0x5182,
    0x93E0, 0x5185,
    0x897E, 0x5186,
    0x9966, 0x5189,
    0x8DFB, 0x518A,
    0x9965, 0x518C,
    0x8DC4, 0x518D,
    0x9967, 0x518F,
    0xE3EC, 0x5190,
    0x9968, 0x5191,
    0x9660, 0x5192,
    0x9969, 0x5193,
    0x996A, 0x5195,
    0x996B, 0x5196,
    0x8FE7, 0x5197,
    0x8ECA, 0x5199,
    0x8AA5, 0x51A0,
    0x996E, 0x51A2,
    0x996C, 0x51A4,
    0x96BB, 0x51A5,
    0x996D, 0x51A6,
    0x9579, 0x51A8,
    0x996F, 0x51A9,
    0x9970, 0x51AA,
    0x9971, 0x51AB,
    0x937E, 0x51AC,
    0x9975, 0x51B0,
    0x9973, 0x51B1,
    0x9974, 0x51B2,
    0x9972, 0x51B3,
    0x8DE1, 0x51B4,
    0x9976, 0x51B5,
    0x96E8, 0x51B6,
    0x97E2, 0x51B7,
    0x9977, 0x51BD,
    0x90A6, 0x51C4,
    0x9978, 0x51C5,
    0x8F79, 0x51C6,
    0x9979, 0x51C9,
    0x929C, 0x51CB,
    0x97BD, 0x51CC,
    0x9380, 0x51CD,
    0x99C3, 0x51D6,
    0x997A, 0x51DB,
    0xEAA3, 0x51DC,
    0x8BC3, 0x51DD,
    0x997B, 0x51E0,
    0x967D, 0x51E1,
    0x8F88, 0x51E6,
    0x91FA, 0x51E7,
    0x997D, 0x51E9,
    0x93E2, 0x51EA,
    0x997E, 0x51ED,
    0x9980, 0x51F0,
    0x8A4D, 0x51F1,
    0x9981, 0x51F5,
    0x8BA5, 0x51F6,
    0x93CA, 0x51F8,
    0x899A, 0x51F9,
    0x8F6F, 0x51FA,
    0x949F, 0x51FD,
    0x9982, 0x51FE,
    0x9381, 0x5200,
    0x906E, 0x5203,
    0x9983, 0x5204,
    0x95AA, 0x5206,
    0x90D8, 0x5207,
    0x8AA0, 0x5208,
    0x8AA7, 0x520A,
    0x9984, 0x520B,
    0x9986, 0x520E,
    0x8C59, 0x5211,
    0x9985, 0x5214,
    0x97F1, 0x5217,
    0x8F89, 0x521D,
    0x94BB, 0x5224,
    0x95CA, 0x5225,
    0x9987, 0x5227,
    0x9798, 0x5229,
    0x9988, 0x522A,
    0x9989, 0x522E,
    0x939E, 0x5230,
    0x998A, 0x5233,
    0x90A7, 0x5236,
    0x8DFC, 0x5237,
    0x8C94, 0x5238,
    0x998B, 0x5239,
    0x8E68, 0x523A,
    0x8D8F, 0x523B,
    0x92E4, 0x5243,
    0x998D, 0x5244,
    0x91A5, 0x5247,
    0x8DED, 0x524A,
    0x998E, 0x524B,
    0x998F, 0x524C,
    0x914F, 0x524D,
    0x998C, 0x524F,
    0x9991, 0x5254,
    0x9655, 0x5256,
    0x8D84, 0x525B,
    0x9990, 0x525E,
    0x8C95, 0x5263,
    0x8DDC, 0x5264,
    0x948D, 0x5265,
    0x9994, 0x5269,
    0x9992, 0x526A,
    0x959B, 0x526F,
    0x8FE8, 0x5270,
    0x999B, 0x5271,
    0x8A84, 0x5272,
    0x9995, 0x5273,
    0x9993, 0x5274,
    0x916E, 0x5275,
    0x9997, 0x527D,
    0x9996, 0x527F,
    0x8A63, 0x5283,
    0x8C80, 0x5287,
    0x999C, 0x5288,
    0x97AB, 0x5289,
    0x9998, 0x528D,
    0x999D, 0x5291,
    0x999A, 0x5292,
    0x9999, 0x5294,
    0x97CD, 0x529B,
    0x8CF7, 0x529F,
    0x89C1, 0x52A0,
    0x97F2, 0x52A3,
    0x8F95, 0x52A9,
    0x9377, 0x52AA,
    0x8D85, 0x52AB,
    0x99A0, 0x52AC,
    0x99A1, 0x52AD,
    0x97E3, 0x52B1,
    0x984A, 0x52B4,
    0x99A3, 0x52B5,
    0x8CF8, 0x52B9,
    0x99A2, 0x52BC,
    0x8A4E, 0x52BE,
    0x99A4, 0x52C1,
    0x9675, 0x52C3,
    0x92BA, 0x52C5,
    0x9745, 0x52C7,
    0x95D7, 0x52C9,
    0x99A5, 0x52CD,
    0xE8D3, 0x52D2,
    0x93AE, 0x52D5,
    0x99A6, 0x52D7,
    0x8AA8, 0x52D8,
    0x96B1, 0x52D9,
    0x8F9F, 0x52DD,
    0x99A7, 0x52DE,
    0x95E5, 0x52DF,
    0x99AB, 0x52E0,
    0x90A8, 0x52E2,
    0x99A8, 0x52E3,
    0x8BCE, 0x52E4,
    0x99A9, 0x52E6,
    0x8AA9, 0x52E7,
    0x8C4D, 0x52F2,
    0x99AC, 0x52F3,
    0x99AD, 0x52F5,
    0x99AE, 0x52F8,
    0x99AF, 0x52F9,
    0x8ED9, 0x52FA,
    0x8CF9, 0x52FE,
    0x96DC, 0x52FF,
    0x96E6, 0x5301,
    0x93F5, 0x5302,
    0x95EF, 0x5305,
    0x99B0, 0x5306,
    0x99B1, 0x5308,
    0x99B3, 0x530D,
    0x99B5, 0x530F,
    0x99B4, 0x5310,
    0x99B6, 0x5315,
    0x89BB, 0x5316,
    0x966B, 0x5317,
    0x8DFA, 0x5319,
    0x99B7, 0x531A,
    0x9178, 0x531D,
    0x8FA0, 0x5320,
    0x8BA7, 0x5321,
    0x99B8, 0x5323,
    0x94D9, 0x532A,
    0x99B9, 0x532F,
    0x99BA, 0x5331,
    0x99BB, 0x5333,
    0x99BC, 0x5338,
    0x9543, 0x5339,
    0x8BE6, 0x533A,
    0x88E3, 0x533B,
    0x93BD, 0x533F,
    0x99BD, 0x5340,
    0x8F5C, 0x5341,
    0x90E7, 0x5343,
    0x99BF, 0x5345,
    0x99BE, 0x5346,
    0x8FA1, 0x5347,
    0x8CDF, 0x5348,
    0x99C1, 0x5349,
    0x94BC, 0x534A,
    0x99C2, 0x534D,
    0x94DA, 0x5351,
    0x91B2, 0x5352,
    0x91EC, 0x5353,
    0x8BA6, 0x5354,
    0x93EC, 0x5357,
    0x9250, 0x5358,
    0x948E, 0x535A,
    0x966D, 0x535C,
    0x99C4, 0x535E,
    0x90E8, 0x5360,
    0x8C54, 0x5366,
    0x99C5, 0x5369,
    0x99C6, 0x536E,
    0x894B, 0x536F,
    0x88F3, 0x5370,
    0x8AEB, 0x5371,
    0x91A6, 0x5373,
    0x8B70, 0x5374,
    0x9791, 0x5375,
    0x99C9, 0x5377,
    0x89B5, 0x5378,
    0x99C8, 0x537B,
    0x8BA8, 0x537F,
    0x99CA, 0x5382,
    0x96EF, 0x5384,
    0x99CB, 0x5396,
    0x97D0, 0x5398,
    0x8CFA, 0x539A,
    0x8CB4, 0x539F,
    0x99CC, 0x53A0,
    0x99CE, 0x53A5,
    0x99CD, 0x53A6,
    0x907E, 0x53A8,
    0x8958, 0x53A9,
    0x897D, 0x53AD,
    0x99CF, 0x53AE,
    0x99D0, 0x53B0,
    0x8CB5, 0x53B3,
    0x99D1, 0x53B6,
    0x8B8E, 0x53BB,
    0x8E51, 0x53C2,
    0x99D2, 0x53C3,
    0x9694, 0x53C8,
    0x8DB3, 0x53C9,
    0x8B79, 0x53CA,
    0x9746, 0x53CB,
    0x916F, 0x53CC,
    0x94BD, 0x53CD,
    0x8EFB, 0x53CE,
    0x8F66, 0x53D4,
    0x8EE6, 0x53D6,
    0x8EF3, 0x53D7,
    0x8F96, 0x53D9,
    0x94BE, 0x53DB,
    0x99D5, 0x53DF,
    0x8962, 0x53E1,
    0x9170, 0x53E2,
    0x8CFB, 0x53E3,
    0x8CC3, 0x53E4,
    0x8BE5, 0x53E5,
    0x99D9, 0x53E8,
    0x9240, 0x53E9,
    0x91FC, 0x53EA,
    0x8BA9, 0x53EB,
    0x8FA2, 0x53EC,
    0x99DA, 0x53ED,
    0x99D8, 0x53EE,
    0x89C2, 0x53EF,
    0x91E4, 0x53F0,
    0x8EB6, 0x53F1,
    0x8E6A, 0x53F2,
    0x8945, 0x53F3,
    0x8A90, 0x53F6,
    0x8D86, 0x53F7,
    0x8E69, 0x53F8,
    0x99DB, 0x53FA,
    0x99DC, 0x5401,
    0x8B68, 0x5403,
    0x8A65, 0x5404,
    0x8D87, 0x5408,
    0x8B67, 0x5409,
    0x92DD, 0x540A,
    0x8944, 0x540B,
    0x93AF, 0x540C,
    0x96BC, 0x540D,
    0x8D40, 0x540E,
    0x9799, 0x540F,
    0x9366, 0x5410,
    0x8CFC, 0x5411,
    0x8C4E, 0x541B,
    0x99E5, 0x541D,
    0x8BE1, 0x541F,
    0x9669, 0x5420,
    0x94DB, 0x5426,
    0x99E4, 0x5429,
    0x8ADC, 0x542B,
    0x99DF, 0x542C,
    0x99E0, 0x542D,
    0x99E2, 0x542E,
    0x99E3, 0x5436,
    0x8B7A, 0x5438,
    0x9081, 0x5439,
    0x95AB, 0x543B,
    0x99E1, 0x543C,
    0x99DD, 0x543D,
    0x8CE1, 0x543E,
    0x99DE, 0x5440,
    0x9843, 0x5442,
    0x95F0, 0x5446,
    0x92E6, 0x5448,
    0x8CE0, 0x5449,
    0x8D90, 0x544A,
    0x99E6, 0x544E,
    0x93DB, 0x5451,
    0x99EA, 0x545F,
    0x8EFC, 0x5468,
    0x8EF4, 0x546A,
    0x99ED, 0x5470,
    0x99EB, 0x5471,
    0x96A1, 0x5473,
    0x99E8, 0x5475,
    0x99F1, 0x5476,
    0x99EC, 0x5477,
    0x99EF, 0x547B,
    0x8CC4, 0x547C,
    0x96BD, 0x547D,
    0x99F0, 0x5480,
    0x99F2, 0x5484,
    0x99F4, 0x5486,
    0x8DEE, 0x548B,
    0x9861, 0x548C,
    0x99E9, 0x548E,
    0x99E7, 0x548F,
    0x99F3, 0x5490,
    0x99EE, 0x5492,
    0x99F6, 0x54A2,
    0x9A42, 0x54A4,
    0x99F8, 0x54A5,
    0x99FC, 0x54A8,
    0x9A40, 0x54AB,
    0x99F9, 0x54AC,
    0x9A5D, 0x54AF,
    0x8DE7, 0x54B2,
    0x8A50, 0x54B3,
    0x99F7, 0x54B8,
    0x9A44, 0x54BC,
    0x88F4, 0x54BD,
    0x9A43, 0x54BE,
    0x88A3, 0x54C0,
    0x9569, 0x54C1,
    0x9A41, 0x54C2,
    0x99FA, 0x54C4,
    0x99F5, 0x54C7,
    0x99FB, 0x54C8,
    0x8DC6, 0x54C9,
    0x9A45, 0x54D8,
    0x88F5, 0x54E1,
    0x9A4E, 0x54E2,
    0x9A46, 0x54E5,
    0x9A47, 0x54E6,
    0x8FA3, 0x54E8,
    0x9689, 0x54E9,
    0x9A4C, 0x54ED,
    0x9A4B, 0x54EE,
    0x934E, 0x54F2,
    0x9A4D, 0x54FA,
    0x9A4A, 0x54FD,
    0x8953, 0x5504,
    0x8DB4, 0x5506,
    0x904F, 0x5507,
    0x9A48, 0x550F,
    0x9382, 0x5510,
    0x9A49, 0x5514,
    0x88A0, 0x5516,
    0x9A53, 0x552E,
    0x9742, 0x552F,
    0x8FA5, 0x5531,
    0x9A59, 0x5533,
    0x9A58, 0x5538,
    0x9A4F, 0x5539,
    0x91C1, 0x553E,
    0x9A50, 0x5540,
    0x91ED, 0x5544,
    0x9A55, 0x5545,
    0x8FA4, 0x5546,
    0x9A52, 0x554C,
    0x96E2, 0x554F,
    0x8C5B, 0x5553,
    0x9A56, 0x5556,
    0x9A57, 0x5557,
    0x9A54, 0x555C,
    0x9A5A, 0x555D,
    0x9A51, 0x5563,
    0x9A60, 0x557B,
    0x9A65, 0x557C,
    0x9A61, 0x557E,
    0x9A5C, 0x5580,
    0x9A66, 0x5583,
    0x9150, 0x5584,
    0x9A68, 0x5587,
    0x8D41, 0x5589,
    0x9A5E, 0x558A,
    0x929D, 0x558B,
    0x9A62, 0x5598,
    0x9A5B, 0x5599,
    0x8AAB, 0x559A,
    0x8AEC, 0x559C,
    0x8A85, 0x559D,
    0x9A63, 0x559E,
    0x9A5F, 0x559F,
    0x8C96, 0x55A7,
    0x9A69, 0x55A8,
    0x9A67, 0x55A9,
    0x9172, 0x55AA,
    0x8B69, 0x55AB,
    0x8BAA, 0x55AC,
    0x9A64, 0x55AE,
    0x8BF2, 0x55B0,
    0x8963, 0x55B6,
    0x9A6D, 0x55C4,
    0x9A6B, 0x55C5,
    0x9AA5, 0x55C7,
    0x9A70, 0x55D4,
    0x9A6A, 0x55DA,
    0x9A6E, 0x55DC,
    0x9A6C, 0x55DF,
    0x8E6B, 0x55E3,
    0x9A6F, 0x55E4,
    0x9A72, 0x55F7,
    0x9A77, 0x55F9,
    0x9A75, 0x55FD,
    0x9A74, 0x55FE,
    0x9251, 0x5606,
    0x89C3, 0x5609,
    0x9A71, 0x5614,
    0x9A73, 0x5616,
    0x8FA6, 0x5617,
    0x8952, 0x5618,
    0x9A76, 0x561B,
    0x89DC, 0x5629,
    0x9A82, 0x562F,
    0x8FFA, 0x5631,
    0x9A7D, 0x5632,
    0x9A7B, 0x5634,
    0x9A7C, 0x5636,
    0x9A7E, 0x5638,
    0x895C, 0x5642,
    0x9158, 0x564C,
    0x9A78, 0x564E,
    0x9A79, 0x5650,
    0x8A9A, 0x565B,
    0x9A81, 0x5664,
    0x8AED, 0x5668,
    0x9A84, 0x566A,
    0x9A80, 0x566B,
    0x9A83, 0x566C,
    0x95AC, 0x5674,
    0x93D3, 0x5678,
    0x94B6, 0x567A,
    0x9A86, 0x5680,
    0x9A85, 0x5686,
    0x8A64, 0x5687,
    0x9A87, 0x568A,
    0x9A8A, 0x568F,
    0x9A89, 0x5694,
    0x9A88, 0x56A0,
    0x9458, 0x56A2,
    0x9A8B, 0x56A5,
    0x9A8C, 0x56AE,
    0x9A8E, 0x56B4,
    0x9A8D, 0x56B6,
    0x9A90, 0x56BC,
    0x9A93, 0x56C0,
    0x9A91, 0x56C1,
    0x9A8F, 0x56C2,
    0x9A92, 0x56C3,
    0x9A94, 0x56C8,
    0x9A95, 0x56CE,
    0x9A96, 0x56D1,
    0x9A97, 0x56D3,
    0x9A98, 0x56D7,
    0x9964, 0x56D8,
    0x8EFA, 0x56DA,
    0x8E6C, 0x56DB,
    0x89F1, 0x56DE,
    0x88F6, 0x56E0,
    0x9263, 0x56E3,
    0x9A99, 0x56EE,
    0x8DA2, 0x56F0,
    0x88CD, 0x56F2,
    0x907D, 0x56F3,
    0x9A9A, 0x56F9,
    0x8CC5, 0x56FA,
    0x8D91, 0x56FD,
    0x9A9C, 0x56FF,
    0x9A9B, 0x5700,
    0x95DE, 0x5703,
    0x9A9D, 0x5704,
    0x9A9F, 0x5708,
    0x9A9E, 0x5709,
    0x9AA0, 0x570B,
    0x9AA1, 0x570D,
    0x8C97, 0x570F,
    0x8980, 0x5712,
    0x9AA2, 0x5713,
    0x9AA4, 0x5716,
    0x9AA3, 0x5718,
    0x9AA6, 0x571C,
    0x9379, 0x571F,
    0x9AA7, 0x5726,
    0x88B3, 0x5727,
    0x8DDD, 0x5728,
    0x8C5C, 0x572D,
    0x926E, 0x5730,
    0x9AA8, 0x5737,
    0x9AA9, 0x5738,
    0x9AAB, 0x573B,
    0x9AAC, 0x5740,
    0x8DE2, 0x5742,
    0x8BCF, 0x5747,
    0x9656, 0x574A,
    0x9AAA, 0x574E,
    0x9AAD, 0x574F,
    0x8DBF, 0x5750,
    0x8D42, 0x5751,
    0x9AB1, 0x5761,
    0x8DA3, 0x5764,
    0x9252, 0x5766,
    0x9AAE, 0x5769,
    0x92D8, 0x576A,
    0x9AB2, 0x577F,
    0x9082, 0x5782,
    0x9AB0, 0x5788,
    0x9AB3, 0x5789,
    0x8C5E, 0x578B,
    0x9AB4, 0x5793,
    0x9AB5, 0x57A0,
    0x8D43, 0x57A2,
    0x8A5F, 0x57A3,
    0x9AB7, 0x57A4,
    0x9AB8, 0x57AA,
    0x9AB9, 0x57B0,
    0x9AB6, 0x57B3,
    0x9AAF, 0x57C0,
    0x9ABA, 0x57C3,
    0x9ABB, 0x57C6,
    0x9684, 0x57CB,
    0x8FE9, 0x57CE,
    0x9ABD, 0x57D2,
    0x9ABE, 0x57D3,
    0x9ABC, 0x57D4,
    0x9AC0, 0x57D6,
    0x9457, 0x57DC,
    0x88E6, 0x57DF,
    0x9575, 0x57E0,
    0x9AC1, 0x57E3,
    0x8FFB, 0x57F4,
    0x8EB7, 0x57F7,
    0x947C, 0x57F9,
    0x8AEE, 0x57FA,
    0x8DE9, 0x57FC,
    0x9678, 0x5800,
    0x93B0, 0x5802,
    0x8C98, 0x5805,
    0x91CD, 0x5806,
    0x9ABF, 0x580A,
    0x9AC2, 0x580B,
    0x91C2, 0x5815,
    0x9AC3, 0x5819,
    0x9AC4, 0x581D,
    0x9AC6, 0x5821,
    0x92E7, 0x5824,
    0x8AAC, 0x582A,
    0xEA9F, 0x582F,
    0x8981, 0x5830,
    0x95F1, 0x5831,
    0x8FEA, 0x5834,
    0x9367, 0x5835,
    0x8DE4, 0x583A,
    0x9ACC, 0x583D,
    0x95BB, 0x5840,
    0x97DB, 0x5841,
    0x89F2, 0x584A,
    0x9AC8, 0x584B,
    0x9159, 0x5851,
    0x9ACB, 0x5852,
    0x9383, 0x5854,
    0x9368, 0x5857,
    0x9384, 0x5858,
    0x94B7, 0x5859,
    0x92CB, 0x585A,
    0x8DC7, 0x585E,
    0x9AC7, 0x5862,
    0x8996, 0x5869,
    0x9355, 0x586B,
    0x9AC9, 0x5870,
    0x9AC5, 0x5872,
    0x906F, 0x5875,
    0x9ACD, 0x5879,
    0x8F6D, 0x587E,
    0x8BAB, 0x5883,
    0x9ACE, 0x5885,
    0x95E6, 0x5893,
    0x919D, 0x5897,
    0x92C4, 0x589C,
    0x9AD0, 0x589F,
    0x966E, 0x58A8,
    0x9AD1, 0x58AB,
    0x9AD6, 0x58AE,
    0x95AD, 0x58B3,
    0x9AD5, 0x58B8,
    0x9ACF, 0x58B9,
    0x9AD2, 0x58BA,
    0x9AD4, 0x58BB,
    0x8DA4, 0x58BE,
    0x95C7, 0x58C1,
    0x9AD7, 0x58C5,
    0x9264, 0x58C7,
    0x89F3, 0x58CA,
    0x8FEB, 0x58CC,
    0x9AD9, 0x58D1,
    0x9AD8, 0x58D3,
    0x8D88, 0x58D5,
    0x9ADA, 0x58D7,
    0x9ADC, 0x58D8,
    0x9ADB, 0x58D9,
    0x9ADE, 0x58DC,
    0x9AD3, 0x58DE,
    0x9AE0, 0x58DF,
    0x9ADF, 0x58E4,
    0x9ADD, 0x58E5,
    0x8E6D, 0x58EB,
    0x9070, 0x58EC,
    0x9173, 0x58EE,
    0x9AE1, 0x58EF,
    0x90BA, 0x58F0,
    0x88EB, 0x58F1,
    0x9484, 0x58F2,
    0x92D9, 0x58F7,
    0x9AE3, 0x58F9,
    0x9AE2, 0x58FA,
    0x9AE4, 0x58FB,
    0x9AE5, 0x58FC,
    0x9AE6, 0x58FD,
    0x9AE7, 0x5902,
    0x95CF, 0x5909,
    0x9AE8, 0x590A,
    0x89C4, 0x590F,
    0x9AE9, 0x5910,
    0x975B, 0x5915,
    0x8A4F, 0x5916,
    0x99C7, 0x5918,
    0x8F67, 0x5919,
    0x91BD, 0x591A,
    0x9AEA, 0x591B,
    0x96E9, 0x591C,
    0x96B2, 0x5922,
    0x9AEC, 0x5925,
    0x91E5, 0x5927,
    0x9356, 0x5929,
    0x91BE, 0x592A,
    0x9576, 0x592B,
    0x9AED, 0x592C,
    0x9AEE, 0x592D,
    0x899B, 0x592E,
    0x8EB8, 0x5931,
    0x9AEF, 0x5932,
    0x88CE, 0x5937,
    0x9AF0, 0x5938,
    0x9AF1, 0x593E,
    0x8982, 0x5944,
    0x8AEF, 0x5947,
    0x93DE, 0x5948,
    0x95F2, 0x5949,
    0x9AF5, 0x594E,
    0x9174, 0x594F,
    0x9AF4, 0x5950,
    0x8C5F, 0x5951,
    0x967A, 0x5954,
    0x9AF3, 0x5955,
    0x9385, 0x5957,
    0x9AF7, 0x5958,
    0x9AF6, 0x595A,
    0x9AF9, 0x5960,
    0x9AF8, 0x5962,
    0x899C, 0x5965,
    0x9AFA, 0x5967,
    0x8FA7, 0x5968,
    0x9AFC, 0x5969,
    0x9244, 0x596A,
    0x9AFB, 0x596C,
    0x95B1, 0x596E,
    0x8F97, 0x5973,
    0x937A, 0x5974,
    0x9B40, 0x5978,
    0x8D44, 0x597D,
    0x9B41, 0x5981,
    0x9440, 0x5982,
    0x94DC, 0x5983,
    0x96CF, 0x5984,
    0x9444, 0x598A,
    0x9B4A, 0x598D,
    0x8B57, 0x5993,
    0x9764, 0x5996,
    0x96AD, 0x5999,
    0x9BAA, 0x599B,
    0x9B42, 0x599D,
    0x9B45, 0x59A3,
    0x91C3, 0x59A5,
    0x9657, 0x59A8,
    0x9369, 0x59AC,
    0x9B46, 0x59B2,
    0x9685, 0x59B9,
    0x8DC8, 0x59BB,
    0x8FA8, 0x59BE,
    0x9B47, 0x59C6,
    0x8E6F, 0x59C9,
    0x8E6E, 0x59CB,
    0x88B7, 0x59D0,
    0x8CC6, 0x59D1,
    0x90A9, 0x59D3,
    0x88CF, 0x59D4,
    0x9B4B, 0x59D9,
    0x9B4C, 0x59DA,
    0x9B49, 0x59DC,
    0x8957, 0x59E5,
    0x8AAD, 0x59E6,
    0x9B48, 0x59E8,
    0x96C3, 0x59EA,
    0x9550, 0x59EB,
    0x88A6, 0x59F6,
    0x88F7, 0x59FB,
    0x8E70, 0x59FF,
    0x88D0, 0x5A01,
    0x88A1, 0x5A03,
    0x9B51, 0x5A09,
    0x9B4F, 0x5A11,
    0x96BA, 0x5A18,
    0x9B52, 0x5A1A,
    0x9B50, 0x5A1C,
    0x9B4E, 0x5A1F,
    0x9050, 0x5A20,
    0x9B4D, 0x5A25,
    0x95D8, 0x5A29,
    0x8CE2, 0x5A2F,
    0x9B56, 0x5A35,
    0x9B57, 0x5A36,
    0x8FA9, 0x5A3C,
    0x9B53, 0x5A40,
    0x984B, 0x5A41,
    0x946B, 0x5A46,
    0x9B55, 0x5A49,
    0x8DA5, 0x5A5A,
    0x9B58, 0x5A62,
    0x9577, 0x5A66,
    0x9B59, 0x5A6A,
    0x9B54, 0x5A6C,
    0x96B9, 0x5A7F,
    0x947D, 0x5A92,
    0x9B5A, 0x5A9A,
    0x9551, 0x5A9B,
    0x9B5B, 0x5ABC,
    0x9B5F, 0x5ABD,
    0x9B5C, 0x5ABE,
    0x89C5, 0x5AC1,
    0x9B5E, 0x5AC2,
    0x8EB9, 0x5AC9,
    0x9B5D, 0x5ACB,
    0x8C99, 0x5ACC,
    0x9B6B, 0x5AD0,
    0x9B64, 0x5AD6,
    0x9B61, 0x5AD7,
    0x9284, 0x5AE1,
    0x9B60, 0x5AE3,
    0x9B62, 0x5AE6,
    0x9B63, 0x5AE9,
    0x9B65, 0x5AFA,
    0x9B66, 0x5AFB,
    0x8AF0, 0x5B09,
    0x9B68, 0x5B0B,
    0x9B67, 0x5B0C,
    0x9B69, 0x5B16,
    0x8FEC, 0x5B22,
    0x9B6C, 0x5B2A,
    0x92DA, 0x5B2C,
    0x8964, 0x5B30,
    0x9B6A, 0x5B32,
    0x9B6D, 0x5B36,
    0x9B6E, 0x5B3E,
    0x9B71, 0x5B40,
    0x9B6F, 0x5B43,
    0x9B70, 0x5B45,
    0x8E71, 0x5B50,
    0x9B72, 0x5B51,
    0x8D45, 0x5B54,
    0x9B73, 0x5B55,
    0x8E9A, 0x5B57,
    0x91B6, 0x5B58,
    0x9B74, 0x5B5A,
    0x9B75, 0x5B5B,
    0x8E79, 0x5B5C,
    0x8D46, 0x5B5D,
    0x96D0, 0x5B5F,
    0x8B47, 0x5B63,
    0x8CC7, 0x5B64,
    0x9B76, 0x5B65,
    0x8A77, 0x5B66,
    0x9B77, 0x5B69,
    0x91B7, 0x5B6B,
    0x9B78, 0x5B70,
    0x9BA1, 0x5B71,
    0x9B79, 0x5B73,
    0x9B7A, 0x5B75,
    0x9B7B, 0x5B78,
    0x9B7D, 0x5B7A,
    0x9B7E, 0x5B80,
    0x9B80, 0x5B83,
    0x91EE, 0x5B85,
    0x8946, 0x5B87,
    0x8EE7, 0x5B88,
    0x88C0, 0x5B89,
    0x9176, 0x5B8B,
    0x8AAE, 0x5B8C,
    0x8EB3, 0x5B8D,
    0x8D47, 0x5B8F,
    0x9386, 0x5B95,
    0x8F40, 0x5B97,
    0x8AAF, 0x5B98,
    0x9288, 0x5B99,
    0x92E8, 0x5B9A,
    0x88B6, 0x5B9B,
    0x8B58, 0x5B9C,
    0x95F3, 0x5B9D,
    0x8EC0, 0x5B9F,
    0x8B71, 0x5BA2,
    0x90E9, 0x5BA3,
    0x8EBA, 0x5BA4,
    0x9747, 0x5BA5,
    0x9B81, 0x5BA6,
    0x8B7B, 0x5BAE,
    0x8DC9, 0x5BB0,
    0x8A51, 0x5BB3,
    0x8983, 0x5BB4,
    0x8FAA, 0x5BB5,
    0x89C6, 0x5BB6,
    0x9B82, 0x5BB8,
    0x9765, 0x5BB9,
    0x8F68, 0x5BBF,
    0x8EE2, 0x5BC2,
    0x9B83, 0x5BC3,
    0x8AF1, 0x5BC4,
    0x93D0, 0x5BC5,
    0x96A7, 0x5BC6,
    0x9B84, 0x5BC7,
    0x9B85, 0x5BC9,
    0x9578, 0x5BCC,
    0x9B87, 0x5BD0,
    0x8AA6, 0x5BD2,
    0x8BF5, 0x5BD3,
    0x9B86, 0x5BD4,
    0x8AB0, 0x5BDB,
    0x9051, 0x5BDD,
    0x9B8B, 0x5BDE,
    0x8E40, 0x5BDF,
    0x89C7, 0x5BE1,
    0x9B8A, 0x5BE2,
    0x9B88, 0x5BE4,
    0x9B8C, 0x5BE5,
    0x9B89, 0x5BE6,
    0x944A, 0x5BE7,
    0x9ECB, 0x5BE8,
    0x9052, 0x5BE9,
    0x9B8D, 0x5BEB,
    0x97BE, 0x5BEE,
    0x9B8E, 0x5BF0,
    0x9B90, 0x5BF3,
    0x929E, 0x5BF5,
    0x9B8F, 0x5BF6,
    0x90A1, 0x5BF8,
    0x8E9B, 0x5BFA,
    0x91CE, 0x5BFE,
    0x8EF5, 0x5BFF,
    0x9595, 0x5C01,
    0x90EA, 0x5C02,
    0x8ECB, 0x5C04,
    0x9B91, 0x5C05,
    0x8FAB, 0x5C06,
    0x9B92, 0x5C07,
    0x9B93, 0x5C08,
    0x88D1, 0x5C09,
    0x91B8, 0x5C0A,
    0x9071, 0x5C0B,
    0x9B94, 0x5C0D,
    0x93B1, 0x5C0E,
    0x8FAC, 0x5C0F,
    0x8FAD, 0x5C11,
    0x9B95, 0x5C13,
    0x90EB, 0x5C16,
    0x8FAE, 0x5C1A,
    0x9B96, 0x5C20,
    0x9B97, 0x5C22,
    0x96DE, 0x5C24,
    0x9B98, 0x5C28,
    0x8BC4, 0x5C2D,
    0x8F41, 0x5C31,
    0x9B99, 0x5C38,
    0x9B9A, 0x5C39,
    0x8EDA, 0x5C3A,
    0x904B, 0x5C3B,
    0x93F2, 0x5C3C,
    0x9073, 0x5C3D,
    0x94F6, 0x5C3E,
    0x9441, 0x5C3F,
    0x8BC7, 0x5C40,
    0x9B9B, 0x5C41,
    0x8B8F, 0x5C45,
    0x9B9C, 0x5C46,
    0x8BFC, 0x5C48,
    0x93CD, 0x5C4A,
    0x89AE, 0x5C4B,
    0x8E72, 0x5C4D,
    0x9B9D, 0x5C4E,
    0x9BA0, 0x5C4F,
    0x9B9F, 0x5C50,
    0x8BFB, 0x5C51,
    0x9B9E, 0x5C53,
    0x9357, 0x5C55,
    0x91AE, 0x5C5E,
    0x936A, 0x5C60,
    0x8EC6, 0x5C61,
    0x9177, 0x5C64,
    0x979A, 0x5C65,
    0x9BA2, 0x5C6C,
    0x9BA3, 0x5C6E,
    0x93D4, 0x5C6F,
    0x8E52, 0x5C71,
    0x9BA5, 0x5C76,
    0x9BA6, 0x5C79,
    0x9BA7, 0x5C8C,
    0x8AF2, 0x5C90,
    0x9BA8, 0x5C91,
    0x9BA9, 0x5C94,
    0x89AA, 0x5CA1,
    0x915A, 0x5CA8,
    0x8AE2, 0x5CA9,
    0x9BAB, 0x5CAB,
    0x96A6, 0x5CAC,
    0x91D0, 0x5CB1,
    0x8A78, 0x5CB3,
    0x9BAD, 0x5CB6,
    0x9BAF, 0x5CB7,
    0x8ADD, 0x5CB8,
    0x9BAC, 0x5CBB,
    0x9BAE, 0x5CBC,
    0x9BB1, 0x5CBE,
    0x9BB0, 0x5CC5,
    0x9BB2, 0x5CC7,
    0x9BB3, 0x5CD9,
    0x93BB, 0x5CE0,
    0x8BAC, 0x5CE1,
    0x89E3, 0x5CE8,
    0x9BB4, 0x5CE9,
    0x9BB9, 0x5CEA,
    0x9BB7, 0x5CED,
    0x95F5, 0x5CEF,
    0x95F4, 0x5CF0,
    0x9387, 0x5CF6,
    0x9BB6, 0x5CFA,
    0x8F73, 0x5CFB,
    0x9BB5, 0x5CFD,
    0x9092, 0x5D07,
    0x9BBA, 0x5D0B,
    0x8DE8, 0x5D0E,
    0x9BC0, 0x5D11,
    0x9BC1, 0x5D14,
    0x9BBB, 0x5D15,
    0x8A52, 0x5D16,
    0x9BBC, 0x5D17,
    0x9BC5, 0x5D18,
    0x9BC4, 0x5D19,
    0x9BC3, 0x5D1A,
    0x9BBF, 0x5D1B,
    0x9BBE, 0x5D1F,
    0x9BC2, 0x5D22,
    0x95F6, 0x5D29,
    0x9BC9, 0x5D4B,
    0x9BC6, 0x5D4C,
    0x9BC8, 0x5D4E,
    0x9792, 0x5D50,
    0x9BC7, 0x5D52,
    0x9BBD, 0x5D5C,
    0x9093, 0x5D69,
    0x9BCA, 0x5D6C,
    0x8DB5, 0x5D6F,
    0x9BCB, 0x5D73,
    0x9BCC, 0x5D76,
    0x9BCF, 0x5D82,
    0x9BCE, 0x5D84,
    0x9BCD, 0x5D87,
    0x9388, 0x5D8B,
    0x9BB8, 0x5D8C,
    0x9BD5, 0x5D90,
    0x9BD1, 0x5D9D,
    0x9BD0, 0x5DA2,
    0x9BD2, 0x5DAC,
    0x9BD3, 0x5DAE,
    0x9BD6, 0x5DB7,
    0x97E4, 0x5DBA,
    0x9BD7, 0x5DBC,
    0x9BD4, 0x5DBD,
    0x9BD8, 0x5DC9,
    0x8ADE, 0x5DCC,
    0x9BD9, 0x5DCD,
    0x9BDB, 0x5DD2,
    0x9BDA, 0x5DD3,
    0x9BDC, 0x5DD6,
    0x9BDD, 0x5DDB,
    0x90EC, 0x5DDD,
    0x8F42, 0x5DDE,
    0x8F84, 0x5DE1,
    0x9183, 0x5DE3,
    0x8D48, 0x5DE5,
    0x8DB6, 0x5DE6,
    0x8D49, 0x5DE7,
    0x8B90, 0x5DE8,
    0x9BDE, 0x5DEB,
    0x8DB7, 0x5DEE,
    0x8CC8, 0x5DF1,
    0x9BDF, 0x5DF2,
    0x96A4, 0x5DF3,
    0x9462, 0x5DF4,
    0x9BE0, 0x5DF5,
    0x8D4A, 0x5DF7,
    0x8AAA, 0x5DFB,
    0x9246, 0x5DFD,
    0x8BD0, 0x5DFE,
    0x8E73, 0x5E02,
    0x957A, 0x5E03,
    0x94BF, 0x5E06,
    0x9BE1, 0x5E0B,
    0x8AF3, 0x5E0C,
    0x9BE4, 0x5E11,
    0x929F, 0x5E16,
    0x9BE3, 0x5E19,
    0x9BE2, 0x5E1A,
    0x9BE5, 0x5E1B,
    0x92E9, 0x5E1D,
    0x9083, 0x5E25,
    0x8E74, 0x5E2B,
    0x90C8, 0x5E2D,
    0x91D1, 0x5E2F,
    0x8B41, 0x5E30,
    0x92A0, 0x5E33,
    0x9BE6, 0x5E36,
    0x9BE7, 0x5E37,
    0x8FED, 0x5E38,
    0x9658, 0x5E3D,
    0x9BEA, 0x5E40,
    0x9BE9, 0x5E43,
    0x9BE8, 0x5E44,
    0x959D, 0x5E45,
    0x9BF1, 0x5E47,
    0x9679, 0x5E4C,
    0x9BEB, 0x5E4E,
    0x9BED, 0x5E54,
    0x968B, 0x5E55,
    0x9BEC, 0x5E57,
    0x9BEE, 0x5E5F,
    0x94A6, 0x5E61,
    0x9BEF, 0x5E62,
    0x95BC, 0x5E63,
    0x9BF0, 0x5E64,
    0x8AB1, 0x5E72,
    0x95BD, 0x5E73,
    0x944E, 0x5E74,
    0x9BF2, 0x5E75,
    0x9BF3, 0x5E76,
    0x8D4B, 0x5E78,
    0x8AB2, 0x5E79,
    0x9BF4, 0x5E7A,
    0x8CB6, 0x5E7B,
    0x9763, 0x5E7C,
    0x9748, 0x5E7D,
    0x8AF4, 0x5E7E,
    0x9BF6, 0x5E7F,
    0x92A1, 0x5E81,
    0x8D4C, 0x5E83,
    0x8FAF, 0x5E84,
    0x94DD, 0x5E87,
    0x8FB0, 0x5E8A,
    0x8F98, 0x5E8F,
    0x92EA, 0x5E95,
    0x95F7, 0x5E96,
    0x9358, 0x5E97,
    0x8D4D, 0x5E9A,
    0x957B, 0x5E9C,
    0x9BF7, 0x5EA0,
    0x9378, 0x5EA6,
    0x8DC0, 0x5EA7,
    0x8CC9, 0x5EAB,
    0x92EB, 0x5EAD,
    0x88C1, 0x5EB5,
    0x8F8E, 0x5EB6,
    0x8D4E, 0x5EB7,
    0x9766, 0x5EB8,
    0x9BF8, 0x5EC1,
    0x9BF9, 0x5EC2,
    0x9470, 0x5EC3,
    0x9BFA, 0x5EC8,
    0x97F5, 0x5EC9,
    0x984C, 0x5ECA,
    0x9BFC, 0x5ECF,
    0x9BFB, 0x5ED0,
    0x8A66, 0x5ED3,
    0x9C40, 0x5ED6,
    0x9C43, 0x5EDA,
    0x9C44, 0x5EDB,
    0x9C42, 0x5EDD,
    0x955F, 0x5EDF,
    0x8FB1, 0x5EE0,
    0x9C46, 0x5EE1,
    0x9C45, 0x5EE2,
    0x9C41, 0x5EE3,
    0x9C47, 0x5EE8,
    0x9C48, 0x5EE9,
    0x9C49, 0x5EEC,
    0x9C4C, 0x5EF0,
    0x9C4A, 0x5EF1,
    0x9C4B, 0x5EF3,
    0x9C4D, 0x5EF4,
    0x8984, 0x5EF6,
    0x92EC, 0x5EF7,
    0x9C4E, 0x5EF8,
    0x8C9A, 0x5EFA,
    0x89F4, 0x5EFB,
    0x9455, 0x5EFC,
    0x9C4F, 0x5EFE,
    0x93F9, 0x5EFF,
    0x95D9, 0x5F01,
    0x9C50, 0x5F03,
    0x984D, 0x5F04,
    0x9C51, 0x5F09,
    0x95BE, 0x5F0A,
    0x9C54, 0x5F0B,
    0x989F, 0x5F0C,
    0x98AF, 0x5F0D,
    0x8EAE, 0x5F0F,
    0x93F3, 0x5F10,
    0x9C55, 0x5F11,
    0x8B7C, 0x5F13,
    0x92A2, 0x5F14,
    0x88F8, 0x5F15,
    0x9C56, 0x5F16,
    0x95A4, 0x5F17,
    0x8D4F, 0x5F18,
    0x926F, 0x5F1B,
    0x92ED, 0x5F1F,
    0x96ED, 0x5F25,
    0x8CB7, 0x5F26,
    0x8CCA, 0x5F27,
    0x9C57, 0x5F29,
    0x9C58, 0x5F2D,
    0x9C5E, 0x5F2F,
    0x8EE3, 0x5F31,
    0x92A3, 0x5F35,
    0x8BAD, 0x5F37,
    0x9C59, 0x5F38,
    0x954A, 0x5F3C,
    0x9265, 0x5F3E,
    0x9C5A, 0x5F41,
    0x9C5B, 0x5F48,
    0x8BAE, 0x5F4A,
    0x9C5C, 0x5F4C,
    0x9C5D, 0x5F4E,
    0x9C5F, 0x5F51,
    0x9396, 0x5F53,
    0x9C60, 0x5F56,
    0x9C61, 0x5F57,
    0x9C62, 0x5F59,
    0x9C53, 0x5F5C,
    0x9C52, 0x5F5D,
    0x9C63, 0x5F61,
    0x8C60, 0x5F62,
    0x9546, 0x5F66,
    0x8DCA, 0x5F69,
    0x9556, 0x5F6A,
    0x92A4, 0x5F6B,
    0x956A, 0x5F6C,
    0x9C64, 0x5F6D,
    0x8FB2, 0x5F70,
    0x8965, 0x5F71,
    0x9C65, 0x5F73,
    0x9C66, 0x5F77,
    0x96F0, 0x5F79,
    0x94DE, 0x5F7C,
    0x9C69, 0x5F7F,
    0x899D, 0x5F80,
    0x90AA, 0x5F81,
    0x9C68, 0x5F82,
    0x9C67, 0x5F83,
    0x8C61, 0x5F84,
    0x91D2, 0x5F85,
    0x9C6D, 0x5F87,
    0x9C6B, 0x5F88,
    0x9C6A, 0x5F8A,
    0x97A5, 0x5F8B,
    0x8CE3, 0x5F8C,
    0x8F99, 0x5F90,
    0x9C6C, 0x5F91,
    0x936B, 0x5F92,
    0x8F5D, 0x5F93,
    0x93BE, 0x5F97,
    0x9C70, 0x5F98,
    0x9C6F, 0x5F99,
    0x9C6E, 0x5F9E,
    0x9C71, 0x5FA0,
    0x8CE4, 0x5FA1,
    0x9C72, 0x5FA8,
    0x959C, 0x5FA9,
    0x8F7A, 0x5FAA,
    0x9C73, 0x5FAD,
    0x94F7, 0x5FAE,
    0x93BF, 0x5FB3,
    0x92A5, 0x5FB4,
    0x934F, 0x5FB9,
    0x9C74, 0x5FBC,
    0x8B4A, 0x5FBD,
    0x9053, 0x5FC3,
    0x954B, 0x5FC5,
    0x8AF5, 0x5FCC,
    0x9445, 0x5FCD,
    0x9C75, 0x5FD6,
    0x8E75, 0x5FD7,
    0x9659, 0x5FD8,
    0x965A, 0x5FD9,
    0x899E, 0x5FDC,
    0x9C7A, 0x5FDD,
    0x9289, 0x5FE0,
    0x9C77, 0x5FE4,
    0x89F5, 0x5FEB,
    0x9CAB, 0x5FF0,
    0x9C79, 0x5FF1,
    0x944F, 0x5FF5,
    0x9C78, 0x5FF8,
    0x9C76, 0x5FFB,
    0x8D9A, 0x5FFD,
    0x9C7C, 0x5FFF,
    0x9C83, 0x600E,
    0x9C89, 0x600F,
    0x9C81, 0x6010,
    0x937B, 0x6012,
    0x9C86, 0x6015,
    0x957C, 0x6016,
    0x9C80, 0x6019,
    0x9C85, 0x601B,
    0x97E5, 0x601C,
    0x8E76, 0x601D,
    0x91D3, 0x6020,
    0x9C7D, 0x6021,
    0x8B7D, 0x6025,
    0x9C88, 0x6026,
    0x90AB, 0x6027,
    0x8985, 0x6028,
    0x9C82, 0x6029,
    0x89F6, 0x602A,
    0x9C87, 0x602B,
    0x8BAF, 0x602F,
    0x9C84, 0x6031,
    0x9C8A, 0x603A,
    0x9C8C, 0x6041,
    0x9C96, 0x6042,
    0x9C94, 0x6043,
    0x9C91, 0x6046,
    0x9C90, 0x604A,
    0x97F6, 0x604B,
    0x9C92, 0x604D,
    0x8BB0, 0x6050,
    0x8D50, 0x6052,
    0x8F9A, 0x6055,
    0x9C99, 0x6059,
    0x9C8B, 0x605A,
    0x9C8F, 0x605F,
    0x9C7E, 0x6060,
    0x89F8, 0x6062,
    0x9C93, 0x6063,
    0x9C95, 0x6064,
    0x9270, 0x6065,
    0x8DA6, 0x6068,
    0x89B6, 0x6069,
    0x9C8D, 0x606A,
    0x9C98, 0x606B,
    0x9C97, 0x606C,
    0x8BB1, 0x606D,
    0x91A7, 0x606F,
    0x8A86, 0x6070,
    0x8C62, 0x6075,
    0x9C8E, 0x6077,
    0x9C9A, 0x6081,
    0x9C9D, 0x6083,
    0x9C9F, 0x6084,
    0x8EBB, 0x6089,
    0x9CA5, 0x608B,
    0x92EE, 0x608C,
    0x9C9B, 0x608D,
    0x9CA3, 0x6092,
    0x89F7, 0x6094,
    0x9CA1, 0x6096,
    0x9CA2, 0x6097,
    0x9C9E, 0x609A,
    0x9CA0, 0x609B,
    0x8CE5, 0x609F,
    0x9749, 0x60A0,
    0x8AB3, 0x60A3,
    0x8978, 0x60A6,
    0x9CA4, 0x60A7,
    0x9459, 0x60A9,
    0x88AB, 0x60AA,
    0x94DF, 0x60B2,
    0x9C7B, 0x60B3,
    0x9CAA, 0x60B4,
    0x9CAE, 0x60B5,
    0x96E3, 0x60B6,
    0x9CA7, 0x60B8,
    0x9389, 0x60BC,
    0x9CAC, 0x60BD,
    0x8FEE, 0x60C5,
    0x9CAD, 0x60C6,
    0x93D5, 0x60C7,
    0x9866, 0x60D1,
    0x9CA9, 0x60D3,
    0x9CAF, 0x60D8,
    0x8D9B, 0x60DA,
    0x90C9, 0x60DC,
    0x88D2, 0x60DF,
    0x9CA8, 0x60E0,
    0x9CA6, 0x60E1,
    0x9179, 0x60E3,
    0x9C9C, 0x60E7,
    0x8E53, 0x60E8,
    0x91C4, 0x60F0,
    0x9CBB, 0x60F1,
    0x917A, 0x60F3,
    0x9CB6, 0x60F4,
    0x9CB3, 0x60F6,
    0x9CB4, 0x60F7,
    0x8EE4, 0x60F9,
    0x9CB7, 0x60FA,
    0x9CBA, 0x60FB,
    0x9CB5, 0x6100,
    0x8F44, 0x6101,
    0x9CB8, 0x6103,
    0x9CB2, 0x6106,
    0x96FA, 0x6108,
    0x96F9, 0x6109,
    0x9CBC, 0x610D,
    0x9CBD, 0x610E,
    0x88D3, 0x610F,
    0x9CB1, 0x6115,
    0x8BF0, 0x611A,
    0x88A4, 0x611B,
    0x8AB4, 0x611F,
    0x9CB9, 0x6121,
    0x9CC1, 0x6127,
    0x9CC0, 0x6128,
    0x9CC5, 0x612C,
    0x9CC6, 0x6134,
    0x9CC4, 0x613C,
    0x9CC7, 0x613D,
    0x9CBF, 0x613E,
    0x9CC3, 0x613F,
    0x9CC8, 0x6142,
    0x9CC9, 0x6144,
    0x9CBE, 0x6147,
    0x8E9C, 0x6148,
    0x9CC2, 0x614A,
    0x91D4, 0x614B,
    0x8D51, 0x614C,
    0x9CB0, 0x614D,
    0x9054, 0x614E,
    0x9CD6, 0x6153,
    0x95E7, 0x6155,
    0x9CCC, 0x6158,
    0x9CCD, 0x6159,
    0x9CCE, 0x615A,
    0x9CD5, 0x615D,
    0x9CD4, 0x615F,
    0x969D, 0x6162,
    0x8AB5, 0x6163,
    0x9CD2, 0x6165,
    0x8C64, 0x6167,
    0x8A53, 0x6168,
    0x9CCF, 0x616B,
    0x97B6, 0x616E,
    0x9CD1, 0x616F,
    0x88D4, 0x6170,
    0x9CD3, 0x6171,
    0x9CCA, 0x6173,
    0x9CD0, 0x6174,
    0x9CD7, 0x6175,
    0x8C63, 0x6176,
    0x9CCB, 0x6177,
    0x977C, 0x617E,
    0x974A, 0x6182,
    0x9CDA, 0x6187,
    0x9CDE, 0x618A,
    0x919E, 0x618E,
    0x97F7, 0x6190,
    0x9CDF, 0x6191,
    0x9CDC, 0x6194,
    0x9CD9, 0x6196,
    0x9CD8, 0x6199,
    0x9CDD, 0x619A,
    0x95AE, 0x61A4,
    0x93B2, 0x61A7,
    0x8C65, 0x61A9,
    0x9CE0, 0x61AB,
    0x9CDB, 0x61AC,
    0x9CE1, 0x61AE,
    0x8C9B, 0x61B2,
    0x89AF, 0x61B6,
    0x9CE9, 0x61BA,
    0x8AB6, 0x61BE,
    0x9CE7, 0x61C3,
    0x9CE8, 0x61C6,
    0x8DA7, 0x61C7,
    0x9CE6, 0x61C8,
    0x9CE4, 0x61C9,
    0x9CE3, 0x61CA,
    0x9CEA, 0x61CB,
    0x9CE2, 0x61CC,
    0x9CEC, 0x61CD,
    0x89F9, 0x61D0,
    0x9CEE, 0x61E3,
    0x9CED, 0x61E6,
    0x92A6, 0x61F2,
    0x9CF1, 0x61F4,
    0x9CEF, 0x61F6,
    0x9CE5, 0x61F7,
    0x8C9C, 0x61F8,
    0x9CF0, 0x61FA,
    0x9CF4, 0x61FC,
    0x9CF3, 0x61FD,
    0x9CF5, 0x61FE,
    0x9CF2, 0x61FF,
    0x9CF6, 0x6200,
    0x9CF7, 0x6208,
    0x9CF8, 0x6209,
    0x95E8, 0x620A,
    0x9CFA, 0x620C,
    0x9CF9, 0x620D,
    0x8F5E, 0x620E,
    0x90AC, 0x6210,
    0x89E4, 0x6211,
    0x89FA, 0x6212,
    0x9CFB, 0x6214,
    0x88BD, 0x6216,
    0x90CA, 0x621A,
    0x9CFC, 0x621B,
    0xE6C1, 0x621D,
    0x9D40, 0x621E,
    0x8C81, 0x621F,
    0x9D41, 0x6221,
    0x90ED, 0x6226,
    0x9D42, 0x622A,
    0x9D43, 0x622E,
    0x8B59, 0x622F,
    0x9D44, 0x6230,
    0x9D45, 0x6232,
    0x9D46, 0x6233,
    0x91D5, 0x6234,
    0x8CCB, 0x6238,
    0x96DF, 0x623B,
    0x965B, 0x623F,
    0x8F8A, 0x6240,
    0x9D47, 0x6241,
    0x90EE, 0x6247,
    0xE7BB, 0x6248,
    0x94E0, 0x6249,
    0x8EE8, 0x624B,
    0x8DCB, 0x624D,
    0x9D48, 0x624E,
    0x91C5, 0x6253,
    0x95A5, 0x6255,
    0x91EF, 0x6258,
    0x9D4B, 0x625B,
    0x9D49, 0x625E,
    0x9D4C, 0x6260,
    0x9D4A, 0x6263,
    0x9D4D, 0x6268,
    0x95AF, 0x626E,
    0x88B5, 0x6271,
    0x957D, 0x6276,
    0x94E1, 0x6279,
    0x9D4E, 0x627C,
    0x9D51, 0x627E,
    0x8FB3, 0x627F,
    0x8B5A, 0x6280,
    0x9D4F, 0x6282,
    0x9D56, 0x6283,
    0x8FB4, 0x6284,
    0x9D50, 0x6289,
    0x9463, 0x628A,
    0x977D, 0x6291,
    0x9D52, 0x6292,
    0x9D53, 0x6293,
    0x9D57, 0x6294,
    0x938A, 0x6295,
    0x9D54, 0x6296,
    0x8D52, 0x6297,
    0x90DC, 0x6298,
    0x9D65, 0x629B,
    0x94B2, 0x629C,
    0x91F0, 0x629E,
    0x94E2, 0x62AB,
    0x9DAB, 0x62AC,
    0x95F8, 0x62B1,
    0x92EF, 0x62B5,
    0x9695, 0x62B9,
    0x9D5A, 0x62BB,
    0x899F, 0x62BC,
    0x928A, 0x62BD,
    0x9D63, 0x62C2,
    0x9253, 0x62C5,
    0x9D5D, 0x62C6,
    0x9D64, 0x62C7,
    0x9D5F, 0x62C8,
    0x9D66, 0x62C9,
    0x9D62, 0x62CA,
    0x9D61, 0x62CC,
    0x948F, 0x62CD,
    0x9D5B, 0x62CF,
    0x89FB, 0x62D0,
    0x9D59, 0x62D1,
    0x8B91, 0x62D2,
    0x91F1, 0x62D3,
    0x9D55, 0x62D4,
    0x9D58, 0x62D7,
    0x8D53, 0x62D8,
    0x90D9, 0x62D9,
    0x8FB5, 0x62DB,
    0x9D60, 0x62DC,
    0x9471, 0x62DD,
    0x8B92, 0x62E0,
    0x8A67, 0x62E1,
    0x8A87, 0x62EC,
    0x9040, 0x62ED,
    0x9D68, 0x62EE,
    0x9D6D, 0x62EF,
    0x9D69, 0x62F1,
    0x8C9D, 0x62F3,
    0x9D6E, 0x62F5,
    0x8E41, 0x62F6,
    0x8D89, 0x62F7,
    0x8F45, 0x62FE,
    0x9D5C, 0x62FF,
    0x8E9D, 0x6301,
    0x9D6B, 0x6302,
    0x8E77, 0x6307,
    0x9D6C, 0x6308,
    0x88C2, 0x6309,
    0x9D67, 0x630C,
    0x92A7, 0x6311,
    0x8B93, 0x6319,
    0x8BB2, 0x631F,
    0x9D6A, 0x6327,
    0x88A5, 0x6328,
    0x8DC1, 0x632B,
    0x9055, 0x632F,
    0x92F0, 0x633A,
    0x94D2, 0x633D,
    0x9D70, 0x633E,
    0x917D, 0x633F,
    0x91A8, 0x6349,
    0x8E4A, 0x634C,
    0x9D71, 0x634D,
    0x9D73, 0x634F,
    0x9D6F, 0x6350,
    0x95DF, 0x6355,
    0x92BB, 0x6357,
    0x917B, 0x635C,
    0x95F9, 0x6367,
    0x8ECC, 0x6368,
    0x9D80, 0x6369,
    0x9D7E, 0x636B,
    0x9098, 0x636E,
    0x8C9E, 0x6372,
    0x9D78, 0x6376,
    0x8FB7, 0x6377,
    0x93E6, 0x637A,
    0x9450, 0x637B,
    0x9D76, 0x6380,
    0x917C, 0x6383,
    0x8EF6, 0x6388,
    0x9D7B, 0x6389,
    0x8FB6, 0x638C,
    0x9D75, 0x638E,
    0x9D7A, 0x638F,
    0x9472, 0x6392,
    0x9D74, 0x6396,
    0x8C40, 0x6398,
    0x8A7C, 0x639B,
    0x9D7C, 0x639F,
    0x97A9, 0x63A0,
    0x8DCC, 0x63A1,
    0x9254, 0x63A2,
    0x9D79, 0x63A3,
    0x90DA, 0x63A5,
    0x8D54, 0x63A7,
    0x9084, 0x63A8,
    0x8986, 0x63A9,
    0x915B, 0x63AA,
    0x9D77, 0x63AB,
    0x8B64, 0x63AC,
    0x8C66, 0x63B2,
    0x92CD, 0x63B4,
    0x9D7D, 0x63B5,
    0x917E, 0x63BB,
    0x9D81, 0x63BE,
    0x9D83, 0x63C0,
    0x91B5, 0x63C3,
    0x9D89, 0x63C4,
    0x9D84, 0x63C6,
    0x9D86, 0x63C9,
    0x9560, 0x63CF,
    0x92F1, 0x63D0,
    0x9D87, 0x63D2,
    0x974B, 0x63D6,
    0x9767, 0x63DA,
    0x8AB7, 0x63DB,
    0x88AC, 0x63E1,
    0x9D85, 0x63E3,
    0x9D82, 0x63E9,
    0x8AF6, 0x63EE,
    0x8987, 0x63F4,
    0x9D88, 0x63F6,
    0x9768, 0x63FA,
    0x9D8C, 0x6406,
    0x91B9, 0x640D,
    0x9D93, 0x640F,
    0x9D8D, 0x6413,
    0x9D8A, 0x6416,
    0x9D91, 0x6417,
    0x9D72, 0x641C,
    0x9D8E, 0x6426,
    0x9D92, 0x6428,
    0x94C0, 0x642C,
    0x938B, 0x642D,
    0x9D8B, 0x6434,
    0x9D8F, 0x6436,
    0x8C67, 0x643A,
    0x8DEF, 0x643E,
    0x90DB, 0x6442,
    0x9D97, 0x644E,
    0x9345, 0x6458,
    0x9D94, 0x6467,
    0x9680, 0x6469,
    0x9D95, 0x646F,
    0x9D96, 0x6476,
    0x96CC, 0x6478,
    0x90A0, 0x647A,
    0x8C82, 0x6483,
    0x9D9D, 0x6488,
    0x8E54, 0x6492,
    0x9D9A, 0x6493,
    0x9D99, 0x6495,
    0x9451, 0x649A,
    0x93B3, 0x649E,
    0x9350, 0x64A4,
    0x9D9B, 0x64A5,
    0x9D9C, 0x64A9,
    0x958F, 0x64AB,
    0x9464, 0x64AD,
    0x8E42, 0x64AE,
    0x90EF, 0x64B0,
    0x966F, 0x64B2,
    0x8A68, 0x64B9,
    0x9DA3, 0x64BB,
    0x9D9E, 0x64BC,
    0x9769, 0x64C1,
    0x9DA5, 0x64C2,
    0x9DA1, 0x64C5,
    0x9DA2, 0x64C7,
    0x9180, 0x64CD,
    0x9DA0, 0x64D2,
    0x9D5E, 0x64D4,
    0x9DA4, 0x64D8,
    0x9D9F, 0x64DA,
    0x9DA9, 0x64E0,
    0x9DAA, 0x64E1,
    0x9346, 0x64E2,
    0x9DAC, 0x64E3,
    0x8E43, 0x64E6,
    0x9DA7, 0x64E7,
    0x8B5B, 0x64EC,
    0x9DAD, 0x64EF,
    0x9DA6, 0x64F1,
    0x9DB1, 0x64F2,
    0x9DB0, 0x64F4,
    0x9DAF, 0x64F6,
    0x9DB2, 0x64FA,
    0x9DB4, 0x64FD,
    0x8FEF, 0x64FE,
    0x9DB3, 0x6500,
    0x9DB7, 0x6505,
    0x9DB5, 0x6518,
    0x9DB6, 0x651C,
    0x9D90, 0x651D,
    0x9DB9, 0x6523,
    0x9DB8, 0x6524,
    0x9D98, 0x652A,
    0x9DBA, 0x652B,
    0x9DAE, 0x652C,
    0x8E78, 0x652F,
    0x9DBB, 0x6534,
    0x9DBC, 0x6535,
    0x9DBE, 0x6536,
    0x9DBD, 0x6537,
    0x9DBF, 0x6538,
    0x89FC, 0x6539,
    0x8D55, 0x653B,
    0x95FA, 0x653E,
    0x90AD, 0x653F,
    0x8CCC, 0x6545,
    0x9DC1, 0x6548,
    0x9DC4, 0x654D,
    0x9571, 0x654F,
    0x8B7E, 0x6551,
    0x9DC3, 0x6555,
    0x9DC2, 0x6556,
    0x9473, 0x6557,
    0x9DC5, 0x6558,
    0x8BB3, 0x6559,
    0x9DC7, 0x655D,
    0x9DC6, 0x655E,
    0x8AB8, 0x6562,
    0x8E55, 0x6563,
    0x93D6, 0x6566,
    0x8C68, 0x656C,
    0x9094, 0x6570,
    0x9DC8, 0x6572,
    0x90AE, 0x6574,
    0x9347, 0x6575,
    0x957E, 0x6577,
    0x9DC9, 0x6578,
    0x9DCA, 0x6582,
    0x9DCB, 0x6583,
    0x95B6, 0x6587,
    0x9B7C, 0x6588,
    0x90C4, 0x6589,
    0x956B, 0x658C,
    0x8DD6, 0x658E,
    0x94E3, 0x6590,
    0x94C1, 0x6591,
    0x936C, 0x6597,
    0x97BF, 0x6599,
    0x9DCD, 0x659B,
    0x8ECE, 0x659C,
    0x9DCE, 0x659F,
    0x88B4, 0x65A1,
    0x8BD2, 0x65A4,
    0x90CB, 0x65A5,
    0x9580, 0x65A7,
    0x9DCF, 0x65AB,
    0x8E61, 0x65AC,
    0x9266, 0x65AD,
    0x8E7A, 0x65AF,
    0x9056, 0x65B0,
    0x9DD0, 0x65B7,
    0x95FB, 0x65B9,
    0x8997, 0x65BC,
    0x8E7B, 0x65BD,
    0x9DD3, 0x65C1,
    0x9DD1, 0x65C3,
    0x9DD4, 0x65C4,
    0x97B7, 0x65C5,
    0x9DD2, 0x65C6,
    0x90F9, 0x65CB,
    0x9DD5, 0x65CC,
    0x91B0, 0x65CF,
    0x9DD6, 0x65D2,
    0x8AF8, 0x65D7,
    0x9DD8, 0x65D9,
    0x9DD7, 0x65DB,
    0x9DD9, 0x65E0,
    0x9DDA, 0x65E1,
    0x8AF9, 0x65E2,
    0x93FA, 0x65E5,
    0x9255, 0x65E6,
    0x8B8C, 0x65E7,
    0x8E7C, 0x65E8,
    0x9181, 0x65E9,
    0x8F7B, 0x65EC,
    0x88AE, 0x65ED,
    0x9DDB, 0x65F1,
    0x89A0, 0x65FA,
    0x9DDF, 0x65FB,
    0x8D56, 0x6602,
    0x9DDE, 0x6603,
    0x8DA9, 0x6606,
    0x8FB8, 0x6607,
    0x9DDD, 0x660A,
    0x8FB9, 0x660C,
    0x96BE, 0x660E,
    0x8DA8, 0x660F,
    0x88D5, 0x6613,
    0x90CC, 0x6614,
    0x9DE4, 0x661C,
    0x90AF, 0x661F,
    0x8966, 0x6620,
    0x8F74, 0x6625,
    0x9686, 0x6627,
    0x8DF0, 0x6628,
    0x8FBA, 0x662D,
    0x90A5, 0x662F,
    0x9DE3, 0x6634,
    0x9DE1, 0x6635,
    0x9DE2, 0x6636,
    0x928B, 0x663C,
    0x9E45, 0x663F,
    0x9DE8, 0x6641,
    0x8E9E, 0x6642,
    0x8D57, 0x6643,
    0x9DE6, 0x6644,
    0x9DE7, 0x6649,
    0x9057, 0x664B,
    0x9DE5, 0x664F,
    0x8E4E, 0x6652,
    0x9DEA, 0x665D,
    0x9DE9, 0x665E,
    0x9DEE, 0x665F,
    0x9DEF, 0x6662,
    0x9DEB, 0x6664,
    0x8A41, 0x6666,
    0x9DEC, 0x6667,
    0x9DED, 0x6668,
    0x94D3, 0x6669,
    0x9581, 0x666E,
    0x8C69, 0x666F,
    0x9DF0, 0x6670,
    0x90B0, 0x6674,
    0x8FBB, 0x6676,
    0x9271, 0x667A,
    0x8BC5, 0x6681,
    0x9DF1, 0x6683,
    0x9DF5, 0x6684,
    0x89C9, 0x6687,
    0x9DF2, 0x6688,
    0x9DF4, 0x6689,
    0x9DF3, 0x668E,
    0x8F8B, 0x6691,
    0x9267, 0x6696,
    0x88C3, 0x6697,
    0x9DF6, 0x6698,
    0x9DF7, 0x669D,
    0x92A8, 0x66A2,
    0x97EF, 0x66A6,
    0x8E62, 0x66AB,
    0x95E9, 0x66AE,
    0x965C, 0x66B4,
    0x9E41, 0x66B8,
    0x9DF9, 0x66B9,
    0x9DFC, 0x66BC,
    0x9DFB, 0x66BE,
    0x9DF8, 0x66C1,
    0x9E40, 0x66C4,
    0x93DC, 0x66C7,
    0x9DFA, 0x66C9,
    0x9E42, 0x66D6,
    0x8F8C, 0x66D9,
    0x9E43, 0x66DA,
    0x976A, 0x66DC,
    0x9498, 0x66DD,
    0x9E44, 0x66E0,
    0x9E46, 0x66E6,
    0x9E47, 0x66E9,
    0x9E48, 0x66F0,
    0x8BC8, 0x66F2,
    0x8967, 0x66F3,
    0x8D58, 0x66F4,
    0x9E49, 0x66F5,
    0x9E4A, 0x66F7,
    0x8F91, 0x66F8,
    0x9182, 0x66F9,
    0x99D6, 0x66FC,
    0x915D, 0x66FD,
    0x915C, 0x66FE,
    0x91D6, 0x66FF,
    0x8DC5, 0x6700,
    0x98F0, 0x6703,
    0x8C8E, 0x6708,
    0x974C, 0x6709,
    0x95FC, 0x670B,
    0x959E, 0x670D,
    0x9E4B, 0x670F,
    0x8DF1, 0x6714,
    0x92BD, 0x6715,
    0x9E4C, 0x6716,
    0x984E, 0x6717,
    0x965D, 0x671B,
    0x92A9, 0x671D,
    0x9E4D, 0x671E,
    0x8AFA, 0x671F,
    0x9E4E, 0x6726,
    0x9E4F, 0x6727,
    0x96D8, 0x6728,
    0x96A2, 0x672A,
    0x9696, 0x672B,
    0x967B, 0x672C,
    0x8E44, 0x672D,
    0x9E51, 0x672E,
    0x8EE9, 0x6731,
    0x9670, 0x6734,
    0x9E53, 0x6736,
    0x9E56, 0x6737,
    0x9E55, 0x6738,
    0x8AF7, 0x673A,
    0x8B80, 0x673D,
    0x9E52, 0x673F,
    0x9E54, 0x6741,
    0x9E57, 0x6746,
    0x9099, 0x6749,
    0x979B, 0x674E,
    0x88C7, 0x674F,
    0x8DDE, 0x6750,
    0x91BA, 0x6751,
    0x8EDB, 0x6753,
    0x8FF1, 0x6756,
    0x9E5A, 0x6759,
    0x936D, 0x675C,
    0x9E58, 0x675E,
    0x91A9, 0x675F,
    0x9E59, 0x6760,
    0x8FF0, 0x6761,
    0x96DB, 0x6762,
    0x9E5B, 0x6763,
    0x9E5C, 0x6764,
    0x9788, 0x6765,
    0x9E61, 0x676A,
    0x8D59, 0x676D,
    0x9474, 0x676F,
    0x9E5E, 0x6770,
    0x938C, 0x6771,
    0x9DDC, 0x6772,
    0x9DE0, 0x6773,
    0x8B6E, 0x6775,
    0x9466, 0x6777,
    0x9E60, 0x677C,
    0x8FBC, 0x677E,
    0x94C2, 0x677F,
    0x9E66, 0x6785,
    0x94F8, 0x6787,
    0x9E5D, 0x6789,
    0x9E63, 0x678B,
    0x9E62, 0x678C,
    0x90CD, 0x6790,
    0x968D, 0x6795,
    0x97D1, 0x6797,
    0x9687, 0x679A,
    0x89CA, 0x679C,
    0x8E7D, 0x679D,
    0x9867, 0x67A0,
    0x9E65, 0x67A1,
    0x9095, 0x67A2,
    0x9E64, 0x67A6,
    0x9E5F, 0x67A9,
    0x8CCD, 0x67AF,
    0x9E6B, 0x67B3,
    0x9E69, 0x67B4,
    0x89CB, 0x67B6,
    0x9E67, 0x67B7,
    0x9E6D, 0x67B8,
    0x9E73, 0x67B9,
    0x91C6, 0x67C1,
    0x95BF, 0x67C4,
    0x9E75, 0x67C6,
    0x9541, 0x67CA,
    0x9E74, 0x67CE,
    0x9490, 0x67CF,
    0x965E, 0x67D0,
    0x8AB9, 0x67D1,
    0x90F5, 0x67D3,
    0x8F5F, 0x67D4,
    0x92D1, 0x67D8,
    0x974D, 0x67DA,
    0x9E70, 0x67DD,
    0x9E6F, 0x67DE,
    0x9E71, 0x67E2,
    0x9E6E, 0x67E4,
    0x9E76, 0x67E7,
    0x9E6C, 0x67E9,
    0x9E6A, 0x67EC,
    0x9E72, 0x67EE,
    0x9E68, 0x67EF,
    0x928C, 0x67F1,
    0x96F6, 0x67F3,
    0x8EC4, 0x67F4,
    0x8DF2, 0x67F5,
    0x8DB8, 0x67FB,
    0x968F, 0x67FE,
    0x8A60, 0x67FF,
    0x92CC, 0x6802,
    0x93C8, 0x6803,
    0x8968, 0x6804,
    0x90F0, 0x6813,
    0x90B2, 0x6816,
    0x8C49, 0x6817,
    0x9E78, 0x681E,
    0x8D5A, 0x6821,
    0x8A9C, 0x6822,
    0x9E7A, 0x6829,
    0x8A94, 0x682A,
    0x9E81, 0x682B,
    0x9E7D, 0x6832,
    0x90F1, 0x6834,
    0x8A6A, 0x6838,
    0x8DAA, 0x6839,
    0x8A69, 0x683C,
    0x8DCD, 0x683D,
    0x9E7B, 0x6840,
    0x8C85, 0x6841,
    0x8C6A, 0x6842,
    0x938D, 0x6843,
    0x9E79, 0x6846,
    0x88C4, 0x6848,
    0x9E7C, 0x684D,
    0x9E7E, 0x684E,
    0x8BCB, 0x6850,
    0x8C4B, 0x6851,
    0x8ABA, 0x6853,
    0x8B6A, 0x6854,
    0x9E82, 0x6859,
    0x8DF7, 0x685C,
    0x9691, 0x685D,
    0x8E56, 0x685F,
    0x9E83, 0x6863,
    0x954F, 0x6867,
    0x9E8F, 0x6874,
    0x89B1, 0x6876,
    0x9E84, 0x6877,
    0x9E95, 0x687E,
    0x9E85, 0x687F,
    0x97C0, 0x6881,
    0x9E8C, 0x6883,
    0x947E, 0x6885,
    0x9E94, 0x688D,
    0x9E87, 0x688F,
    0x88B2, 0x6893,
    0x9E89, 0x6894,
    0x8D5B, 0x6897,
    0x9E8B, 0x689B,
    0x9E8A, 0x689D,
    0x9E86, 0x689F,
    0x9E91, 0x68A0,
    0x8FBD, 0x68A2,
    0x9AEB, 0x68A6,
    0x8CE6, 0x68A7,
    0x979C, 0x68A8,
    0x9E88, 0x68AD,
    0x92F2, 0x68AF,
    0x8A42, 0x68B0,
    0x8DAB, 0x68B1,
    0x9E80, 0x68B3,
    0x9E90, 0x68B5,
    0x8A81, 0x68B6,
    0x9E8E, 0x68B9,
    0x9E92, 0x68BA,
    0x938E, 0x68BC,
    0x8AFC, 0x68C4,
    0x9EB0, 0x68C6,
    0x96C7, 0x68C9,
    0x9E97, 0x68CA,
    0x8AFB, 0x68CB,
    0x9E9E, 0x68CD,
    0x965F, 0x68D2,
    0x9E9F, 0x68D4,
    0x9EA1, 0x68D5,
    0x9EA5, 0x68D7,
    0x9E99, 0x68D8,
    0x9249, 0x68DA,
    0x938F, 0x68DF,
    0x9EA9, 0x68E0,
    0x9E9C, 0x68E1,
    0x9EA6, 0x68E3,
    0x9EA0, 0x68E7,
    0x9058, 0x68EE,
    0x9EAA, 0x68EF,
    0x90B1, 0x68F2,
    0x9EA8, 0x68F9,
    0x8ABB, 0x68FA,
    0x986F, 0x6900,
    0x9E96, 0x6901,
    0x9EA4, 0x6904,
    0x88D6, 0x6905,
    0x9E98, 0x6908,
    0x96B8, 0x690B,
    0x9E9D, 0x690C,
    0x9041, 0x690D,
    0x92C5, 0x690E,
    0x9E93, 0x690F,
    0x9EA3, 0x6912,
    0x909A, 0x6919,
    0x9EAD, 0x691A,
    0x8A91, 0x691B,
    0x8C9F, 0x691C,
    0x9EAF, 0x6921,
    0x9E9A, 0x6922,
    0x9EAE, 0x6923,
    0x9EA7, 0x6925,
    0x9E9B, 0x6926,
    0x9EAB, 0x6928,
    0x9EAC, 0x692A,
    0x9EBD, 0x6930,
    0x93CC, 0x6934,
    0x9EA2, 0x6936,
    0x9EB9, 0x6939,
    0x9EBB, 0x693D,
    0x92D6, 0x693F,
    0x976B, 0x694A,
    0x9596, 0x6953,
    0x9EB6, 0x6954,
    0x91C8, 0x6955,
    0x9EBC, 0x6959,
    0x915E, 0x695A,
    0x9EB3, 0x695C,
    0x9EC0, 0x695D,
    0x9EBF, 0x695E,
    0x93ED, 0x6960,
    0x9EBE, 0x6961,
    0x93E8, 0x6962,
    0x9EC2, 0x696A,
    0x9EB5, 0x696B,
    0x8BC6, 0x696D,
    0x9EB8, 0x696E,
    0x8F7C, 0x696F,
    0x9480, 0x6973,
    0x9EBA, 0x6974,
    0x8BC9, 0x6975,
    0x9EB2, 0x6977,
    0x9EB4, 0x6978,
    0x9EB1, 0x6979,
    0x984F, 0x697C,
    0x8A79, 0x697D,
    0x9EB7, 0x697E,
    0x9EC1, 0x6981,
    0x8A54, 0x6982,
    0x8DE5, 0x698A,
    0x897C, 0x698E,
    0x9ED2, 0x6991,
    0x9850, 0x6994,
    0x9ED5, 0x6995,
    0x9059, 0x699B,
    0x9ED4, 0x699C,
    0x9ED3, 0x69A0,
    0x9ED0, 0x69A7,
    0x9EC4, 0x69AE,
    0x9EE1, 0x69B1,
    0x9EC3, 0x69B2,
    0x9ED6, 0x69B4,
    0x9ECE, 0x69BB,
    0x9EC9, 0x69BE,
    0x9EC6, 0x69BF,
    0x9EC7, 0x69C1,
    0x9ECF, 0x69C3,
    0xEAA0, 0x69C7,
    0x9ECC, 0x69CA,
    0x8D5C, 0x69CB,
    0x92C6, 0x69CC,
    0x9184, 0x69CD,
    0x9ECA, 0x69CE,
    0x9EC5, 0x69D0,
    0x9EC8, 0x69D3,
    0x976C, 0x69D8,
    0x968A, 0x69D9,
    0x9ECD, 0x69DD,
    0x9ED7, 0x69DE,
    0x9EDF, 0x69E7,
    0x9ED8, 0x69E8,
    0x9EE5, 0x69EB,
    0x9EE3, 0x69ED,
    0x9EDE, 0x69F2,
    0x9EDD, 0x69F9,
    0x92CE, 0x69FB,
    0x9185, 0x69FD,
    0x9EDB, 0x69FF,
    0x9ED9, 0x6A02,
    0x9EE0, 0x6A05,
    0x9EE6, 0x6A0A,
    0x94F3, 0x6A0B,
    0x9EEC, 0x6A0C,
    0x9EE7, 0x6A12,
    0x9EEA, 0x6A13,
    0x9EE4, 0x6A14,
    0x9294, 0x6A17,
    0x9557, 0x6A19,
    0x9EDA, 0x6A1B,
    0x9EE2, 0x6A1E,
    0x8FBE, 0x6A1F,
    0x96CD, 0x6A21,
    0x9EF6, 0x6A22,
    0x9EE9, 0x6A23,
    0x8CA0, 0x6A29,
    0x89A1, 0x6A2A,
    0x8A7E, 0x6A2B,
    0x9ED1, 0x6A2E,
    0x8FBF, 0x6A35,
    0x9EEE, 0x6A36,
    0x9EF5, 0x6A38,
    0x8EF7, 0x6A39,
    0x8A92, 0x6A3A,
    0x924D, 0x6A3D,
    0x9EEB, 0x6A44,
    0x9EF0, 0x6A47,
    0x9EF4, 0x6A48,
    0x8BB4, 0x6A4B,
    0x8B6B, 0x6A58,
    0x9EF2, 0x6A59,
    0x8B40, 0x6A5F,
    0x93C9, 0x6A61,
    0x9EF1, 0x6A62,
    0x9EF3, 0x6A66,
    0x9EED, 0x6A72,
    0x9EEF, 0x6A78,
    0x8A80, 0x6A7F,
    0x9268, 0x6A80,
    0x9EFA, 0x6A84,
    0x9EF8, 0x6A8D,
    0x8CE7, 0x6A8E,
    0x9EF7, 0x6A90,
    0x9F40, 0x6A97,
    0x9E77, 0x6A9C,
    0x9EF9, 0x6AA0,
    0x9EFB, 0x6AA2,
    0x9EFC, 0x6AA3,
    0x9F4B, 0x6AAA,
    0x9F47, 0x6AAC,
    0x9E8D, 0x6AAE,
    0x9F46, 0x6AB3,
    0x9F45, 0x6AB8,
    0x9F42, 0x6ABB,
    0x9EE8, 0x6AC1,
    0x9F44, 0x6AC2,
    0x9F43, 0x6AC3,
    0x9F49, 0x6AD1,
    0x9845, 0x6AD3,
    0x9F4C, 0x6ADA,
    0x8BF9, 0x6ADB,
    0x9F48, 0x6ADE,
    0x9F4A, 0x6ADF,
    0x94A5, 0x6AE8,
    0x9F4D, 0x6AEA,
    0x9F51, 0x6AFA,
    0x9F4E, 0x6AFB,
    0x9793, 0x6B04,
    0x9F4F, 0x6B05,
    0x9EDC, 0x6B0A,
    0x9F52, 0x6B12,
    0x9F53, 0x6B16,
    0x8954, 0x6B1D,
    0x9F55, 0x6B1F,
    0x8C87, 0x6B20,
    0x8E9F, 0x6B21,
    0x8BD3, 0x6B23,
    0x89A2, 0x6B27,
    0x977E, 0x6B32,
    0x9F57, 0x6B37,
    0x9F56, 0x6B38,
    0x9F59, 0x6B39,
    0x8B5C, 0x6B3A,
    0x8BD4, 0x6B3D,
    0x8ABC, 0x6B3E,
    0x9F5C, 0x6B43,
    0x9F5B, 0x6B47,
    0x9F5D, 0x6B49,
    0x89CC, 0x6B4C,
    0x9256, 0x6B4E,
    0x9F5E, 0x6B50,
    0x8ABD, 0x6B53,
    0x9F60, 0x6B54,
    0x9F5F, 0x6B59,
    0x9F61, 0x6B5B,
    0x9F62, 0x6B5F,
    0x9F63, 0x6B61,
    0x8E7E, 0x6B62,
    0x90B3, 0x6B63,
    0x8D9F, 0x6B64,
    0x9590, 0x6B66,
    0x95E0, 0x6B69,
    0x9863, 0x6B6A,
    0x8E95, 0x6B6F,
    0x8DCE, 0x6B73,
    0x97F0, 0x6B74,
    0x9F64, 0x6B78,
    0x9F65, 0x6B79,
    0x8E80, 0x6B7B,
    0x9F66, 0x6B7F,
    0x9F67, 0x6B80,
    0x9F69, 0x6B83,
    0x9F68, 0x6B84,
    0x9677, 0x6B86,
    0x8F7D, 0x6B89,
    0x8EEA, 0x6B8A,
    0x8E63, 0x6B8B,
    0x9F6A, 0x6B8D,
    0x9F6C, 0x6B95,
    0x9042, 0x6B96,
    0x9F6B, 0x6B98,
    0x9F6D, 0x6B9E,
    0x9F6E, 0x6BA4,
    0x9F6F, 0x6BAA,
    0x9F70, 0x6BAB,
    0x9F71, 0x6BAF,
    0x9F73, 0x6BB1,
    0x9F72, 0x6BB2,
    0x9F74, 0x6BB3,
    0x89A3, 0x6BB4,
    0x9269, 0x6BB5,
    0x9F75, 0x6BB7,
    0x8E45, 0x6BBA,
    0x8A6B, 0x6BBB,
    0x9F76, 0x6BBC,
    0x9361, 0x6BBF,
    0x9ACA, 0x6BC0,
    0x8B42, 0x6BC5,
    0x9F77, 0x6BC6,
    0x9F78, 0x6BCB,
    0x95EA, 0x6BCD,
    0x9688, 0x6BCE,
    0x93C5, 0x6BD2,
    0x9F79, 0x6BD3,
    0x94E4, 0x6BD4,
    0x94F9, 0x6BD8,
    0x96D1, 0x6BDB,
    0x9F7A, 0x6BDF,
    0x9F7C, 0x6BEB,
    0x9F7B, 0x6BEC,
    0x9F7E, 0x6BEF,
    0x9F7D, 0x6BF3,
    0x9F81, 0x6C08,
    0x8E81, 0x6C0F,
    0x96AF, 0x6C11,
    0x9F82, 0x6C13,
    0x9F83, 0x6C14,
    0x8B43, 0x6C17,
    0x9F84, 0x6C1B,
    0x9F86, 0x6C23,
    0x9F85, 0x6C24,
    0x9085, 0x6C34,
    0x9558, 0x6C37,
    0x8969, 0x6C38,
    0x94C3, 0x6C3E,
    0x92F3, 0x6C40,
    0x8F60, 0x6C41,
    0x8B81, 0x6C42,
    0x94C4, 0x6C4E,
    0x8EAC, 0x6C50,
    0x9F88, 0x6C55,
    0x8ABE, 0x6C57,
    0x8998, 0x6C5A,
    0x93F0, 0x6C5D,
    0x9F87, 0x6C5E,
    0x8D5D, 0x6C5F,
    0x9272, 0x6C60,
    0x9F89, 0x6C62,
    0x9F91, 0x6C68,
    0x9F8A, 0x6C6A,
    0x91BF, 0x6C70,
    0x8B82, 0x6C72,
    0x9F92, 0x6C73,
    0x8C88, 0x6C7A,
    0x8B44, 0x6C7D,
    0x9F90, 0x6C7E,
    0x9F8E, 0x6C81,
    0x9F8B, 0x6C82,
    0x9780, 0x6C83,
    0x92BE, 0x6C88,
    0x93D7, 0x6C8C,
    0x9F8C, 0x6C8D,
    0x9F94, 0x6C90,
    0x9F93, 0x6C92,
    0x8C42, 0x6C93,
    0x89AB, 0x6C96,
    0x8DB9, 0x6C99,
    0x9F8D, 0x6C9A,
    0x9F8F, 0x6C9B,
    0x9676, 0x6CA1,
    0x91F2, 0x6CA2,
    0x9697, 0x6CAB,
    0x9F9C, 0x6CAE,
    0x9F9D, 0x6CB1,
    0x89CD, 0x6CB3,
    0x95A6, 0x6CB8,
    0x96FB, 0x6CB9,
    0x9F9F, 0x6CBA,
    0x8EA1, 0x6CBB,
    0x8FC0, 0x6CBC,
    0x9F98, 0x6CBD,
    0x9F9E, 0x6CBE,
    0x8988, 0x6CBF,
    0x8BB5, 0x6CC1,
    0x9F95, 0x6CC4,
    0x9F9A, 0x6CC5,
    0x90F2, 0x6CC9,
    0x9491, 0x6CCA,
    0x94E5, 0x6CCC,
    0x9F97, 0x6CD3,
    0x9640, 0x6CD5,
    0x9F99, 0x6CD7,
    0x9FA2, 0x6CD9,
    0x9FA0, 0x6CDB,
    0x9F9B, 0x6CDD,
    0x9641, 0x6CE1,
    0x9467, 0x6CE2,
    0x8B83, 0x6CE3,
    0x9344, 0x6CE5,
    0x928D, 0x6CE8,
    0x9FA3, 0x6CEA,
    0x9FA1, 0x6CEF,
    0x91D7, 0x6CF0,
    0x9F96, 0x6CF1,
    0x896A, 0x6CF3,
    0x976D, 0x6D0B,
    0x9FAE, 0x6D0C,
    0x9FAD, 0x6D12,
    0x90F4, 0x6D17,
    0x9FAA, 0x6D19,
    0x978C, 0x6D1B,
    0x93B4, 0x6D1E,
    0x9FA4, 0x6D1F,
    0x92C3, 0x6D25,
    0x896B, 0x6D29,
    0x8D5E, 0x6D2A,
    0x9FA7, 0x6D2B,
    0x8F46, 0x6D32,
    0x9FAC, 0x6D33,
    0x9FAB, 0x6D35,
    0x9FA6, 0x6D36,
    0x9FA9, 0x6D38,
    0x8A88, 0x6D3B,
    0x9FA8, 0x6D3D,
    0x9468, 0x6D3E,
    0x97AC, 0x6D41,
    0x8FF2, 0x6D44,
    0x90F3, 0x6D45,
    0x9FB4, 0x6D59,
    0x9FB2, 0x6D5A,
    0x956C, 0x6D5C,
    0x9FAF, 0x6D63,
    0x9FB1, 0x6D64,
    0x8959, 0x6D66,
    0x8D5F, 0x6D69,
    0x9851, 0x6D6A,
    0x8A5C, 0x6D6C,
    0x9582, 0x6D6E,
    0x9781, 0x6D74,
    0x8A43, 0x6D77,
    0x905A, 0x6D78,
    0x9FB3, 0x6D79,
    0x9FB8, 0x6D85,
    0x8FC1, 0x6D88,
    0x974F, 0x6D8C,
    0x9FB5, 0x6D8E,
    0x9FB0, 0x6D93,
    0x9FB6, 0x6D95,
    0x97DC, 0x6D99,
    0x9393, 0x6D9B,
    0x93C0, 0x6D9C,
    0x8A55, 0x6DAF,
    0x8974, 0x6DB2,
    0x9FBC, 0x6DB5,
    0x9FBF, 0x6DB8,
    0x97C1, 0x6DBC,
    0x9784, 0x6DC0,
    0x9FC6, 0x6DC5,
    0x9FC0, 0x6DC6,
    0x9FBD, 0x6DC7,
    0x97D2, 0x6DCB,
    0x9FC3, 0x6DCC,
    0x8F69, 0x6DD1,
    0x9FC5, 0x6DD2,
    0x9FCA, 0x6DD5,
    0x9391, 0x6DD8,
    0x9FC8, 0x6DD9,
    0x9FC2, 0x6DDE,
    0x9257, 0x6DE1,
    0x9FC9, 0x6DE4,
    0x9FBE, 0x6DE6,
    0x9FC4, 0x6DE8,
    0x9FCB, 0x6DEA,
    0x88FA, 0x6DEB,
    0x9FC1, 0x6DEC,
    0x9FCC, 0x6DEE,
    0x905B, 0x6DF1,
    0x8F7E, 0x6DF3,
    0x95A3, 0x6DF5,
    0x8DAC, 0x6DF7,
    0x9FB9, 0x6DF9,
    0x9FC7, 0x6DFA,
    0x9359, 0x6DFB,
    0x90B4, 0x6E05,
    0x8A89, 0x6E07,
    0x8DCF, 0x6E08,
    0x8FC2, 0x6E09,
    0x9FBB, 0x6E0A,
    0x8F61, 0x6E0B,
    0x8C6B, 0x6E13,
    0x9FBA, 0x6E15,
    0x9FD0, 0x6E19,
    0x8F8D, 0x6E1A,
    0x8CB8, 0x6E1B,
    0x9FDF, 0x6E1D,
    0x9FD9, 0x6E1F,
    0x8B94, 0x6E20,
    0x936E, 0x6E21,
    0x9FD4, 0x6E23,
    0x9FDD, 0x6E24,
    0x88AD, 0x6E25,
    0x8951, 0x6E26,
    0x89B7, 0x6E29,
    0x9FD6, 0x6E2B,
    0x91AA, 0x6E2C,
    0x9FCD, 0x6E2D,
    0x9FCF, 0x6E2E,
    0x8D60, 0x6E2F,
    0x9FE0, 0x6E38,
    0x9FDB, 0x6E3A,
    0x9FD3, 0x6E3E,
    0x9FDA, 0x6E43,
    0x96A9, 0x6E4A,
    0x9FD8, 0x6E4D,
    0x9FDC, 0x6E4E,
    0x8CCE, 0x6E56,
    0x8FC3, 0x6E58,
    0x9258, 0x6E5B,
    0x9FD2, 0x6E5F,
    0x974E, 0x6E67,
    0x9FD5, 0x6E6B,
    0x9FCE, 0x6E6E,
    0x9392, 0x6E6F,
    0x9FD1, 0x6E72,
    0x9FD7, 0x6E76,
    0x9870, 0x6E7E,
    0x8EBC, 0x6E7F,
    0x969E, 0x6E80,
    0x9FE1, 0x6E82,
    0x94AC, 0x6E8C,
    0x9FED, 0x6E8F,
    0x8CB9, 0x6E90,
    0x8F80, 0x6E96,
    0x9FE3, 0x6E98,
    0x97AD, 0x6E9C,
    0x8D61, 0x6E9D,
    0x9FF0, 0x6E9F,
    0x88EC, 0x6EA2,
    0x9FEE, 0x6EA5,
    0x9FE2, 0x6EAA,
    0x9FE8, 0x6EAF,
    0x9FEA, 0x6EB2,
    0x976E, 0x6EB6,
    0x9FE5, 0x6EB7,
    0x934D, 0x6EBA,
    0x9FE7, 0x6EBD,
    0x9FEF, 0x6EC2,
    0x9FE9, 0x6EC4,
    0x96C5, 0x6EC5,
    0x9FE4, 0x6EC9,
    0x8EA0, 0x6ECB,
    0x9FFC, 0x6ECC,
    0x8A8A, 0x6ED1,
    0x9FE6, 0x6ED3,
    0x9FEB, 0x6ED4,
    0x9FEC, 0x6ED5,
    0x91EA, 0x6EDD,
    0x91D8, 0x6EDE,
    0x9FF4, 0x6EEC,
    0x9FFA, 0x6EEF,
    0x9FF8, 0x6EF2,
    0x9348, 0x6EF4,
    0xE042, 0x6EF7,
    0x9FF5, 0x6EF8,
    0x9FF6, 0x6EFE,
    0x9FDE, 0x6EFF,
    0x8B99, 0x6F01,
    0x9559, 0x6F02,
    0x8EBD, 0x6F06,
    0x8D97, 0x6F09,
    0x9852, 0x6F0F,
    0x9FF2, 0x6F11,
    0xE041, 0x6F13,
    0x8989, 0x6F14,
    0x9186, 0x6F15,
    0x9499, 0x6F20,
    0x8ABF, 0x6F22,
    0x97F8, 0x6F23,
    0x969F, 0x6F2B,
    0x92D0, 0x6F2C,
    0x9FF9, 0x6F31,
    0x9FFB, 0x6F32,
    0x9151, 0x6F38,
    0xE040, 0x6F3E,
    0x9FF7, 0x6F3F,
    0x9FF1, 0x6F41,
    0x8AC1, 0x6F45,
    0x8C89, 0x6F54,
    0xE04E, 0x6F58,
    0xE049, 0x6F5B,
    0x90F6, 0x6F5C,
    0x8A83, 0x6F5F,
    0x8F81, 0x6F64,
    0xE052, 0x6F66,
    0xE04B, 0x6F6D,
    0x92AA, 0x6F6E,
    0xE048, 0x6F6F,
    0x92D7, 0x6F70,
    0xE06B, 0x6F74,
    0xE045, 0x6F78,
    0xE044, 0x6F7A,
    0xE04D, 0x6F7C,
    0xE047, 0x6F80,
    0xE046, 0x6F81,
    0xE04C, 0x6F82,
    0x909F, 0x6F84,
    0xE043, 0x6F86,
    0xE04F, 0x6F8E,
    0xE050, 0x6F91,
    0x8AC0, 0x6F97,
    0xE055, 0x6FA1,
    0xE054, 0x6FA3,
    0xE056, 0x6FA4,
    0xE059, 0x6FAA,
    0x9362, 0x6FB1,
    0xE053, 0x6FB3,
    0xE057, 0x6FB9,
    0x8C83, 0x6FC0,
    0x91F7, 0x6FC1,
    0xE051, 0x6FC2,
    0x945A, 0x6FC3,
    0xE058, 0x6FC6,
    0xE05D, 0x6FD4,
    0xE05B, 0x6FD5,
    0xE05E, 0x6FD8,
    0xE061, 0x6FDB,
    0xE05A, 0x6FDF,
    0x8D8A, 0x6FE0,
    0x9447, 0x6FE1,
    0x9FB7, 0x6FE4,
    0x9794, 0x6FEB,
    0xE05C, 0x6FEC,
    0xE060, 0x6FEE,
    0x91F3, 0x6FEF,
    0xE05F, 0x6FF1,
    0xE04A, 0x6FF3,
    0xE889, 0x6FF6,
    0xE064, 0x6FFA,
    0xE068, 0x6FFE,
    0xE066, 0x7001,
    0xE062, 0x7009,
    0xE063, 0x700B,
    0xE067, 0x700F,
    0xE065, 0x7011,
    0x956D, 0x7015,
    0xE06D, 0x7018,
    0xE06A, 0x701A,
    0xE069, 0x701B,
    0xE06C, 0x701D,
    0x93D2, 0x701E,
    0xE06E, 0x701F,
    0x9295, 0x7026,
    0x91EB, 0x7027,
    0x90A3, 0x702C,
    0xE06F, 0x7030,
    0xE071, 0x7032,
    0xE070, 0x703E,
    0x9FF3, 0x704C,
    0xE072, 0x7051,
    0x93E5, 0x7058,
    0xE073, 0x7063,
    0x89CE, 0x706B,
    0x9394, 0x706F,
    0x8A44, 0x7070,
    0x8B84, 0x7078,
    0x8EDC, 0x707C,
    0x8DD0, 0x707D,
    0x9846, 0x7089,
    0x9086, 0x708A,
    0x898A, 0x708E,
    0xE075, 0x7092,
    0xE074, 0x7099,
    0xE078, 0x70AC,
    0x9259, 0x70AD,
    0xE07B, 0x70AE,
    0xE076, 0x70AF,
    0xE07A, 0x70B3,
    0xE079, 0x70B8,
    0x935F, 0x70B9,
    0x88D7, 0x70BA,
    0x97F3, 0x70C8,
    0xE07D, 0x70CB,
    0x8947, 0x70CF,
    0xE080, 0x70D9,
    0xE07E, 0x70DD,
    0xE07C, 0x70DF,
    0xE077, 0x70F1,
    0x9642, 0x70F9,
    0xE082, 0x70FD,
    0xE081, 0x7109,
    0x898B, 0x7114,
    0xE084, 0x7119,
    0x95B0, 0x711A,
    0xE083, 0x711C,
    0x96B3, 0x7121,
    0x8FC5, 0x7126,
    0x9152, 0x7136,
    0x8FC4, 0x713C,
    0x97F9, 0x7149,
    0xE08A, 0x714C,
    0x90F7, 0x714E,
    0xE086, 0x7155,
    0xE08B, 0x7156,
    0x898C, 0x7159,
    0xE089, 0x7162,
    0x9481, 0x7164,
    0xE085, 0x7165,
    0xE088, 0x7166,
    0x8FC6, 0x7167,
    0x94CF, 0x7169,
    0xE08C, 0x716C,
    0x8ECF, 0x716E,
    0x90F8, 0x717D,
    0xE08F, 0x7184,
    0xE087, 0x7188,
    0x8C46, 0x718A,
    0xE08D, 0x718F,
    0x976F, 0x7194,
    0xE090, 0x7195,
    0xEAA4, 0x7199,
    0x8F6E, 0x719F,
    0xE091, 0x71A8,
    0xE092, 0x71AC,
    0x944D, 0x71B1,
    0xE094, 0x71B9,
    0xE095, 0x71BE,
    0x9452, 0x71C3,
    0x9395, 0x71C8,
    0xE097, 0x71C9,
    0xE099, 0x71CE,
    0x97D3, 0x71D0,
    0xE096, 0x71D2,
    0xE098, 0x71D4,
    0x898D, 0x71D5,
    0xE093, 0x71D7,
    0x9A7A, 0x71DF,
    0xE09A, 0x71E0,
    0x9187, 0x71E5,
    0x8E57, 0x71E6,
    0xE09C, 0x71E7,
    0xE09B, 0x71EC,
    0x9043, 0x71ED,
    0x99D7, 0x71EE,
    0xE09D, 0x71F5,
    0xE09F, 0x71F9,
    0xE08E, 0x71FB,
    0xE09E, 0x71FC,
    0xE0A0, 0x71FF,
    0x949A, 0x7206,
    0xE0A1, 0x720D,
    0xE0A2, 0x7210,
    0xE0A3, 0x721B,
    0xE0A4, 0x7228,
    0x92DC, 0x722A,
    0xE0A6, 0x722C,
    0xE0A5, 0x722D,
    0xE0A7, 0x7230,
    0xE0A8, 0x7232,
    0x8EDD, 0x7235,
    0x9583, 0x7236,
    0x96EA, 0x723A,
    0xE0A9, 0x723B,
    0xE0AA, 0x723C,
    0x9175, 0x723D,
    0x8EA2, 0x723E,
    0xE0AB, 0x723F,
    0xE0AC, 0x7240,
    0xE0AD, 0x7246,
    0x95D0, 0x7247,
    0x94C5, 0x7248,
    0xE0AE, 0x724B,
    0x9476, 0x724C,
    0x92AB, 0x7252,
    0xE0AF, 0x7258,
    0x89E5, 0x7259,
    0x8B8D, 0x725B,
    0x96C4, 0x725D,
    0x96B4, 0x725F,
    0x89B2, 0x7261,
    0x9853, 0x7262,
    0x9671, 0x7267,
    0x95A8, 0x7269,
    0x90B5, 0x7272,
    0xE0B0, 0x7274,
    0x93C1, 0x7279,
    0x8CA1, 0x727D,
    0xE0B1, 0x727E,
    0x8DD2, 0x7280,
    0xE0B3, 0x7281,
    0xE0B2, 0x7282,
    0xE0B4, 0x7287,
    0xE0B5, 0x7292,
    0xE0B6, 0x7296,
    0x8B5D, 0x72A0,
    0xE0B7, 0x72A2,
    0xE0B8, 0x72A7,
    0x8CA2, 0x72AC,
    0x94C6, 0x72AF,
    0xE0BA, 0x72B2,
    0x8FF3, 0x72B6,
    0xE0B9, 0x72B9,
    0x8BB6, 0x72C2,
    0xE0BB, 0x72C3,
    0xE0BD, 0x72C4,
    0xE0BC, 0x72C6,
    0xE0BE, 0x72CE,
    0x8CCF, 0x72D0,
    0xE0BF, 0x72D2,
    0x8BE7, 0x72D7,
    0x915F, 0x72D9,
    0x8D9D, 0x72DB,
    0xE0C1, 0x72E0,
    0xE0C2, 0x72E1,
    0xE0C0, 0x72E2,
    0x8EEB, 0x72E9,
    0x93C6, 0x72EC,
    0x8BB7, 0x72ED,
    0xE0C4, 0x72F7,
    0x924B, 0x72F8,
    0xE0C3, 0x72F9,
    0x9854, 0x72FC,
    0x9482, 0x72FD,
    0xE0C7, 0x730A,
    0xE0C9, 0x7316,
    0xE0C6, 0x7317,
    0x96D2, 0x731B,
    0xE0C8, 0x731C,
    0xE0CA, 0x731D,
    0x97C2, 0x731F,
    0xE0CE, 0x7325,
    0xE0CD, 0x7329,
    0x9296, 0x732A,
    0x944C, 0x732B,
    0x8CA3, 0x732E,
    0xE0CC, 0x732F,
    0xE0CB, 0x7334,
    0x9750, 0x7336,
    0x9751, 0x7337,
    0xE0CF, 0x733E,
    0x898E, 0x733F,
    0x8D96, 0x7344,
    0x8E82, 0x7345,
    0xE0D0, 0x734E,
    0xE0D1, 0x734F,
    0xE0D3, 0x7357,
    0x8F62, 0x7363,
    0xE0D5, 0x7368,
    0xE0D4, 0x736A,
    0xE0D6, 0x7370,
    0x8A6C, 0x7372,
    0xE0D8, 0x7375,
    0xE0D7, 0x7378,
    0xE0DA, 0x737A,
    0xE0D9, 0x737B,
    0x8CBA, 0x7384,
    0x97A6, 0x7387,
    0x8BCA, 0x7389,
    0x89A4, 0x738B,
    0x8BE8, 0x7396,
    0x8ADF, 0x73A9,
    0x97E6, 0x73B2,
    0xE0DC, 0x73B3,
    0xE0DE, 0x73BB,
    0xE0DF, 0x73C0,
    0x89CF, 0x73C2,
    0xE0DB, 0x73C8,
    0x8E58, 0x73CA,
    0x92BF, 0x73CD,
    0xE0DD, 0x73CE,
    0xE0E2, 0x73DE,
    0x8EEC, 0x73E0,
    0xE0E0, 0x73E5,
    0x8C5D, 0x73EA,
    0x94C7, 0x73ED,
    0xE0E1, 0x73EE,
    0xE0FC, 0x73F1,
    0xE0E7, 0x73F8,
    0x8CBB, 0x73FE,
    0x8B85, 0x7403,
    0xE0E4, 0x7405,
    0x979D, 0x7406,
    0x97AE, 0x7409,
    0x91F4, 0x7422,
    0xE0E6, 0x7425,
    0xE0E8, 0x7432,
    0x97D4, 0x7433,
    0x8BD5, 0x7434,
    0x94FA, 0x7435,
    0x9469, 0x7436,
    0xE0E9, 0x743A,
    0xE0EB, 0x743F,
    0xE0EE, 0x7441,
    0xE0EA, 0x7455,
    0xE0ED, 0x7459,
    0x8CE8, 0x745A,
    0x896C, 0x745B,
    0xE0EF, 0x745C,
    0x9090, 0x745E,
    0xE0EC, 0x745F,
    0x97DA, 0x7460,
    0xE0F2, 0x7463,
    0xEAA2, 0x7464,
    0xE0F0, 0x7469,
    0xE0F3, 0x746A,
    0xE0E5, 0x746F,
    0xE0F1, 0x7470,
    0x8DBA, 0x7473,
    0xE0F4, 0x7476,
    0xE0F5, 0x747E,
    0x979E, 0x7483,
    0xE0F6, 0x748B,
    0xE0F7, 0x749E,
    0xE0E3, 0x74A2,
    0xE0F8, 0x74A7,
    0x8AC2, 0x74B0,
    0x8EA3, 0x74BD,
    0xE0F9, 0x74CA,
    0xE0FA, 0x74CF,
    0xE0FB, 0x74D4,
    0x895A, 0x74DC,
    0xE140, 0x74E0,
    0x955A, 0x74E2,
    0xE141, 0x74E3,
    0x8AA2, 0x74E6,
    0xE142, 0x74E7,
    0xE143, 0x74E9,
    0xE144, 0x74EE,
    0xE146, 0x74F0,
    0xE147, 0x74F1,
    0xE145, 0x74F2,
    0x9572, 0x74F6,
    0xE149, 0x74F7,
    0xE148, 0x74F8,
    0xE14B, 0x7503,
    0xE14A, 0x7504,
    0xE14C, 0x7505,
    0xE14D, 0x750C,
    0xE14F, 0x750D,
    0xE14E, 0x750E,
    0x8D99, 0x7511,
    0xE151, 0x7513,
    0xE150, 0x7515,
    0x8AC3, 0x7518,
    0x9072, 0x751A,
    0x935B, 0x751C,
    0xE152, 0x751E,
    0x90B6, 0x751F,
    0x8E59, 0x7523,
    0x8999, 0x7525,
    0xE153, 0x7526,
    0x9770, 0x7528,
    0x95E1, 0x752B,
    0xE154, 0x752C,
    0x9363, 0x7530,
    0x9752, 0x7531,
    0x8D62, 0x7532,
    0x905C, 0x7533,
    0x926A, 0x7537,
    0x99B2, 0x7538,
    0x92AC, 0x753A,
    0x89E6, 0x753B,
    0xE155, 0x753C,
    0xE156, 0x7544,
    0xE15B, 0x7546,
    0xE159, 0x7549,
    0xE158, 0x754A,
    0x9DC0, 0x754B,
    0x8A45, 0x754C,
    0xE157, 0x754D,
    0x88D8, 0x754F,
    0x94A8, 0x7551,
    0x94C8, 0x7554,
    0x97AF, 0x7559,
    0xE15C, 0x755A,
    0xE15A, 0x755B,
    0x927B, 0x755C,
    0x90A4, 0x755D,
    0x94A9, 0x7560,
    0x954C, 0x7562,
    0xE15E, 0x7564,
    0x97AA, 0x7565,
    0x8C6C, 0x7566,
    0xE15F, 0x7567,
    0xE15D, 0x7569,
    0x94D4, 0x756A,
    0xE160, 0x756B,
    0xE161, 0x756D,
    0x88D9, 0x7570,
    0x8FF4, 0x7573,
    0xE166, 0x7574,
    0xE163, 0x7576,
    0x93EB, 0x7577,
    0xE162, 0x7578,
    0x8B45, 0x757F,
    0xE169, 0x7582,
    0xE164, 0x7586,
    0xE165, 0x7587,
    0xE168, 0x7589,
    0xE167, 0x758A,
    0x9544, 0x758B,
    0x9161, 0x758E,
    0x9160, 0x758F,
    0x8B5E, 0x7591,
    0xE16A, 0x7594,
    0xE16B, 0x759A,
    0xE16C, 0x759D,
    0xE16E, 0x75A3,
    0xE16D, 0x75A5,
    0x8975, 0x75AB,
    0xE176, 0x75B1,
    0x94E6, 0x75B2,
    0xE170, 0x75B3,
    0xE172, 0x75B5,
    0xE174, 0x75B8,
    0x905D, 0x75B9,
    0xE175, 0x75BC,
    0xE173, 0x75BD,
    0x8EBE, 0x75BE,
    0xE16F, 0x75C2,
    0xE171, 0x75C3,
    0x9561, 0x75C5,
    0x8FC7, 0x75C7,
    0xE178, 0x75CA,
    0xE177, 0x75CD,
    0xE179, 0x75D2,
    0x8EA4, 0x75D4,
    0x8DAD, 0x75D5,
    0x9397, 0x75D8,
    0xE17A, 0x75D9,
    0x92C9, 0x75DB,
    0xE17C, 0x75DE,
    0x979F, 0x75E2,
    0xE17B, 0x75E3,
    0x9189, 0x75E9,
    0xE182, 0x75F0,
    0xE184, 0x75F2,
    0xE185, 0x75F3,
    0x9273, 0x75F4,
    0xE183, 0x75FA,
    0xE180, 0x75FC,
    0xE17D, 0x75FE,
    0xE17E, 0x75FF,
    0xE181, 0x7601,
    0xE188, 0x7609,
    0xE186, 0x760B,
    0xE187, 0x760D,
    0xE189, 0x761F,
    0xE18B, 0x7620,
    0xE18C, 0x7621,
    0xE18D, 0x7622,
    0xE18E, 0x7624,
    0xE18A, 0x7627,
    0xE190, 0x7630,
    0xE18F, 0x7634,
    0xE191, 0x763B,
    0x97C3, 0x7642,
    0xE194, 0x7646,
    0xE192, 0x7647,
    0xE193, 0x7648,
    0x8AE0, 0x764C,
    0x96FC, 0x7652,
    0x95C8, 0x7656,
    0xE196, 0x7658,
    0xE195, 0x765C,
    0xE197, 0x7661,
    0xE198, 0x7662,
    0xE19C, 0x7667,
    0xE199, 0x7668,
    0xE19A, 0x7669,
    0xE19B, 0x766A,
    0xE19D, 0x766C,
    0xE19E, 0x7670,
    0xE19F, 0x7672,
    0xE1A0, 0x7676,
    0xE1A1, 0x7678,
    0x94AD, 0x767A,
    0x936F, 0x767B,
    0xE1A2, 0x767C,
    0x9492, 0x767D,
    0x9553, 0x767E,
    0xE1A3, 0x7680,
    0xE1A4, 0x7683,
    0x9349, 0x7684,
    0x8A46, 0x7686,
    0x8D63, 0x7687,
    0xE1A5, 0x7688,
    0xE1A6, 0x768B,
    0xE1A7, 0x768E,
    0x8E48, 0x7690,
    0xE1A9, 0x7693,
    0xE1A8, 0x7696,
    0xE1AA, 0x7699,
    0xE1AB, 0x769A,
    0x94E7, 0x76AE,
    0xE1AC, 0x76B0,
    0xE1AD, 0x76B4,
    0xEA89, 0x76B7,
    0xE1AE, 0x76B8,
    0xE1AF, 0x76B9,
    0xE1B0, 0x76BA,
    0x8E4D, 0x76BF,
    0xE1B1, 0x76C2,
    0x9475, 0x76C3,
    0x967E, 0x76C6,
    0x896D, 0x76C8,
    0x8976, 0x76CA,
    0xE1B2, 0x76CD,
    0xE1B4, 0x76D2,
    0xE1B3, 0x76D6,
    0x9390, 0x76D7,
    0x90B7, 0x76DB,
    0x9F58, 0x76DC,
    0xE1B5, 0x76DE,
    0x96BF, 0x76DF,
    0xE1B6, 0x76E1,
    0x8AC4, 0x76E3,
    0x94D5, 0x76E4,
    0xE1B7, 0x76E5,
    0xE1B8, 0x76E7,
    0xE1B9, 0x76EA,
    0x96DA, 0x76EE,
    0x96D3, 0x76F2,
    0x92BC, 0x76F4,
    0x918A, 0x76F8,
    0xE1BB, 0x76FB,
    0x8F82, 0x76FE,
    0x8FC8, 0x7701,
    0xE1BE, 0x7704,
    0xE1BD, 0x7707,
    0xE1BC, 0x7708,
    0x94FB, 0x7709,
    0x8AC5, 0x770B,
    0x8CA7, 0x770C,
    0xE1C4, 0x771B,
    0xE1C1, 0x771E,
    0x905E, 0x771F,
    0x96B0, 0x7720,
    0xE1C0, 0x7724,
    0xE1C2, 0x7725,
    0xE1C3, 0x7726,
    0xE1BF, 0x7729,
    0xE1C5, 0x7737,
    0xE1C6, 0x7738,
    0x92AD, 0x773A,
    0x8AE1, 0x773C,
    0x9285, 0x7740,
    0xE1C7, 0x7747,
    0xE1C8, 0x775A,
    0xE1CB, 0x775B,
    0x9087, 0x7761,
    0x93C2, 0x7763,
    0xE1CC, 0x7765,
    0x9672, 0x7766,
    0xE1C9, 0x7768,
    0xE1CA, 0x776B,
    0xE1CF, 0x7779,
    0xE1CE, 0x777E,
    0xE1CD, 0x777F,
    0xE1D1, 0x778B,
    0xE1D0, 0x778E,
    0xE1D2, 0x7791,
    0xE1D4, 0x779E,
    0xE1D3, 0x77A0,
    0x95CB, 0x77A5,
    0x8F75, 0x77AC,
    0x97C4, 0x77AD,
    0xE1D5, 0x77B0,
    0x93B5, 0x77B3,
    0xE1D6, 0x77B6,
    0xE1D7, 0x77B9,
    0xE1DB, 0x77BB,
    0xE1D9, 0x77BC,
    0xE1DA, 0x77BD,
    0xE1D8, 0x77BF,
    0xE1DC, 0x77C7,
    0xE1DD, 0x77CD,
    0xE1DE, 0x77D7,
    0xE1DF, 0x77DA,
    0x96B5, 0x77DB,
    0xE1E0, 0x77DC,
    0x96EE, 0x77E2,
    0xE1E1, 0x77E3,
    0x926D, 0x77E5,
    0x948A, 0x77E7,
    0x8BE9, 0x77E9,
    0x925A, 0x77ED,
    0xE1E2, 0x77EE,
    0x8BB8, 0x77EF,
    0x90CE, 0x77F3,
    0xE1E3, 0x77FC,
    0x8DBB, 0x7802,
    0xE1E4, 0x780C,
    0xE1E5, 0x7812,
    0x8CA4, 0x7814,
    0x8DD3, 0x7815,
    0xE1E7, 0x7820,
    0x9375, 0x7825,
    0x8DD4, 0x7826,
    0x8B6D, 0x7827,
    0x9643, 0x7832,
    0x946A, 0x7834,
    0x9376, 0x783A,
    0x8D7B, 0x783F,
    0xE1E9, 0x7845,
    0x8FC9, 0x785D,
    0x97B0, 0x786B,
    0x8D64, 0x786C,
    0x8CA5, 0x786F,
    0x94A1, 0x7872,
    0xE1EB, 0x7874,
    0xE1ED, 0x787C,
    0x8CE9, 0x7881,
    0xE1EC, 0x7886,
    0x92F4, 0x7887,
    0xE1EF, 0x788C,
    0x8A56, 0x788D,
    0xE1EA, 0x788E,
    0x94E8, 0x7891,
    0x894F, 0x7893,
    0x8DEA, 0x7895,
    0x9871, 0x7897,
    0xE1EE, 0x789A,
    0xE1F0, 0x78A3,
    0x95C9, 0x78A7,
    0x90D7, 0x78A9,
    0xE1F2, 0x78AA,
    0xE1F3, 0x78AF,
    0xE1F1, 0x78B5,
    0x8A6D, 0x78BA,
    0xE1F9, 0x78BC,
    0xE1F8, 0x78BE,
    0x8EA5, 0x78C1,
    0xE1FA, 0x78C5,
    0xE1F5, 0x78C6,
    0xE1FB, 0x78CA,
    0xE1F6, 0x78CB,
    0x94D6, 0x78D0,
    0xE1F4, 0x78D1,
    0xE1F7, 0x78D4,
    0xE241, 0x78DA,
    0xE240, 0x78E7,
    0x9681, 0x78E8,
    0xE1FC, 0x78EC,
    0x88E9, 0x78EF,
    0xE243, 0x78F4,
    0xE242, 0x78FD,
    0x8FCA, 0x7901,
    0xE244, 0x7907,
    0x9162, 0x790E,
    0xE246, 0x7911,
    0xE245, 0x7912,
    0xE247, 0x7919,
    0xE1E6, 0x7926,
    0xE1E8, 0x792A,
    0xE249, 0x792B,
    0xE248, 0x792C,
    0x8EA6, 0x793A,
    0x97E7, 0x793C,
    0x8ED0, 0x793E,
    0xE24A, 0x7940,
    0x8C56, 0x7941,
    0x8B5F, 0x7947,
    0x8B46, 0x7948,
    0x8E83, 0x7949,
    0x9753, 0x7950,
    0xE250, 0x7953,
    0xE24F, 0x7955,
    0x9163, 0x7956,
    0xE24C, 0x7957,
    0xE24E, 0x795A,
    0x8F6A, 0x795D,
    0x905F, 0x795E,
    0xE24D, 0x795F,
    0xE24B, 0x7960,
    0x9449, 0x7962,
    0x8FCB, 0x7965,
    0x955B, 0x7968,
    0x8DD5, 0x796D,
    0x9398, 0x7977,
    0xE251, 0x797A,
    0xE252, 0x797F,
    0xE268, 0x7980,
    0x8BD6, 0x7981,
    0x985C, 0x7984,
    0x9154, 0x7985,
    0xE253, 0x798A,
    0x89D0, 0x798D,
    0x92F5, 0x798E,
    0x959F, 0x798F,
    0xE254, 0x799D,
    0x8B9A, 0x79A6,
    0xE255, 0x79A7,
    0xE257, 0x79AA,
    0xE258, 0x79AE,
    0x9448, 0x79B0,
    0xE259, 0x79B3,
    0xE25A, 0x79B9,
    0xE25B, 0x79BA,
    0x8BD7, 0x79BD,
    0x89D1, 0x79BE,
    0x93C3, 0x79BF,
    0x8F47, 0x79C0,
    0x8E84, 0x79C1,
    0xE25C, 0x79C9,
    0x8F48, 0x79CB,
    0x89C8, 0x79D1,
    0x9562, 0x79D2,
    0xE25D, 0x79D5,
    0x94E9, 0x79D8,
    0x9164, 0x79DF,
    0xE260, 0x79E1,
    0xE261, 0x79E3,
    0x9489, 0x79E4,
    0x9060, 0x79E6,
    0xE25E, 0x79E7,
    0x9281, 0x79E9,
    0xE25F, 0x79EC,
    0x8FCC, 0x79F0,
    0x88DA, 0x79FB,
    0x8B48, 0x7A00,
    0xE262, 0x7A08,
    0x92F6, 0x7A0B,
    0xE263, 0x7A0D,
    0x90C5, 0x7A0E,
    0x96AB, 0x7A14,
    0x9542, 0x7A17,
    0xE264, 0x7A18,
    0xE265, 0x7A19,
    0x9274, 0x7A1A,
    0x97C5, 0x7A1C,
    0xE267, 0x7A1F,
    0xE266, 0x7A20,
    0x8EED, 0x7A2E,
    0xE269, 0x7A31,
    0x88EE, 0x7A32,
    0xE26C, 0x7A37,
    0xE26A, 0x7A3B,
    0x89D2, 0x7A3C,
    0x8C6D, 0x7A3D,
    0xE26B, 0x7A3E,
    0x8D65, 0x7A3F,
    0x8D92, 0x7A40,
    0x95E4, 0x7A42,
    0xE26D, 0x7A43,
    0x9673, 0x7A46,
    0xE26F, 0x7A49,
    0x90CF, 0x7A4D,
    0x896E, 0x7A4E,
    0x89B8, 0x7A4F,
    0x88AA, 0x7A50,
    0xE26E, 0x7A57,
    0xE270, 0x7A61,
    0xE271, 0x7A62,
    0x8FF5, 0x7A63,
    0xE272, 0x7A69,
    0x8A6E, 0x7A6B,
    0xE274, 0x7A70,
    0x8C8A, 0x7A74,
    0x8B86, 0x7A76,
    0xE275, 0x7A79,
    0x8BF3, 0x7A7A,
    0xE276, 0x7A7D,
    0x90FA, 0x7A7F,
    0x93CB, 0x7A81,
    0x90DE, 0x7A83,
    0x8DF3, 0x7A84,
    0xE277, 0x7A88,
    0x9282, 0x7A92,
    0x918B, 0x7A93,
    0xE279, 0x7A95,
    0xE27B, 0x7A96,
    0xE278, 0x7A97,
    0xE27A, 0x7A98,
    0x8C41, 0x7A9F,
    0xE27C, 0x7AA9,
    0x8C45, 0x7AAA,
    0x8B87, 0x7AAE,
    0x9771, 0x7AAF,
    0xE27E, 0x7AB0,
    0xE280, 0x7AB6,
    0x894D, 0x7ABA,
    0xE283, 0x7ABF,
    0x8A96, 0x7AC3,
    0xE282, 0x7AC4,
    0xE281, 0x7AC5,
    0xE285, 0x7AC7,
    0xE27D, 0x7AC8,
    0xE286, 0x7ACA,
    0x97A7, 0x7ACB,
    0xE287, 0x7ACD,
    0xE288, 0x7ACF,
    0x9AF2, 0x7AD2,
    0xE28A, 0x7AD3,
    0xE289, 0x7AD5,
    0xE28B, 0x7AD9,
    0xE28C, 0x7ADA,
    0x97B3, 0x7ADC,
    0xE28D, 0x7ADD,
    0xE8ED, 0x7ADF,
    0x8FCD, 0x7AE0,
    0xE28E, 0x7AE1,
    0xE28F, 0x7AE2,
    0x8F76, 0x7AE3,
    0x93B6, 0x7AE5,
    0xE290, 0x7AE6,
    0x9247, 0x7AEA,
    0xE291, 0x7AED,
    0x925B, 0x7AEF,
    0xE292, 0x7AF0,
    0x8BA3, 0x7AF6,
    0x995E, 0x7AF8,
    0x927C, 0x7AF9,
    0x8EB1, 0x7AFA,
    0x8AC6, 0x7AFF,
    0xE293, 0x7B02,
    0xE2A0, 0x7B04,
    0xE296, 0x7B06,
    0x8B88, 0x7B08,
    0xE295, 0x7B0A,
    0xE2A2, 0x7B0B,
    0xE294, 0x7B0F,
    0x8FCE, 0x7B11,
    0xE298, 0x7B18,
    0xE299, 0x7B19,
    0x934A, 0x7B1B,
    0xE29A, 0x7B1E,
    0x8A7D, 0x7B20,
    0x9079, 0x7B25,
    0x9584, 0x7B26,
    0xE29C, 0x7B28,
    0x91E6, 0x7B2C,
    0xE297, 0x7B33,
    0xE29B, 0x7B35,
    0xE29D, 0x7B36,
    0x8DF9, 0x7B39,
    0xE2A4, 0x7B45,
    0x954D, 0x7B46,
    0x94A4, 0x7B48,
    0x9399, 0x7B49,
    0x8BD8, 0x7B4B,
    0xE2A3, 0x7B4C,
    0xE2A1, 0x7B4D,
    0x94B3, 0x7B4F,
    0xE29E, 0x7B50,
    0x927D, 0x7B51,
    0x939B, 0x7B52,
    0x939A, 0x7B54,
    0x8DF4, 0x7B56,
    0xE2B6, 0x7B5D,
    0xE2A6, 0x7B65,
    0xE2A8, 0x7B67,
    0xE2AB, 0x7B6C,
    0xE2AC, 0x7B6E,
    0xE2A9, 0x7B70,
    0xE2AA, 0x7B71,
    0xE2A7, 0x7B74,
    0xE2A5, 0x7B75,
    0xE29F, 0x7B7A,
    0x95CD, 0x7B86,
    0x89D3, 0x7B87,
    0xE2B3, 0x7B8B,
    0xE2B0, 0x7B8D,
    0xE2B5, 0x7B8F,
    0xE2B4, 0x7B92,
    0x9493, 0x7B94,
    0x96A5, 0x7B95,
    0x8E5A, 0x7B97,
    0xE2AE, 0x7B98,
    0xE2B7, 0x7B99,
    0xE2B2, 0x7B9A,
    0xE2B1, 0x7B9C,
    0xE2AD, 0x7B9D,
    0xE2AF, 0x7B9F,
    0x8AC7, 0x7BA1,
    0x925C, 0x7BAA,
    0x90FB, 0x7BAD,
    0x94A0, 0x7BB1,
    0xE2BC, 0x7BB4,
    0x94A2, 0x7BB8,
    0x90DF, 0x7BC0,
    0xE2B9, 0x7BC1,
    0x94CD, 0x7BC4,
    0xE2BD, 0x7BC6,
    0x95D1, 0x7BC7,
    0x927A, 0x7BC9,
    0xE2B8, 0x7BCB,
    0xE2BA, 0x7BCC,
    0xE2BB, 0x7BCF,
    0xE2BE, 0x7BDD,
    0x8EC2, 0x7BE0,
    0x93C4, 0x7BE4,
    0xE2C3, 0x7BE5,
    0xE2C2, 0x7BE6,
    0xE2BF, 0x7BE9,
    0x9855, 0x7BED,
    0xE2C8, 0x7BF3,
    0xE2CC, 0x7BF6,
    0xE2C9, 0x7BF7,
    0xE2C5, 0x7C00,
    0xE2C6, 0x7C07,
    0xE2CB, 0x7C0D,
    0xE2C0, 0x7C11,
    0x99D3, 0x7C12,
    0xE2C7, 0x7C13,
    0xE2C1, 0x7C14,
    0xE2CA, 0x7C17,
    0xE2D0, 0x7C1F,
    0x8AC8, 0x7C21,
    0xE2CD, 0x7C23,
    0xE2CE, 0x7C27,
    0xE2CF, 0x7C2A,
    0xE2D2, 0x7C2B,
    0xE2D1, 0x7C37,
    0x94F4, 0x7C38,
    0xE2D3, 0x7C3D,
    0x97FA, 0x7C3E,
    0x95EB, 0x7C3F,
    0xE2D8, 0x7C40,
    0xE2D5, 0x7C43,
    0xE2D4, 0x7C4C,
    0x90D0, 0x7C4D,
    0xE2D7, 0x7C4F,
    0xE2D9, 0x7C50,
    0xE2D6, 0x7C54,
    0xE2DD, 0x7C56,
    0xE2DA, 0x7C58,
    0xE2DB, 0x7C5F,
    0xE2C4, 0x7C60,
    0xE2DC, 0x7C64,
    0xE2DE, 0x7C65,
    0xE2DF, 0x7C6C,
    0x95C4, 0x7C73,
    0xE2E0, 0x7C75,
    0x96E0, 0x7C7E,
    0x8BCC, 0x7C81,
    0x8C48, 0x7C82,
    0xE2E1, 0x7C83,
    0x95B2, 0x7C89,
    0x9088, 0x7C8B,
    0x96AE, 0x7C8D,
    0xE2E2, 0x7C90,
    0x97B1, 0x7C92,
    0x9494, 0x7C95,
    0x9165, 0x7C97,
    0x9453, 0x7C98,
    0x8F6C, 0x7C9B,
    0x88BE, 0x7C9F,
    0xE2E7, 0x7CA1,
    0xE2E5, 0x7CA2,
    0xE2E3, 0x7CA4,
    0x8A9F, 0x7CA5,
    0x8FCF, 0x7CA7,
    0xE2E8, 0x7CA8,
    0xE2E6, 0x7CAB,
    0xE2E4, 0x7CAD,
    0xE2EC, 0x7CAE,
    0xE2EB, 0x7CB1,
    0xE2EA, 0x7CB2,
    0xE2E9, 0x7CB3,
    0xE2ED, 0x7CB9,
    0xE2EE, 0x7CBD,
    0x90B8, 0x7CBE,
    0xE2EF, 0x7CC0,
    0xE2F1, 0x7CC2,
    0xE2F0, 0x7CC5,
    0x8CD0, 0x7CCA,
    0x9157, 0x7CCE,
    0xE2F3, 0x7CD2,
    0x939C, 0x7CD6,
    0xE2F2, 0x7CD8,
    0xE2F4, 0x7CDC,
    0x95B3, 0x7CDE,
    0x918C, 0x7CDF,
    0x8D66, 0x7CE0,
    0xE2F5, 0x7CE2,
    0x97C6, 0x7CE7,
    0xE2F7, 0x7CEF,
    0xE2F8, 0x7CF2,
    0xE2F9, 0x7CF4,
    0xE2FA, 0x7CF6,
    0x8E85, 0x7CF8,
    0xE2FB, 0x7CFA,
    0x8C6E, 0x7CFB,
    0x8B8A, 0x7CFE,
    0x8B49, 0x7D00,
    0xE340, 0x7D02,
    0x96F1, 0x7D04,
    0x8D67, 0x7D05,
    0xE2FC, 0x7D06,
    0xE343, 0x7D0A,
    0x96E4, 0x7D0B,
    0x945B, 0x7D0D,
    0x9552, 0x7D10,
    0x8F83, 0x7D14,
    0xE342, 0x7D15,
    0x8ED1, 0x7D17,
    0x8D68, 0x7D18,
    0x8E86, 0x7D19,
    0x8B89, 0x7D1A,
    0x95B4, 0x7D1B,
    0xE341, 0x7D1C,
    0x9166, 0x7D20,
    0x9661, 0x7D21,
    0x8DF5, 0x7D22,
    0x8E87, 0x7D2B,
    0x92DB, 0x7D2C,
    0xE346, 0x7D2E,
    0x97DD, 0x7D2F,
    0x8DD7, 0x7D30,
    0xE347, 0x7D32,
    0x9061, 0x7D33,
    0xE349, 0x7D35,
    0x8FD0, 0x7D39,
    0x8DAE, 0x7D3A,
    0xE348, 0x7D3F,
    0x8F49, 0x7D42,
    0x8CBC, 0x7D43,
    0x9167, 0x7D44,
    0xE344, 0x7D45,
    0xE34A, 0x7D46,
    0xE345, 0x7D4B,
    0x8C6F, 0x7D4C,
    0xE34D, 0x7D4E,
    0xE351, 0x7D4F,
    0x8C8B, 0x7D50,
    0xE34C, 0x7D56,
    0xE355, 0x7D5B,
    0x8D69, 0x7D5E,
    0x978D, 0x7D61,
    0x88BA, 0x7D62,
    0xE352, 0x7D63,
    0x8B8B, 0x7D66,
    0xE34F, 0x7D68,
    0xE350, 0x7D6E,
    0x939D, 0x7D71,
    0xE34E, 0x7D72,
    0xE34B, 0x7D73,
    0x8A47, 0x7D75,
    0x90E2, 0x7D76,
    0x8CA6, 0x7D79,
    0xE357, 0x7D7D,
    0xE354, 0x7D89,
    0xE356, 0x7D8F,
    0xE353, 0x7D93,
    0x8C70, 0x7D99,
    0x91B1, 0x7D9A,
    0xE358, 0x7D9B,
    0x918E, 0x7D9C,
    0xE365, 0x7D9F,
    0xE361, 0x7DA2,
    0xE35B, 0x7DA3,
    0xE35F, 0x7DAB,
    0x8EF8, 0x7DAC,
    0x88DB, 0x7DAD,
    0xE35A, 0x7DAE,
    0xE362, 0x7DAF,
    0xE366, 0x7DB0,
    0x8D6A, 0x7DB1,
    0x96D4, 0x7DB2,
    0x92D4, 0x7DB4,
    0xE35C, 0x7DB5,
    0xE364, 0x7DB8,
    0xE359, 0x7DBA,
    0x925D, 0x7DBB,
    0xE35E, 0x7DBD,
    0x88BB, 0x7DBE,
    0x96C8, 0x7DBF,
    0xE35D, 0x7DC7,
    0x8BD9, 0x7DCA,
    0x94EA, 0x7DCB,
    0x918D, 0x7DCF,
    0x97CE, 0x7DD1,
    0x8F8F, 0x7DD2,
    0xE38E, 0x7DD5,
    0xE367, 0x7DD8,
    0x90FC, 0x7DDA,
    0xE363, 0x7DDC,
    0xE368, 0x7DDD,
    0xE36A, 0x7DDE,
    0x92F7, 0x7DE0,
    0xE36D, 0x7DE1,
    0xE369, 0x7DE4,
    0x95D2, 0x7DE8,
    0x8AC9, 0x7DE9,
    0x96C9, 0x7DEC,
    0x88DC, 0x7DEF,
    0xE36C, 0x7DF2,
    0x97FB, 0x7DF4,
    0xE36B, 0x7DFB,
    0x898F, 0x7E01,
    0x93EA, 0x7E04,
    0xE36E, 0x7E05,
    0xE375, 0x7E09,
    0xE36F, 0x7E0A,
    0xE376, 0x7E0B,
    0xE372, 0x7E12,
    0x949B, 0x7E1B,
    0x8EC8, 0x7E1E,
    0xE374, 0x7E1F,
    0xE371, 0x7E21,
    0xE377, 0x7E22,
    0xE370, 0x7E23,
    0x8F63, 0x7E26,
    0x9644, 0x7E2B,
    0x8F6B, 0x7E2E,
    0xE373, 0x7E31,
    0xE380, 0x7E32,
    0xE37B, 0x7E35,
    0xE37E, 0x7E37,
    0xE37C, 0x7E39,
    0xE381, 0x7E3A,
    0xE37A, 0x7E3B,
    0xE360, 0x7E3D,
    0x90D1, 0x7E3E,
    0x94C9, 0x7E41,
    0xE37D, 0x7E43,
    0xE378, 0x7E46,
    0x9140, 0x7E4A,
    0x8C71, 0x7E4B,
    0x8F4A, 0x7E4D,
    0x9044, 0x7E54,
    0x9155, 0x7E55,
    0xE384, 0x7E56,
    0xE386, 0x7E59,
    0xE387, 0x7E5A,
    0xE383, 0x7E5D,
    0xE385, 0x7E5E,
    0xE379, 0x7E66,
    0xE382, 0x7E67,
    0xE38A, 0x7E69,
    0xE389, 0x7E6A,
    0x969A, 0x7E6D,
    0x8C4A, 0x7E70,
    0xE388, 0x7E79,
    0xE38C, 0x7E7B,
    0xE38B, 0x7E7C,
    0xE38F, 0x7E7D,
    0xE391, 0x7E7F,
    0x8E5B, 0x7E82,
    0xE38D, 0x7E83,
    0xE392, 0x7E88,
    0xE393, 0x7E89,
    0xE394, 0x7E8C,
    0xE39A, 0x7E8E,
    0x935A, 0x7E8F,
    0xE396, 0x7E90,
    0xE395, 0x7E92,
    0xE397, 0x7E93,
    0xE398, 0x7E94,
    0xE399, 0x7E96,
    0xE39B, 0x7E9B,
    0xE39C, 0x7E9C,
    0x8ACA, 0x7F36,
    0xE39D, 0x7F38,
    0xE39E, 0x7F3A,
    0xE39F, 0x7F45,
    0xE3A0, 0x7F4C,
    0xE3A1, 0x7F4D,
    0xE3A2, 0x7F4E,
    0xE3A3, 0x7F50,
    0xE3A4, 0x7F51,
    0xE3A6, 0x7F54,
    0xE3A5, 0x7F55,
    0xE3A7, 0x7F58,
    0xE3A8, 0x7F5F,
    0xE3A9, 0x7F60,
    0xE3AC, 0x7F67,
    0xE3AA, 0x7F68,
    0xE3AB, 0x7F69,
    0x8DDF, 0x7F6A,
    0x8C72, 0x7F6B,
    0x9275, 0x7F6E,
    0x94B1, 0x7F70,
    0x8F90, 0x7F72,
    0x946C, 0x7F75,
    0x94EB, 0x7F77,
    0xE3AD, 0x7F78,
    0x9CEB, 0x7F79,
    0xE3AE, 0x7F82,
    0xE3B0, 0x7F83,
    0x9785, 0x7F85,
    0xE3AF, 0x7F86,
    0xE3B2, 0x7F87,
    0xE3B1, 0x7F88,
    0x9772, 0x7F8A,
    0xE3B3, 0x7F8C,
    0x94FC, 0x7F8E,
    0xE3B4, 0x7F94,
    0xE3B7, 0x7F9A,
    0xE3B6, 0x7F9D,
    0xE3B5, 0x7F9E,
    0xE3B8, 0x7FA3,
    0x8C51, 0x7FA4,
    0x9141, 0x7FA8,
    0x8B60, 0x7FA9,
    0xE3BC, 0x7FAE,
    0xE3B9, 0x7FAF,
    0xE3BA, 0x7FB2,
    0xE3BD, 0x7FB6,
    0xE3BE, 0x7FB8,
    0xE3BB, 0x7FB9,
    0x8948, 0x7FBD,
    0x89A5, 0x7FC1,
    0xE3C0, 0x7FC5,
    0xE3C1, 0x7FC6,
    0xE3C2, 0x7FCA,
    0x9782, 0x7FCC,
    0x8F4B, 0x7FD2,
    0xE3C4, 0x7FD4,
    0xE3C3, 0x7FD5,
    0x9089, 0x7FE0,
    0xE3C5, 0x7FE1,
    0xE3C6, 0x7FE6,
    0xE3C7, 0x7FE9,
    0x8AE3, 0x7FEB,
    0x8ACB, 0x7FF0,
    0xE3C8, 0x7FF3,
    0xE3C9, 0x7FF9,
    0x967C, 0x7FFB,
    0x9783, 0x7FFC,
    0x9773, 0x8000,
    0x9856, 0x8001,
    0x8D6C, 0x8003,
    0xE3CC, 0x8004,
    0x8ED2, 0x8005,
    0xE3CB, 0x8006,
    0xE3CD, 0x800B,
    0x8EA7, 0x800C,
    0x91CF, 0x8010,
    0xE3CE, 0x8012,
    0x8D6B, 0x8015,
    0x96D5, 0x8017,
    0xE3CF, 0x8018,
    0xE3D0, 0x8019,
    0xE3D1, 0x801C,
    0xE3D2, 0x8021,
    0xE3D3, 0x8028,
    0x8EA8, 0x8033,
    0x96EB, 0x8036,
    0xE3D5, 0x803B,
    0x925E, 0x803D,
    0xE3D4, 0x803F,
    0xE3D7, 0x8046,
    0xE3D6, 0x804A,
    0xE3D8, 0x8052,
    0x90B9, 0x8056,
    0xE3D9, 0x8058,
    0xE3DA, 0x805A,
    0x95B7, 0x805E,
    0xE3DB, 0x805F,
    0x918F, 0x8061,
    0xE3DC, 0x8062,
    0xE3DD, 0x8068,
    0x97FC, 0x806F,
    0xE3E0, 0x8070,
    0xE3DF, 0x8072,
    0xE3DE, 0x8073,
    0x92AE, 0x8074,
    0xE3E1, 0x8076,
    0x9045, 0x8077,
    0xE3E2, 0x8079,
    0xE3E3, 0x807D,
    0x9857, 0x807E,
    0xE3E4, 0x807F,
    0xE3E5, 0x8084,
    0xE3E7, 0x8085,
    0xE3E6, 0x8086,
    0x94A3, 0x8087,
    0x93F7, 0x8089,
    0x985D, 0x808B,
    0x94A7, 0x808C,
    0xE3E9, 0x8093,
    0x8FD1, 0x8096,
    0x9549, 0x8098,
    0xE3EA, 0x809A,
    0xE3E8, 0x809B,
    0x8ACC, 0x809D,
    0x8CD2, 0x80A1,
    0x8E88, 0x80A2,
    0x94EC, 0x80A5,
    0x8CA8, 0x80A9,
    0x9662, 0x80AA,
    0xE3ED, 0x80AC,
    0xE3EB, 0x80AD,
    0x8D6D, 0x80AF,
    0x8D6E, 0x80B1,
    0x88E7, 0x80B2,
    0x8DE6, 0x80B4,
    0x9478, 0x80BA,
    0x88DD, 0x80C3,
    0xE3F2, 0x80C4,
    0x925F, 0x80C6,
    0x9477, 0x80CC,
    0x91D9, 0x80CE,
    0xE3F4, 0x80D6,
    0xE3F0, 0x80D9,
    0xE3F3, 0x80DA,
    0xE3EE, 0x80DB,
    0xE3F1, 0x80DD,
    0x9645, 0x80DE,
    0x8CD3, 0x80E1,
    0x88FB, 0x80E4,
    0xE3EF, 0x80E5,
    0xE3F6, 0x80EF,
    0xE3F7, 0x80F1,
    0x93B7, 0x80F4,
    0x8BB9, 0x80F8,
    0xE445, 0x80FC,
    0x945C, 0x80FD,
    0x8E89, 0x8102,
    0x8BBA, 0x8105,
    0x90C6, 0x8106,
    0x9865, 0x8107,
    0x96AC, 0x8108,
    0xE3F5, 0x8109,
    0x90D2, 0x810A,
    0x8B72, 0x811A,
    0xE3F8, 0x811B,
    0xE3FA, 0x8123,
    0xE3F9, 0x8129,
    0xE3FB, 0x812F,
    0x9245, 0x8131,
    0x945D, 0x8133,
    0x92AF, 0x8139,
    0xE442, 0x813E,
    0xE441, 0x8146,
    0xE3FC, 0x814B,
    0x9074, 0x814E,
    0x9585, 0x8150,
    0xE444, 0x8151,
    0xE443, 0x8153,
    0x8D6F, 0x8154,
    0x9872, 0x8155,
    0xE454, 0x815F,
    0xE448, 0x8165,
    0xE449, 0x8166,
    0x8EEE, 0x816B,
    0xE447, 0x816E,
    0x8D98, 0x8170,
    0xE446, 0x8171,
    0xE44A, 0x8174,
    0x92B0, 0x8178,
    0x95A0, 0x8179,
    0x9142, 0x817A,
    0x91DA, 0x817F,
    0xE44E, 0x8180,
    0xE44F, 0x8182,
    0xE44B, 0x8183,
    0xE44C, 0x8188,
    0xE44D, 0x818A,
    0x8D70, 0x818F,
    0xE455, 0x8193,
    0xE451, 0x8195,
    0x9586, 0x819A,
    0x968C, 0x819C,
    0x9547, 0x819D,
    0xE450, 0x81A0,
    0xE453, 0x81A3,
    0xE452, 0x81A4,
    0x9663, 0x81A8,
    0xE456, 0x81A9,
    0xE457, 0x81B0,
    0x9156, 0x81B3,
    0xE458, 0x81B5,
    0xE45A, 0x81B8,
    0xE45E, 0x81BA,
    0xE45B, 0x81BD,
    0xE459, 0x81BE,
    0x945E, 0x81BF,
    0xE45C, 0x81C0,
    0xE45D, 0x81C2,
    0x89B0, 0x81C6,
    0xE464, 0x81C8,
    0xE45F, 0x81C9,
    0xE460, 0x81CD,
    0xE461, 0x81D1,
    0x919F, 0x81D3,
    0xE463, 0x81D8,
    0xE462, 0x81D9,
    0xE465, 0x81DA,
    0xE466, 0x81DF,
    0xE467, 0x81E0,
    0x9062, 0x81E3,
    0x89E7, 0x81E5,
    0xE468, 0x81E7,
    0x97D5, 0x81E8,
    0x8EA9, 0x81EA,
    0x8F4C, 0x81ED,
    0x8E8A, 0x81F3,
    0x9276, 0x81F4,
    0xE469, 0x81FA,
    0xE46A, 0x81FB,
    0x8950, 0x81FC,
    0xE46B, 0x81FE,
    0xE46C, 0x8201,
    0xE46D, 0x8202,
    0xE46E, 0x8205,
    0xE46F, 0x8207,
    0x8BBB, 0x8208,
    0x9DA8, 0x8209,
    0xE470, 0x820A,
    0x90E3, 0x820C,
    0xE471, 0x820D,
    0x8EC9, 0x820E,
    0xE472, 0x8210,
    0x98AE, 0x8212,
    0xE473, 0x8216,
    0x95DC, 0x8217,
    0x8ADA, 0x8218,
    0x9143, 0x821B,
    0x8F77, 0x821C,
    0x9591, 0x821E,
    0x8F4D, 0x821F,
    0xE474, 0x8229,
    0x8D71, 0x822A,
    0xE475, 0x822B,
    0x94CA, 0x822C,
    0xE484, 0x822E,
    0xE477, 0x8233,
    0x91C7, 0x8235,
    0x9495, 0x8236,
    0x8CBD, 0x8237,
    0xE476, 0x8238,
    0x9144, 0x8239,
    0xE478, 0x8240,
    0x92F8, 0x8247,
    0xE47A, 0x8258,
    0xE479, 0x8259,
    0xE47C, 0x825A,
    0xE47B, 0x825D,
    0xE47D, 0x825F,
    0xE480, 0x8262,
    0xE47E, 0x8264,
    0x8ACD, 0x8266,
    0xE481, 0x8268,
    0xE482, 0x826A,
    0xE483, 0x826B,
    0x8DAF, 0x826E,
    0x97C7, 0x826F,
    0xE485, 0x8271,
    0x9046, 0x8272,
    0x8990, 0x8276,
    0xE486, 0x8277,
    0xE487, 0x8278,
    0xE488, 0x827E,
    0x88F0, 0x828B,
    0xE489, 0x828D,
    0xE48A, 0x8292,
    0x9587, 0x8299,
    0x8EC5, 0x829D,
    0xE48C, 0x829F,
    0x8A48, 0x82A5,
    0x88B0, 0x82A6,
    0xE48B, 0x82AB,
    0xE48E, 0x82AC,
    0x946D, 0x82AD,
    0x9063, 0x82AF,
    0x89D4, 0x82B1,
    0x9646, 0x82B3,
    0x8C7C, 0x82B8,
    0x8BDA, 0x82B9,
    0xE48D, 0x82BB,
    0x89E8, 0x82BD,
    0x8AA1, 0x82C5,
    0x8991, 0x82D1,
    0xE492, 0x82D2,
    0x97E8, 0x82D3,
    0x91DB, 0x82D4,
    0x9563, 0x82D7,
    0xE49E, 0x82D9,
    0x89D5, 0x82DB,
    0xE49C, 0x82DC,
    0xE49A, 0x82DE,
    0xE491, 0x82DF,
    0xE48F, 0x82E1,
    0xE490, 0x82E3,
    0x8EE1, 0x82E5,
    0x8BEA, 0x82E6,
    0x9297, 0x82E7,
    0x93CF, 0x82EB,
    0x8970, 0x82F1,
    0xE494, 0x82F3,
    0xE493, 0x82F4,
    0xE499, 0x82F9,
    0xE495, 0x82FA,
    0xE498, 0x82FB,
    0x96CE, 0x8302,
    0xE497, 0x8303,
    0x89D6, 0x8304,
    0x8A9D, 0x8305,
    0xE49B, 0x8306,
    0xE49D, 0x8309,
    0x8C73, 0x830E,
    0xE4A1, 0x8316,
    0xE4AA, 0x8317,
    0xE4AB, 0x8318,
    0x88A9, 0x831C,
    0xE4B2, 0x8323,
    0x88EF, 0x8328,
    0xE4A9, 0x832B,
    0xE4A8, 0x832F,
    0xE4A3, 0x8331,
    0xE4A2, 0x8332,
    0xE4A0, 0x8334,
    0xE49F, 0x8335,
    0x9283, 0x8336,
    0x91F9, 0x8338,
    0xE4A5, 0x8339,
    0xE4A4, 0x8340,
    0xE4A7, 0x8345,
    0x9190, 0x8349,
    0x8C74, 0x834A,
    0x8960, 0x834F,
    0xE4A6, 0x8350,
    0x8D72, 0x8352,
    0x9191, 0x8358,
    0xE4B8, 0x8373,
    0xE4B9, 0x8375,
    0x89D7, 0x8377,
    0x89AC, 0x837B,
    0xE4B6, 0x837C,
    0xE4AC, 0x8385,
    0xE4B4, 0x8387,
    0xE4BB, 0x8389,
    0xE4B5, 0x838A,
    0xE4B3, 0x838E,
    0xE496, 0x8393,
    0xE4B1, 0x8396,
    0xE4AD, 0x839A,
    0x8ACE, 0x839E,
    0xE4AF, 0x839F,
    0xE4BA, 0x83A0,
    0xE4B0, 0x83A2,
    0xE4BC, 0x83A8,
    0xE4AE, 0x83AA,
    0x949C, 0x83AB,
    0x9789, 0x83B1,
    0xE4B7, 0x83B5,
    0xE4CD, 0x83BD,
    0xE4C5, 0x83C1,
    0x909B, 0x83C5,
    0x8B65, 0x83CA,
    0x8BDB, 0x83CC,
    0xE4C0, 0x83CE,
    0x89D9, 0x83D3,
    0x8FD2, 0x83D6,
    0xE4C3, 0x83D8,
    0x8DD8, 0x83DC,
    0x9370, 0x83DF,
    0xE4C8, 0x83E0,
    0x95EC, 0x83E9,
    0xE4BF, 0x83EB,
    0x89D8, 0x83EF,
    0x8CD4, 0x83F0,
    0x9548, 0x83F1,
    0xE4C9, 0x83F2,
    0xE4BD, 0x83F4,
    0xE4C6, 0x83F7,
    0xE4D0, 0x83FB,
    0xE4C1, 0x83FD,
    0xE4C2, 0x8403,
    0x93B8, 0x8404,
    0xE4C7, 0x8407,
    0xE4C4, 0x840B,
    0x9647, 0x840C,
    0xE4CA, 0x840D,
    0x88DE, 0x840E,
    0xE4BE, 0x8413,
    0xE4CC, 0x8420,
    0xE4CB, 0x8422,
    0x948B, 0x8429,
    0xE4D2, 0x842A,
    0xE4DD, 0x842C,
    0x8A9E, 0x8431,
    0xE4E0, 0x8435,
    0xE4CE, 0x8438,
    0xE4D3, 0x843C,
    0x978E, 0x843D,
    0xE4DC, 0x8446,
    0x9774, 0x8449,
    0x97A8, 0x844E,
    0x9298, 0x8457,
    0x8A8B, 0x845B,
    0x9592, 0x8461,
    0xE4E2, 0x8462,
    0x939F, 0x8463,
    0x88AF, 0x8466,
    0xE4DB, 0x8469,
    0xE4D7, 0x846B,
    0x9192, 0x846C,
    0xE4D1, 0x846D,
    0xE4D9, 0x846E,
    0xE4DE, 0x846F,
    0x944B, 0x8471,
    0x88A8, 0x8475,
    0xE4D6, 0x8477,
    0xE4DF, 0x8479,
    0x9598, 0x847A,
    0xE4DA, 0x8482,
    0xE4D5, 0x8484,
    0x8FD3, 0x848B,
    0x8F4E, 0x8490,
    0x8EAA, 0x8494,
    0x96D6, 0x8499,
    0x9566, 0x849C,
    0xE4E5, 0x849F,
    0xE4EE, 0x84A1,
    0xE4D8, 0x84AD,
    0x8A97, 0x84B2,
    0x8FF6, 0x84B8,
    0xE4E3, 0x84B9,
    0xE4E8, 0x84BB,
    0x9193, 0x84BC,
    0xE4E4, 0x84BF,
    0xE4EB, 0x84C1,
    0x927E, 0x84C4,
    0xE4EC, 0x84C6,
    0x9775, 0x84C9,
    0xE4E1, 0x84CA,
    0x8A57, 0x84CB,
    0xE4E7, 0x84CD,
    0xE4EA, 0x84D0,
    0x96AA, 0x84D1,
    0xE4ED, 0x84D6,
    0xE4E6, 0x84D9,
    0xE4E9, 0x84DA,
    0x9648, 0x84EC,
    0x9840, 0x84EE,
    0xE4F1, 0x84F4,
    0xE4F8, 0x84FC,
    0xE4F0, 0x84FF,
    0x8EC1, 0x8500,
    0xE4CF, 0x8506,
    0x95CC, 0x8511,
    0x96A0, 0x8513,
    0xE4F7, 0x8514,
    0xE4F6, 0x8515,
    0xE4F2, 0x8517,
    0xE4F3, 0x8518,
    0x8955, 0x851A,
    0xE4F5, 0x851F,
    0xE4EF, 0x8521,
    0x92D3, 0x8526,
    0xE4F4, 0x852C,
    0x88FC, 0x852D,
    0x91A0, 0x8535,
    0x95C1, 0x853D,
    0xE4F9, 0x8540,
    0xE540, 0x8541,
    0x94D7, 0x8543,
    0xE4FC, 0x8548,
    0x8FD4, 0x8549,
    0x8EC7, 0x854A,
    0xE542, 0x854B,
    0x8BBC, 0x854E,
    0xE543, 0x8555,
    0x9599, 0x8557,
    0xE4FB, 0x8558,
    0xE4D4, 0x855A,
    0xE4FA, 0x8563,
    0x986E, 0x8568,
    0x93A0, 0x8569,
    0x9593, 0x856A,
    0xE54A, 0x856D,
    0xE550, 0x8577,
    0xE551, 0x857E,
    0xE544, 0x8580,
    0x9496, 0x8584,
    0xE54E, 0x8587,
    0xE546, 0x8588,
    0xE548, 0x858A,
    0xE552, 0x8590,
    0xE547, 0x8591,
    0xE54B, 0x8594,
    0x8992, 0x8597,
    0x93E3, 0x8599,
    0xE54C, 0x859B,
    0xE54F, 0x859C,
    0xE545, 0x85A4,
    0x9145, 0x85A6,
    0xE549, 0x85A8,
    0x8E46, 0x85A9,
    0x9064, 0x85AA,
    0x8C4F, 0x85AB,
    0x96F2, 0x85AC,
    0x96F7, 0x85AE,
    0x8F92, 0x85AF,
    0xE556, 0x85B9,
    0xE554, 0x85BA,
    0x986D, 0x85C1,
    0xE553, 0x85C9,
    0x9795, 0x85CD,
    0xE555, 0x85CF,
    0xE557, 0x85D0,
    0xE558, 0x85D5,
    0xE55B, 0x85DC,
    0xE559, 0x85DD,
    0x93A1, 0x85E4,
    0xE55A, 0x85E5,
    0x94CB, 0x85E9,
    0xE54D, 0x85EA,
    0x8F93, 0x85F7,
    0xE55C, 0x85F9,
    0xE561, 0x85FA,
    0x9194, 0x85FB,
    0xE560, 0x85FE,
    0xE541, 0x8602,
    0xE562, 0x8606,
    0x9168, 0x8607,
    0xE55D, 0x860A,
    0xE55F, 0x860B,
    0xE55E, 0x8613,
    0x9F50, 0x8616,
    0x9F41, 0x8617,
    0xE564, 0x861A,
    0xE563, 0x8622,
    0x9796, 0x862D,
    0xE1BA, 0x862F,
    0xE565, 0x8630,
    0xE566, 0x863F,
    0xE567, 0x864D,
    0x8CD5, 0x864E,
    0x8B73, 0x8650,
    0xE569, 0x8654,
    0x997C, 0x8655,
    0x8B95, 0x865A,
    0x97B8, 0x865C,
    0x8BF1, 0x865E,
    0xE56A, 0x865F,
    0xE56B, 0x8667,
    0x928E, 0x866B,
    0xE56C, 0x8671,
    0x93F8, 0x8679,
    0x88B8, 0x867B,
    0x89E1, 0x868A,
    0xE571, 0x868B,
    0xE572, 0x868C,
    0xE56D, 0x8693,
    0x8E5C, 0x8695,
    0xE56E, 0x86A3,
    0x9461, 0x86A4,
    0xE56F, 0x86A9,
    0xE570, 0x86AA,
    0xE57A, 0x86AB,
    0xE574, 0x86AF,
    0xE577, 0x86B0,
    0xE573, 0x86B6,
    0xE575, 0x86C4,
    0xE576, 0x86C6,
    0x8ED6, 0x86C7,
    0xE578, 0x86C9,
    0x9260, 0x86CB,
    0x8C75, 0x86CD,
    0x8A61, 0x86CE,
    0xE57B, 0x86D4,
    0x8A5E, 0x86D9,
    0xE581, 0x86DB,
    0xE57C, 0x86DE,
    0xE580, 0x86DF,
    0x94B8, 0x86E4,
    0xE57D, 0x86E9,
    0xE57E, 0x86EC,
    0x9567, 0x86ED,
    0x94D8, 0x86EE,
    0xE582, 0x86EF,
    0x91FB, 0x86F8,
    0xE58C, 0x86F9,
    0xE588, 0x86FB,
    0x89E9, 0x86FE,
    0xE586, 0x8700,
    0x9649, 0x8702,
    0xE587, 0x8703,
    0xE584, 0x8706,
    0xE585, 0x8708,
    0xE58A, 0x8709,
    0xE58D, 0x870A,
    0xE58B, 0x870D,
    0xE589, 0x8711,
    0xE583, 0x8712,
    0x9277, 0x8718,
    0xE594, 0x871A,
    0x96A8, 0x871C,
    0xE592, 0x8725,
    0xE593, 0x8729,
    0xE58E, 0x8734,
    0xE590, 0x8737,
    0xE591, 0x873B,
    0xE58F, 0x873F,
    0x90E4, 0x8749,
    0x9858, 0x874B,
    0xE598, 0x874C,
    0xE599, 0x874E,
    0xE59F, 0x8753,
    0x9049, 0x8755,
    0xE59B, 0x8757,
    0xE59E, 0x8759,
    0xE596, 0x875F,
    0xE595, 0x8760,
    0xE5A0, 0x8763,
    0x89DA, 0x8766,
    0xE59C, 0x8768,
    0xE5A1, 0x876A,
    0xE59D, 0x876E,
    0xE59A, 0x8774,
    0x92B1, 0x8776,
    0xE597, 0x8778,
    0x9488, 0x877F,
    0xE5A5, 0x8782,
    0x975A, 0x878D,
    0xE5A4, 0x879F,
    0xE5A3, 0x87A2,
    0xE5AC, 0x87AB,
    0xE5A6, 0x87AF,
    0xE5AE, 0x87B3,
    0x9786, 0x87BA,
    0xE5B1, 0x87BB,
    0xE5A8, 0x87BD,
    0xE5A9, 0x87C0,
    0xE5AD, 0x87C4,
    0xE5B0, 0x87C6,
    0xE5AF, 0x87C7,
    0xE5A7, 0x87CB,
    0xE5AA, 0x87D0,
    0xE5BB, 0x87D2,
    0xE5B4, 0x87E0,
    0xE5B2, 0x87EF,
    0xE5B3, 0x87F2,
    0xE5B8, 0x87F6,
    0xE5B9, 0x87F7,
    0x8A49, 0x87F9,
    0x8B61, 0x87FB,
    0xE5B7, 0x87FE,
    0xE5A2, 0x8805,
    0xE5B6, 0x880D,
    0xE5BA, 0x880E,
    0xE5B5, 0x880F,
    0xE5BC, 0x8811,
    0xE5BE, 0x8815,
    0xE5BD, 0x8816,
    0xE5C0, 0x8821,
    0xE5BF, 0x8822,
    0xE579, 0x8823,
    0xE5C4, 0x8827,
    0xE5C1, 0x8831,
    0xE5C2, 0x8836,
    0xE5C3, 0x8839,
    0xE5C5, 0x883B,
    0x8C8C, 0x8840,
    0xE5C7, 0x8842,
    0xE5C6, 0x8844,
    0x8F4F, 0x8846,
    0x8D73, 0x884C,
    0x9FA5, 0x884D,
    0xE5C8, 0x8852,
    0x8F70, 0x8853,
    0x8A58, 0x8857,
    0xE5C9, 0x8859,
    0x8971, 0x885B,
    0x8FD5, 0x885D,
    0xE5CA, 0x885E,
    0x8D74, 0x8861,
    0xE5CB, 0x8862,
    0x88DF, 0x8863,
    0x955C, 0x8868,
    0xE5CC, 0x886B,
    0x908A, 0x8870,
    0xE5D3, 0x8872,
    0xE5D0, 0x8875,
    0x928F, 0x8877,
    0xE5D1, 0x887D,
    0xE5CE, 0x887E,
    0x8BDC, 0x887F,
    0xE5CD, 0x8881,
    0xE5D4, 0x8882,
    0x8C55, 0x8888,
    0x91DC, 0x888B,
    0xE5DA, 0x888D,
    0xE5D6, 0x8892,
    0x91B3, 0x8896,
    0xE5D5, 0x8897,
    0xE5D8, 0x8899,
    0xE5CF, 0x889E,
    0xE5D9, 0x88A2,
    0xE5DB, 0x88A4,
    0x94ED, 0x88AB,
    0xE5D7, 0x88AE,
    0xE5DC, 0x88B0,
    0xE5DE, 0x88B1,
    0x8CD1, 0x88B4,
    0xE5D2, 0x88B5,
    0x88BF, 0x88B7,
    0xE5DD, 0x88BF,
    0x8DD9, 0x88C1,
    0x97F4, 0x88C2,
    0xE5DF, 0x88C3,
    0xE5E0, 0x88C4,
    0x9195, 0x88C5,
    0x97A0, 0x88CF,
    0xE5E1, 0x88D4,
    0x9754, 0x88D5,
    0xE5E2, 0x88D8,
    0xE5E3, 0x88D9,
    0x95E2, 0x88DC,
    0xE5E4, 0x88DD,
    0x8DBE, 0x88DF,
    0x97A1, 0x88E1,
    0xE5E9, 0x88E8,
    0xE5EA, 0x88F2,
    0x8FD6, 0x88F3,
    0xE5E8, 0x88F4,
    0x9787, 0x88F8,
    0xE5E5, 0x88F9,
    0xE5E7, 0x88FC,
    0x90BB, 0x88FD,
    0x909E, 0x88FE,
    0xE5E6, 0x8902,
    0xE5EB, 0x8904,
    0x95A1, 0x8907,
    0xE5ED, 0x890A,
    0xE5EC, 0x890C,
    0x8A8C, 0x8910,
    0x964A, 0x8912,
    0xE5EE, 0x8913,
    0xE5FA, 0x891D,
    0xE5F0, 0x891E,
    0xE5F1, 0x8925,
    0xE5F2, 0x892A,
    0xE5F3, 0x892B,
    0xE5F7, 0x8936,
    0xE5F8, 0x8938,
    0xE5F6, 0x893B,
    0xE5F4, 0x8941,
    0xE5EF, 0x8943,
    0xE5F5, 0x8944,
    0xE5F9, 0x894C,
    0xE8B5, 0x894D,
    0x89A6, 0x8956,
    0xE5FC, 0x895E,
    0x8BDD, 0x895F,
    0xE5FB, 0x8960,
    0xE641, 0x8964,
    0xE640, 0x8966,
    0xE643, 0x896A,
    0xE642, 0x896D,
    0xE644, 0x896F,
    0x8F50, 0x8972,
    0xE645, 0x8974,
    0xE646, 0x8977,
    0xE647, 0x897E,
    0x90BC, 0x897F,
    0x9776, 0x8981,
    0xE648, 0x8983,
    0x95A2, 0x8986,
    0x9465, 0x8987,
    0xE649, 0x8988,
    0xE64A, 0x898A,
    0x8CA9, 0x898B,
    0x8B4B, 0x898F,
    0xE64B, 0x8993,
    0x8E8B, 0x8996,
    0x9460, 0x8997,
    0xE64C, 0x8998,
    0x8A6F, 0x899A,
    0xE64D, 0x89A1,
    0xE64F, 0x89A6,
    0x9797, 0x89A7,
    0xE64E, 0x89A9,
    0x9065, 0x89AA,
    0xE650, 0x89AC,
    0xE651, 0x89AF,
    0xE652, 0x89B2,
    0x8ACF, 0x89B3,
    0xE653, 0x89BA,
    0xE654, 0x89BD,
    0xE655, 0x89BF,
    0xE656, 0x89C0,
    0x8A70, 0x89D2,
    0xE657, 0x89DA,
    0xE658, 0x89DC,
    0xE659, 0x89DD,
    0x89F0, 0x89E3,
    0x9047, 0x89E6,
    0xE65A, 0x89E7,
    0xE65B, 0x89F4,
    0xE65C, 0x89F8,
    0x8CBE, 0x8A00,
    0x92F9, 0x8A02,
    0xE65D, 0x8A03,
    0x8C76, 0x8A08,
    0x9075, 0x8A0A,
    0xE660, 0x8A0C,
    0x93A2, 0x8A0E,
    0xE65F, 0x8A10,
    0x8C50, 0x8A13,
    0xE65E, 0x8A16,
    0x91F5, 0x8A17,
    0x8B4C, 0x8A18,
    0xE661, 0x8A1B,
    0xE662, 0x8A1D,
    0x8FD7, 0x8A1F,
    0x8C8D, 0x8A23,
    0xE663, 0x8A25,
    0x964B, 0x8A2A,
    0x90DD, 0x8A2D,
    0x8B96, 0x8A31,
    0x96F3, 0x8A33,
    0x9169, 0x8A34,
    0xE664, 0x8A36,
    0x9066, 0x8A3A,
    0x9290, 0x8A3B,
    0x8FD8, 0x8A3C,
    0xE665, 0x8A41,
    0xE668, 0x8A46,
    0xE669, 0x8A48,
    0x8DBC, 0x8A50,
    0x91C0, 0x8A51,
    0xE667, 0x8A52,
    0x8FD9, 0x8A54,
    0x955D, 0x8A55,
    0xE666, 0x8A5B,
    0x8E8C, 0x8A5E,
    0x8972, 0x8A60,
    0xE66D, 0x8A62,
    0x8C77, 0x8A63,
    0x8E8E, 0x8A66,
    0x8E8D, 0x8A69,
    0x986C, 0x8A6B,
    0xE66C, 0x8A6C,
    0xE66B, 0x8A6D,
    0x9146, 0x8A6E,
    0x8B6C, 0x8A70,
    0x9862, 0x8A71,
    0x8A59, 0x8A72,
    0x8FDA, 0x8A73,
    0xE66A, 0x8A7C,
    0xE66F, 0x8A82,
    0xE670, 0x8A84,
    0xE66E, 0x8A85,
    0x8CD6, 0x8A87,
    0x975F, 0x8A89,
    0x8E8F, 0x8A8C,
    0x9446, 0x8A8D,
    0xE673, 0x8A91,
    0x90BE, 0x8A93,
    0x9261, 0x8A95,
    0x9755, 0x8A98,
    0xE676, 0x8A9A,
    0x8CEA, 0x8A9E,
    0x90BD, 0x8AA0,
    0xE672, 0x8AA1,
    0xE677, 0x8AA3,
    0x8CEB, 0x8AA4,
    0xE674, 0x8AA5,
    0xE675, 0x8AA6,
    0xE671, 0x8AA8,
    0x90E0, 0x8AAC,
    0x93C7, 0x8AAD,
    0x924E, 0x8AB0,
    0x89DB, 0x8AB2,
    0x94EE, 0x8AB9,
    0x8B62, 0x8ABC,
    0x92B2, 0x8ABF,
    0xE67A, 0x8AC2,
    0xE678, 0x8AC4,
    0x926B, 0x8AC7,
    0x90BF, 0x8ACB,
    0x8AD0, 0x8ACC,
    0xE679, 0x8ACD,
    0x907A, 0x8ACF,
    0x97C8, 0x8AD2,
    0x985F, 0x8AD6,
    0xE67B, 0x8ADA,
    0xE687, 0x8ADB,
    0x92B3, 0x8ADC,
    0xE686, 0x8ADE,
    0xE683, 0x8AE0,
    0xE68B, 0x8AE1,
    0xE684, 0x8AE2,
    0xE680, 0x8AE4,
    0x92FA, 0x8AE6,
    0xE67E, 0x8AE7,
    0xE67C, 0x8AEB,
    0x9740, 0x8AED,
    0x8E90, 0x8AEE,
    0xE681, 0x8AF1,
    0xE67D, 0x8AF3,
    0xE685, 0x8AF7,
    0x8F94, 0x8AF8,
    0x8CBF, 0x8AFA,
    0x91F8, 0x8AFE,
    0x9664, 0x8B00,
    0x8979, 0x8B01,
    0x88E0, 0x8B02,
    0x93A3, 0x8B04,
    0xE689, 0x8B07,
    0xE688, 0x8B0C,
    0x93E4, 0x8B0E,
    0xE68D, 0x8B10,
    0xE682, 0x8B14,
    0xE68C, 0x8B16,
    0xE68E, 0x8B17,
    0x8CAA, 0x8B19,
    0xE68A, 0x8B1A,
    0x8D75, 0x8B1B,
    0x8ED3, 0x8B1D,
    0xE68F, 0x8B20,
    0x9777, 0x8B21,
    0xE692, 0x8B26,
    0xE695, 0x8B28,
    0xE693, 0x8B2B,
    0x9554, 0x8B2C,
    0xE690, 0x8B33,
    0x8BDE, 0x8B39,
    0xE694, 0x8B3E,
    0xE696, 0x8B41,
    0xE69A, 0x8B49,
    0xE697, 0x8B4C,
    0xE699, 0x8B4E,
    0xE698, 0x8B4F,
    0xE69B, 0x8B56,
    0x8EAF, 0x8B58,
    0xE69D, 0x8B5A,
    0xE69C, 0x8B5B,
    0x9588, 0x8B5C,
    0xE69F, 0x8B5F,
    0x8C78, 0x8B66,
    0xE69E, 0x8B6B,
    0xE6A0, 0x8B6C,
    0xE6A1, 0x8B6F,
    0x8B63, 0x8B70,
    0xE3BF, 0x8B71,
    0x8FF7, 0x8B72,
    0xE6A2, 0x8B74,
    0x8CEC, 0x8B77,
    0xE6A3, 0x8B7D,
    0xE6A4, 0x8B80,
    0x8E5D, 0x8B83,
    0x9DCC, 0x8B8A,
    0xE6A5, 0x8B8C,
    0xE6A6, 0x8B8E,
    0x8F51, 0x8B90,
    0xE6A7, 0x8B92,
    0xE6A8, 0x8B93,
    0xE6A9, 0x8B96,
    0xE6AA, 0x8B99,
    0xE6AB, 0x8B9A,
    0x924A, 0x8C37,
    0xE6AC, 0x8C3A,
    0xE6AE, 0x8C3F,
    0xE6AD, 0x8C41,
    0x93A4, 0x8C46,
    0xE6AF, 0x8C48,
    0x964C, 0x8C4A,
    0xE6B0, 0x8C4C,
    0xE6B1, 0x8C4E,
    0xE6B2, 0x8C50,
    0xE6B3, 0x8C55,
    0x93D8, 0x8C5A,
    0x8FDB, 0x8C61,
    0xE6B4, 0x8C62,
    0x8D8B, 0x8C6A,
    0x98AC, 0x8C6B,
    0xE6B5, 0x8C6C,
    0xE6B6, 0x8C78,
    0x955E, 0x8C79,
    0xE6B7, 0x8C7A,
    0xE6BF, 0x8C7C,
    0xE6B8, 0x8C82,
    0xE6BA, 0x8C85,
    0xE6B9, 0x8C89,
    0xE6BB, 0x8C8A,
    0x9665, 0x8C8C,
    0xE6BC, 0x8C8D,
    0xE6BD, 0x8C8E,
    0xE6BE, 0x8C94,
    0xE6C0, 0x8C98,
    0x8A4C, 0x8C9D,
    0x92E5, 0x8C9E,
    0x9589, 0x8CA0,
    0x8DE0, 0x8CA1,
    0x8D76, 0x8CA2,
    0x956E, 0x8CA7,
    0x89DD, 0x8CA8,
    0x94CC, 0x8CA9,
    0xE6C3, 0x8CAA,
    0x8AD1, 0x8CAB,
    0x90D3, 0x8CAC,
    0xE6C2, 0x8CAD,
    0xE6C7, 0x8CAE,
    0x9299, 0x8CAF,
    0x96E1, 0x8CB0,
    0xE6C5, 0x8CB2,
    0xE6C6, 0x8CB3,
    0x8B4D, 0x8CB4,
    0xE6C8, 0x8CB6,
    0x9483, 0x8CB7,
    0x91DD, 0x8CB8,
    0x94EF, 0x8CBB,
    0x935C, 0x8CBC,
    0xE6C4, 0x8CBD,
    0x9666, 0x8CBF,
    0x89EA, 0x8CC0,
    0xE6CA, 0x8CC1,
    0x9847, 0x8CC2,
    0x92C0, 0x8CC3,
    0x9864, 0x8CC4,
    0x8E91, 0x8CC7,
    0xE6C9, 0x8CC8,
    0x91AF, 0x8CCA,
    0xE6DA, 0x8CCD,
    0x9147, 0x8CCE,
    0x93F6, 0x8CD1,
    0x956F, 0x8CD3,
    0xE6CD, 0x8CDA,
    0x8E5E, 0x8CDB,
    0x8E92, 0x8CDC,
    0x8FDC, 0x8CDE,
    0x9485, 0x8CE0,
    0x8CAB, 0x8CE2,
    0xE6CC, 0x8CE3,
    0xE6CB, 0x8CE4,
    0x958A, 0x8CE6,
    0x8EBF, 0x8CEA,
    0x9371, 0x8CED,
    0xE6CF, 0x8CFA,
    0xE6D0, 0x8CFB,
    0x8D77, 0x8CFC,
    0xE6CE, 0x8CFD,
    0xE6D1, 0x8D04,
    0xE6D2, 0x8D05,
    0xE6D4, 0x8D07,
    0x91A1, 0x8D08,
    0xE6D3, 0x8D0A,
    0x8AE4, 0x8D0B,
    0xE6D6, 0x8D0D,
    0xE6D5, 0x8D0F,
    0xE6D7, 0x8D10,
    0xE6D9, 0x8D13,
    0xE6DB, 0x8D14,
    0xE6DC, 0x8D16,
    0x90D4, 0x8D64,
    0x8ECD, 0x8D66,
    0xE6DD, 0x8D67,
    0x8A71, 0x8D6B,
    0xE6DE, 0x8D6D,
    0x9196, 0x8D70,
    0xE6DF, 0x8D71,
    0xE6E0, 0x8D73,
    0x958B, 0x8D74,
    0x8B4E, 0x8D77,
    0xE6E1, 0x8D81,
    0x92B4, 0x8D85,
    0x897A, 0x8D8A,
    0xE6E2, 0x8D99,
    0x8EEF, 0x8DA3,
    0x9096, 0x8DA8,
    0x91AB, 0x8DB3,
    0xE6E5, 0x8DBA,
    0xE6E4, 0x8DBE,
    0xE6E3, 0x8DC2,
    0xE6EB, 0x8DCB,
    0xE6E9, 0x8DCC,
    0xE6E6, 0x8DCF,
    0xE6E8, 0x8DD6,
    0xE6E7, 0x8DDA,
    0xE6EA, 0x8DDB,
    0x8B97, 0x8DDD,
    0xE6EE, 0x8DDF,
    0x90D5, 0x8DE1,
    0xE6EF, 0x8DE3,
    0x8CD7, 0x8DE8,
    0xE6EC, 0x8DEA,
    0xE6ED, 0x8DEB,
    0x9848, 0x8DEF,
    0x92B5, 0x8DF3,
    0x9148, 0x8DF5,
    0xE6F0, 0x8DFC,
    0xE6F3, 0x8DFF,
    0xE6F1, 0x8E08,
    0xE6F2, 0x8E09,
    0x9778, 0x8E0A,
    0x93A5, 0x8E0F,
    0xE6F6, 0x8E10,
    0xE6F4, 0x8E1D,
    0xE6F5, 0x8E1E,
    0xE6F7, 0x8E1F,
    0xE748, 0x8E2A,
    0xE6FA, 0x8E30,
    0xE6FB, 0x8E34,
    0xE6F9, 0x8E35,
    0xE6F8, 0x8E42,
    0x92FB, 0x8E44,
    0xE740, 0x8E47,
    0xE744, 0x8E48,
    0xE741, 0x8E49,
    0xE6FC, 0x8E4A,
    0xE742, 0x8E4C,
    0xE743, 0x8E50,
    0xE74A, 0x8E55,
    0xE745, 0x8E59,
    0x90D6, 0x8E5F,
    0xE747, 0x8E60,
    0xE749, 0x8E63,
    0xE746, 0x8E64,
    0xE74C, 0x8E72,
    0x8F52, 0x8E74,
    0xE74B, 0x8E76,
    0xE74D, 0x8E7C,
    0xE74E, 0x8E81,
    0xE751, 0x8E84,
    0xE750, 0x8E85,
    0xE74F, 0x8E87,
    0xE753, 0x8E8A,
    0xE752, 0x8E8B,
    0x96F4, 0x8E8D,
    0xE755, 0x8E91,
    0xE754, 0x8E93,
    0xE756, 0x8E94,
    0xE757, 0x8E99,
    0xE759, 0x8EA1,
    0xE758, 0x8EAA,
    0x9067, 0x8EAB,
    0xE75A, 0x8EAC,
    0x8BEB, 0x8EAF,
    0xE75B, 0x8EB0,
    0xE75D, 0x8EB1,
    0xE75E, 0x8EBE,
    0xE75F, 0x8EC5,
    0xE75C, 0x8EC6,
    0xE760, 0x8EC8,
    0x8ED4, 0x8ECA,
    0xE761, 0x8ECB,
    0x8B4F, 0x8ECC,
    0x8C52, 0x8ECD,
    0x8CAC, 0x8ED2,
    0xE762, 0x8EDB,
    0x93EE, 0x8EDF,
    0x935D, 0x8EE2,
    0xE763, 0x8EE3,
    0xE766, 0x8EEB,
    0x8EB2, 0x8EF8,
    0xE765, 0x8EFB,
    0xE764, 0x8EFC,
    0x8C79, 0x8EFD,
    0xE767, 0x8EFE,
    0x8A72, 0x8F03,
    0xE769, 0x8F05,
    0x8DDA, 0x8F09,
    0xE768, 0x8F0A,
    0xE771, 0x8F0C,
    0xE76B, 0x8F12,
    0xE76D, 0x8F13,
    0x95E3, 0x8F14,
    0xE76A, 0x8F15,
    0xE76C, 0x8F19,
    0xE770, 0x8F1B,
    0xE76E, 0x8F1C,
    0x8B50, 0x8F1D,
    0xE76F, 0x8F1F,
    0xE772, 0x8F26,
    0x9479, 0x8F29,
    0x97D6, 0x8F2A,
    0x8F53, 0x8F2F,
    0xE773, 0x8F33,
    0x9741, 0x8F38,
    0xE775, 0x8F39,
    0xE774, 0x8F3B,
    0xE778, 0x8F3E,
    0x9760, 0x8F3F,
    0xE777, 0x8F42,
    0x8A8D, 0x8F44,
    0xE776, 0x8F45,
    0xE77B, 0x8F46,
    0xE77A, 0x8F49,
    0xE779, 0x8F4C,
    0x9351, 0x8F4D,
    0xE77C, 0x8F4E,
    0xE77D, 0x8F57,
    0xE77E, 0x8F5C,
    0x8D8C, 0x8F5F,
    0x8C44, 0x8F61,
    0xE780, 0x8F62,
    0xE781, 0x8F63,
    0xE782, 0x8F64,
    0x9068, 0x8F9B,
    0xE783, 0x8F9C,
    0x8EAB, 0x8F9E,
    0xE784, 0x8F9F,
    0xE785, 0x8FA3,
    0x999F, 0x8FA7,
    0x999E, 0x8FA8,
    0xE786, 0x8FAD,
    0xE390, 0x8FAE,
    0xE787, 0x8FAF,
    0x9243, 0x8FB0,
    0x904A, 0x8FB1,
    0x945F, 0x8FB2,
    0xE788, 0x8FB7,
    0x95D3, 0x8FBA,
    0x92D2, 0x8FBB,
    0x8D9E, 0x8FBC,
    0x9248, 0x8FBF,
    0x8949, 0x8FC2,
    0x9698, 0x8FC4,
    0x9076, 0x8FC5,
    0x8C7D, 0x8FCE,
    0x8BDF, 0x8FD1,
    0x95D4, 0x8FD4,
    0xE789, 0x8FDA,
    0xE78B, 0x8FE2,
    0xE78A, 0x8FE5,
    0x89DE, 0x8FE6,
    0x93F4, 0x8FE9,
    0xE78C, 0x8FEA,
    0x9497, 0x8FEB,
    0x9352, 0x8FED,
    0xE78D, 0x8FEF,
    0x8F71, 0x8FF0,
    0xE78F, 0x8FF4,
    0x96C0, 0x8FF7,
    0xE79E, 0x8FF8,
    0xE791, 0x8FF9,
    0xE792, 0x8FFA,
    0x92C7, 0x8FFD,
    0x91DE, 0x9000,
    0x9197, 0x9001,
    0x93A6, 0x9003,
    0xE790, 0x9005,
    0x8B74, 0x9006,
    0xE799, 0x900B,
    0xE796, 0x900D,
    0xE7A3, 0x900E,
    0x93A7, 0x900F,
    0x9280, 0x9010,
    0xE793, 0x9011,
    0x92FC, 0x9013,
    0x9372, 0x9014,
    0xE794, 0x9015,
    0xE798, 0x9016,
    0x9080, 0x9017,
    0x9487, 0x9019,
    0x92CA, 0x901A,
    0x90C0, 0x901D,
    0xE797, 0x901E,
    0x91AC, 0x901F,
    0x91A2, 0x9020,
    0xE795, 0x9021,
    0x88A7, 0x9022,
    0x9841, 0x9023,
    0xE79A, 0x9027,
    0x91DF, 0x902E,
    0x8F54, 0x9031,
    0x9069, 0x9032,
    0xE79C, 0x9035,
    0xE79B, 0x9036,
    0x88ED, 0x9038,
    0xE79D, 0x9039,
    0x954E, 0x903C,
    0xE7A5, 0x903E,
    0x93D9, 0x9041,
    0x908B, 0x9042,
    0x9278, 0x9045,
    0x8BF6, 0x9047,
    0xE7A4, 0x9049,
    0x9756, 0x904A,
    0x895E, 0x904B,
    0x95D5, 0x904D,
    0x89DF, 0x904E,
    0xE79F, 0x904F,
    0xE7A0, 0x9050,
    0xE7A1, 0x9051,
    0xE7A2, 0x9052,
    0x93B9, 0x9053,
    0x9242, 0x9054,
    0x88E1, 0x9055,
    0xE7A6, 0x9056,
    0xE7A7, 0x9058,
    0xEAA1, 0x9059,
    0x91BB, 0x905C,
    0xE7A8, 0x905E,
    0x8993, 0x9060,
    0x916B, 0x9061,
    0x8CAD, 0x9063,
    0x9779, 0x9065,
    0xE7A9, 0x9068,
    0x934B, 0x9069,
    0x9198, 0x906D,
    0x8ED5, 0x906E,
    0xE7AA, 0x906F,
    0xE7AD, 0x9072,
    0x8F85, 0x9075,
    0xE7AB, 0x9076,
    0x914A, 0x9077,
    0x9149, 0x9078,
    0x88E2, 0x907A,
    0x97C9, 0x907C,
    0xE7AF, 0x907D,
    0x94F0, 0x907F,
    0xE7B1, 0x9080,
    0xE7B0, 0x9081,
    0xE7AE, 0x9082,
    0xE284, 0x9083,
    0x8AD2, 0x9084,
    0xE78E, 0x9087,
    0xE7B3, 0x9089,
    0xE7B2, 0x908A,
    0xE7B4, 0x908F,
    0x9757, 0x9091,
    0x93DF, 0x90A3,
    0x964D, 0x90A6,
    0xE7B5, 0x90A8,
    0x8ED7, 0x90AA,
    0xE7B6, 0x90AF,
    0xE7B7, 0x90B1,
    0xE7B8, 0x90B5,
    0x9340, 0x90B8,
    0x88E8, 0x90C1,
    0x8D78, 0x90CA,
    0x9859, 0x90CE,
    0xE7BC, 0x90DB,
    0x8C53, 0x90E1,
    0xE7B9, 0x90E2,
    0xE7BA, 0x90E4,
    0x9594, 0x90E8,
    0x8A73, 0x90ED,
    0x9758, 0x90F5,
    0x8BBD, 0x90F7,
    0x9373, 0x90FD,
    0xE7BD, 0x9102,
    0xE7BE, 0x9112,
    0xE7BF, 0x9119,
    0x9341, 0x912D,
    0xE7C1, 0x9130,
    0xE7C0, 0x9132,
    0x93D1, 0x9149,
    0xE7C2, 0x914A,
    0x8F55, 0x914B,
    0x8EDE, 0x914C,
    0x947A, 0x914D,
    0x9291, 0x914E,
    0x8EF0, 0x9152,
    0x908C, 0x9154,
    0xE7C3, 0x9156,
    0xE7C4, 0x9158,
    0x907C, 0x9162,
    0xE7C5, 0x9163,
    0xE7C6, 0x9165,
    0xE7C7, 0x9169,
    0x978F, 0x916A,
    0x8F56, 0x916C,
    0xE7C9, 0x9172,
    0xE7C8, 0x9173,
    0x8D79, 0x9175,
    0x8D93, 0x9177,
    0x8E5F, 0x9178,
    0xE7CC, 0x9182,
    0x8F86, 0x9187,
    0xE7CB, 0x9189,
    0xE7CA, 0x918B,
    0x91E7, 0x918D,
    0x8CED, 0x9190,
    0x90C1, 0x9192,
    0x94AE, 0x9197,
    0x8F58, 0x919C,
    0xE7CD, 0x91A2,
    0x8FDD, 0x91A4,
    0xE7D0, 0x91AA,
    0xE7CE, 0x91AB,
    0xE7CF, 0x91AF,
    0xE7D2, 0x91B4,
    0xE7D1, 0x91B5,
    0x8FF8, 0x91B8,
    0xE7D3, 0x91BA,
    0xE7D4, 0x91C0,
    0xE7D5, 0x91C1,
    0x94CE, 0x91C6,
    0x8DD1, 0x91C7,
    0x8EDF, 0x91C8,
    0xE7D6, 0x91C9,
    0xE7D7, 0x91CB,
    0x97A2, 0x91CC,
    0x8F64, 0x91CD,
    0x96EC, 0x91CE,
    0x97CA, 0x91CF,
    0xE7D8, 0x91D0,
    0x8BE0, 0x91D1,
    0xE7D9, 0x91D6,
    0x9342, 0x91D8,
    0xE7DC, 0x91DB,
    0x8A98, 0x91DC,
    0x906A, 0x91DD,
    0xE7DA, 0x91DF,
    0xE7DB, 0x91E1,
    0x92DE, 0x91E3,
    0x9674, 0x91E6,
    0x8BFA, 0x91E7,
    0xE7DE, 0x91F5,
    0xE7DF, 0x91F6,
    0xE7DD, 0x91FC,
    0xE7E1, 0x91FF,
    0x93DD, 0x920D,
    0x8A62, 0x920E,
    0xE7E5, 0x9211,
    0xE7E2, 0x9214,
    0xE7E4, 0x9215,
    0xE7E0, 0x921E,
    0xE86E, 0x9229,
    0xE7E3, 0x922C,
    0x97E9, 0x9234,
    0x8CD8, 0x9237,
    0xE7ED, 0x923F,
    0x9353, 0x9244,
    0xE7E8, 0x9245,
    0xE7EB, 0x9248,
    0xE7E9, 0x9249,
    0xE7EE, 0x924B,
    0xE7EF, 0x9250,
    0xE7E7, 0x9257,
    0xE7F4, 0x925A,
    0x8994, 0x925B,
    0xE7E6, 0x925E,
    0x94AB, 0x9262,
    0xE7EA, 0x9264,
    0x8FDE, 0x9266,
    0x8D7A, 0x9271,
    0x9667, 0x927E,
    0x8BE2, 0x9280,
    0x8F65, 0x9283,
    0x93BA, 0x9285,
    0x914C, 0x9291,
    0xE7F2, 0x9293,
    0xE7EC, 0x9295,
    0xE7F1, 0x9296,
    0x96C1, 0x9298,
    0x92B6, 0x929A,
    0xE7F3, 0x929B,
    0xE7F0, 0x929C,
    0x914B, 0x92AD,
    0xE7F7, 0x92B7,
    0xE7F6, 0x92B9,
    0xE7F5, 0x92CF,
    0x964E, 0x92D2,
    0x8F9B, 0x92E4,
    0xE7F8, 0x92E9,
    0x95DD, 0x92EA,
    0x8973, 0x92ED,
    0x9565, 0x92F2,
    0x9292, 0x92F3,
    0x8B98, 0x92F8,
    0xE7FA, 0x92FA,
    0x8D7C, 0x92FC,
    0x8E4B, 0x9306,
    0xE7F9, 0x930F,
    0x908D, 0x9310,
    0x908E, 0x9318,
    0xE840, 0x9319,
    0xE842, 0x931A,
    0x8FF9, 0x9320,
    0xE841, 0x9322,
    0xE843, 0x9323,
    0x8BD1, 0x9326,
    0x9564, 0x9328,
    0x8EE0, 0x932B,
    0x9842, 0x932C,
    0xE7FC, 0x932E,
    0x8DF6, 0x932F,
    0x985E, 0x9332,
    0xE845, 0x9335,
    0xE844, 0x933A,
    0xE846, 0x933B,
    0xE7FB, 0x9344,
    0x93E7, 0x934B,
    0x9374, 0x934D,
    0x92D5, 0x9354,
    0xE84B, 0x9356,
    0x9262, 0x935B,
    0xE847, 0x935C,
    0xE848, 0x9360,
    0x8C4C, 0x936C,
    0xE84A, 0x936E,
    0x8CAE, 0x9375,
    0xE849, 0x937C,
    0x8FDF, 0x937E,
    0x8A99, 0x938C,
    0xE84F, 0x9394,
    0x8DBD, 0x9396,
    0x9199, 0x9397,
    0x92C8, 0x939A,
    0x8A5A, 0x93A7,
    0xE84D, 0x93AC,
    0xE84E, 0x93AD,
    0x92C1, 0x93AE,
    0xE84C, 0x93B0,
    0xE850, 0x93B9,
    0xE856, 0x93C3,
    0xE859, 0x93C8,
    0xE858, 0x93D0,
    0x934C, 0x93D1,
    0xE851, 0x93D6,
    0xE852, 0x93D7,
    0xE855, 0x93D8,
    0xE857, 0x93DD,
    0x8BBE, 0x93E1,
    0xE85A, 0x93E4,
    0xE854, 0x93E5,
    0xE853, 0x93E8,
    0xE85E, 0x9403,
    0xE85F, 0x9407,
    0xE860, 0x9410,
    0xE85D, 0x9413,
    0xE85C, 0x9414,
    0x8FE0, 0x9418,
    0x93A8, 0x9419,
    0xE85B, 0x941A,
    0xE864, 0x9421,
    0xE862, 0x942B,
    0xE863, 0x9435,
    0xE861, 0x9436,
    0x91F6, 0x9438,
    0xE865, 0x943A,
    0xE866, 0x9441,
    0xE868, 0x9444,
    0x8AD3, 0x9451,
    0xE867, 0x9452,
    0x96F8, 0x9453,
    0xE873, 0x945A,
    0xE869, 0x945B,
    0xE86C, 0x945E,
    0xE86A, 0x9460,
    0xE86B, 0x9462,
    0xE86D, 0x946A,
    0xE86F, 0x9470,
    0xE870, 0x9475,
    0xE871, 0x9477,
    0xE874, 0x947C,
    0xE872, 0x947D,
    0xE875, 0x947E,
    0xE877, 0x947F,
    0xE876, 0x9481,
    0x92B7, 0x9577,
    0x96E5, 0x9580,
    0xE878, 0x9582,
    0x914D, 0x9583,
    0xE879, 0x9587,
    0x95C2, 0x9589,
    0xE87A, 0x958A,
    0x8A4A, 0x958B,
    0x895B, 0x958F,
    0x8AD5, 0x9591,
    0x8AD4, 0x9593,
    0xE87B, 0x9594,
    0xE87C, 0x9596,
    0xE87D, 0x9598,
    0xE87E, 0x9599,
    0xE880, 0x95A0,
    0x8AD6, 0x95A2,
    0x8A74, 0x95A3,
    0x8D7D, 0x95A4,
    0x94B4, 0x95A5,
    0xE882, 0x95A7,
    0xE881, 0x95A8,
    0xE883, 0x95AD,
    0x897B, 0x95B2,
    0xE886, 0x95B9,
    0xE885, 0x95BB,
    0xE884, 0x95BC,
    0xE887, 0x95BE,
    0xE88A, 0x95C3,
    0x88C5, 0x95C7,
    0xE888, 0x95CA,
    0xE88C, 0x95CC,
    0xE88B, 0x95CD,
    0xE88E, 0x95D4,
    0xE88D, 0x95D5,
    0xE88F, 0x95D6,
    0x93AC, 0x95D8,
    0xE890, 0x95DC,
    0xE891, 0x95E1,
    0xE893, 0x95E2,
    0xE892, 0x95E5,
    0x958C, 0x961C,
    0xE894, 0x9621,
    0xE895, 0x9628,
    0x8DE3, 0x962A,
    0xE896, 0x962E,
    0xE897, 0x962F,
    0x9668, 0x9632,
    0x916A, 0x963B,
    0x88A2, 0x963F,
    0x91C9, 0x9640,
    0xE898, 0x9642,
    0x958D, 0x9644,
    0xE89B, 0x964B,
    0xE899, 0x964C,
    0x8D7E, 0x964D,
    0xE89A, 0x964F,
    0x8CC0, 0x9650,
    0x95C3, 0x965B,
    0xE89D, 0x965C,
    0xE89F, 0x965D,
    0xE89E, 0x965E,
    0xE8A0, 0x965F,
    0x8940, 0x9662,
    0x9077, 0x9663,
    0x8F9C, 0x9664,
    0x8AD7, 0x9665,
    0xE8A1, 0x9666,
    0x9486, 0x966A,
    0xE8A3, 0x966C,
    0x8941, 0x9670,
    0xE8A2, 0x9672,
    0x92C2, 0x9673,
    0x97CB, 0x9675,
    0x93A9, 0x9676,
    0xE89C, 0x9677,
    0x97A4, 0x9678,
    0x8CAF, 0x967A,
    0x977A, 0x967D,
    0x8BF7, 0x9685,
    0x97B2, 0x9686,
    0x8C47, 0x9688,
    0x91E0, 0x968A,
    0xE440, 0x968B,
    0xE8A4, 0x968D,
    0x8A4B, 0x968E,
    0x908F, 0x968F,
    0x8A75, 0x9694,
    0xE8A6, 0x9695,
    0xE8A7, 0x9697,
    0xE8A5, 0x9698,
    0x8C84, 0x9699,
    0x8DDB, 0x969B,
    0x8FE1, 0x969C,
    0x8942, 0x96A0,
    0x97D7, 0x96A3,
    0xE8A9, 0x96A7,
    0xE7AC, 0x96A8,
    0xE8A8, 0x96AA,
    0xE8AC, 0x96B0,
    0xE8AA, 0x96B1,
    0xE8AB, 0x96B2,
    0xE8AD, 0x96B4,
    0xE8AE, 0x96B6,
    0x97EA, 0x96B7,
    0xE8AF, 0x96B8,
    0xE8B0, 0x96B9,
    0x90C7, 0x96BB,
    0x94B9, 0x96BC,
    0x909D, 0x96C0,
    0x8AE5, 0x96C1,
    0x9759, 0x96C4,
    0x89EB, 0x96C5,
    0x8F57, 0x96C6,
    0x8CD9, 0x96C7,
    0xE8B3, 0x96C9,
    0xE8B2, 0x96CB,
    0x8E93, 0x96CC,
    0xE8B4, 0x96CD,
    0xE8B1, 0x96CE,
    0x8E47, 0x96D1,
    0xE8B8, 0x96D5,
    0xE5AB, 0x96D6,
    0x99D4, 0x96D9,
    0x9097, 0x96DB,
    0xE8B6, 0x96DC,
    0x97A3, 0x96E2,
    0x93EF, 0x96E3,
    0x894A, 0x96E8,
    0x90E1, 0x96EA,
    0x8EB4, 0x96EB,
    0x95B5, 0x96F0,
    0x895F, 0x96F2,
    0x97EB, 0x96F6,
    0x978B, 0x96F7,
    0xE8B9, 0x96F9,
    0x9364, 0x96FB,
    0x8EF9, 0x9700,
    0xE8BA, 0x9704,
    0xE8BB, 0x9706,
    0x906B, 0x9707,
    0xE8BC, 0x9708,
    0x97EC, 0x970A,
    0xE8B7, 0x970D,
    0xE8BE, 0x970E,
    0xE8C0, 0x970F,
    0xE8BF, 0x9711,
    0xE8BD, 0x9713,
    0xE8C1, 0x9716,
    0xE8C2, 0x9719,
    0x919A, 0x971C,
    0x89E0, 0x971E,
    0xE8C3, 0x9724,
    0x96B6, 0x9727,
    0xE8C4, 0x972A,
    0xE8C5, 0x9730,
    0x9849, 0x9732,
    0x9E50, 0x9738,
    0xE8C6, 0x9739,
    0xE8C7, 0x973D,
    0xE8C8, 0x973E,
    0xE8CC, 0x9742,
    0xE8C9, 0x9744,
    0xE8CA, 0x9746,
    0xE8CB, 0x9748,
    0xE8CD, 0x9749,
    0x90C2, 0x9752,
    0x96F5, 0x9756,
    0x90C3, 0x9759,
    0xE8CE, 0x975C,
    0x94F1, 0x975E,
    0xE8CF, 0x9760,
    0xEA72, 0x9761,
    0x96CA, 0x9762,
    0xE8D0, 0x9764,
    0xE8D1, 0x9766,
    0xE8D2, 0x9768,
    0x8A76, 0x9769,
    0xE8D4, 0x976B,
    0x9078, 0x976D,
    0xE8D5, 0x9771,
    0x8C43, 0x9774,
    0xE8D6, 0x9779,
    0xE8DA, 0x977A,
    0xE8D8, 0x977C,
    0xE8D9, 0x9781,
    0x8A93, 0x9784,
    0xE8D7, 0x9785,
    0xE8DB, 0x9786,
    0xE8DC, 0x978B,
    0x88C6, 0x978D,
    0xE8DD, 0x978F,
    0xE8DE, 0x9790,
    0x8FE2, 0x9798,
    0xE8DF, 0x979C,
    0x8B66, 0x97A0,
    0xE8E2, 0x97A3,
    0xE8E1, 0x97A6,
    0xE8E0, 0x97A8,
    0xE691, 0x97AB,
    0x95DA, 0x97AD,
    0xE8E3, 0x97B3,
    0xE8E4, 0x97B4,
    0xE8E5, 0x97C3,
    0xE8E6, 0x97C6,
    0xE8E7, 0x97C8,
    0xE8E8, 0x97CB,
    0x8AD8, 0x97D3,
    0xE8E9, 0x97DC,
    0xE8EA, 0x97ED,
    0x9442, 0x97EE,
    0xE8EC, 0x97F2,
    0x89B9, 0x97F3,
    0xE8EF, 0x97F5,
    0xE8EE, 0x97F6,
    0x8943, 0x97FB,
    0x8BBF, 0x97FF,
    0x95C5, 0x9801,
    0x92B8, 0x9802,
    0x8DA0, 0x9803,
    0x8D80, 0x9805,
    0x8F87, 0x9806,
    0x907B, 0x9808,
    0xE8F1, 0x980C,
    0xE8F0, 0x980F,
    0x9761, 0x9810,
    0x8AE6, 0x9811,
    0x94D0, 0x9812,
    0x93DA, 0x9813,
    0x909C, 0x9817,
    0x97CC, 0x9818,
    0x8C7A, 0x981A,
    0xE8F4, 0x9821,
    0xE8F3, 0x9824,
    0x966A, 0x982C,
    0x93AA, 0x982D,
    0x896F, 0x9834,
    0xE8F5, 0x9837,
    0xE8F2, 0x9838,
    0x9570, 0x983B,
    0x978A, 0x983C,
    0xE8F6, 0x983D,
    0xE8F7, 0x9846,
    0xE8F9, 0x984B,
    0x91E8, 0x984C,
    0x8A7A, 0x984D,
    0x8A7B, 0x984E,
    0xE8F8, 0x984F,
    0x8AE7, 0x9854,
    0x8CB0, 0x9855,
    0x8AE8, 0x9858,
    0x935E, 0x985B,
    0x97DE, 0x985E,
    0x8CDA, 0x9867,
    0xE8FA, 0x986B,
    0xE8FB, 0x986F,
    0xE8FC, 0x9870,
    0xE940, 0x9871,
    0xE942, 0x9873,
    0xE941, 0x9874,
    0x9597, 0x98A8,
    0xE943, 0x98AA,
    0xE944, 0x98AF,
    0xE945, 0x98B1,
    0xE946, 0x98B6,
    0xE948, 0x98C3,
    0xE947, 0x98C4,
    0xE949, 0x98C6,
    0x94F2, 0x98DB,
    0xE3CA, 0x98DC,
    0x9048, 0x98DF,
    0x8B51, 0x98E2,
    0xE94A, 0x98E9,
    0xE94B, 0x98EB,
    0x99AA, 0x98ED,
    0x9F5A, 0x98EE,
    0x94D1, 0x98EF,
    0x88F9, 0x98F2,
    0x88B9, 0x98F4,
    0x8E94, 0x98FC,
    0x964F, 0x98FD,
    0x8FFC, 0x98FE,
    0xE94C, 0x9903,
    0x96DD, 0x9905,
    0xE94D, 0x9909,
    0x977B, 0x990A,
    0x8961, 0x990C,
    0x8E60, 0x9910,
    0xE94E, 0x9912,
    0x89EC, 0x9913,
    0xE94F, 0x9914,
    0xE950, 0x9918,
    0xE952, 0x991D,
    0xE953, 0x991E,
    0xE955, 0x9920,
    0xE951, 0x9921,
    0xE954, 0x9924,
    0x8AD9, 0x9928,
    0xE956, 0x992C,
    0xE957, 0x992E,
    0xE958, 0x993D,
    0xE959, 0x993E,
    0xE95A, 0x9942,
    0xE95C, 0x9945,
    0xE95B, 0x9949,
    0xE95E, 0x994B,
    0xE961, 0x994C,
    0xE95D, 0x9950,
    0xE95F, 0x9951,
    0xE960, 0x9952,
    0xE962, 0x9955,
    0x8BC0, 0x9957,
    0x8EF1, 0x9996,
    0xE963, 0x9997,
    0xE964, 0x9998,
    0x8D81, 0x9999,
    0xE965, 0x99A5,
    0x8A5D, 0x99A8,
    0x946E, 0x99AC,
    0xE966, 0x99AD,
    0xE967, 0x99AE,
    0x9279, 0x99B3,
    0x93E9, 0x99B4,
    0xE968, 0x99BC,
    0x949D, 0x99C1,
    0x91CA, 0x99C4,
    0x8977, 0x99C5,
    0x8BEC, 0x99C6,
    0x8BED, 0x99C8,
    0x9293, 0x99D0,
    0xE96D, 0x99D1,
    0x8BEE, 0x99D2,
    0x89ED, 0x99D5,
    0xE96C, 0x99D8,
    0xE96A, 0x99DB,
    0xE96B, 0x99DD,
    0xE969, 0x99DF,
    0xE977, 0x99E2,
    0xE96E, 0x99ED,
    0xE96F, 0x99EE,
    0xE970, 0x99F1,
    0xE971, 0x99F2,
    0xE973, 0x99F8,
    0xE972, 0x99FB,
    0x8F78, 0x99FF,
    0xE974, 0x9A01,
    0xE976, 0x9A05,
    0x8B52, 0x9A0E,
    0xE975, 0x9A0F,
    0x919B, 0x9A12,
    0x8CB1, 0x9A13,
    0xE978, 0x9A19,
    0x91CB, 0x9A28,
    0xE979, 0x9A2B,
    0x93AB, 0x9A30,
    0xE97A, 0x9A37,
    0xE980, 0x9A3E,
    0xE97D, 0x9A40,
    0xE97C, 0x9A42,
    0xE97E, 0x9A43,
    0xE97B, 0x9A45,
    0xE982, 0x9A4D,
    0xE981, 0x9A55,
    0xE984, 0x9A57,
    0x8BC1, 0x9A5A,
    0xE983, 0x9A5B,
    0xE985, 0x9A5F,
    0xE986, 0x9A62,
    0xE988, 0x9A64,
    0xE987, 0x9A65,
    0xE989, 0x9A69,
    0xE98B, 0x9A6A,
    0xE98A, 0x9A6B,
    0x8D9C, 0x9AA8,
    0xE98C, 0x9AAD,
    0xE98D, 0x9AB0,
    0x8A5B, 0x9AB8,
    0xE98E, 0x9ABC,
    0xE98F, 0x9AC0,
    0x9091, 0x9AC4,
    0xE990, 0x9ACF,
    0xE991, 0x9AD1,
    0xE992, 0x9AD3,
    0xE993, 0x9AD4,
    0x8D82, 0x9AD8,
    0xE994, 0x9ADE,
    0xE995, 0x9ADF,
    0xE996, 0x9AE2,
    0xE997, 0x9AE3,
    0xE998, 0x9AE6,
    0x94AF, 0x9AEA,
    0xE99A, 0x9AEB,
    0x9545, 0x9AED,
    0xE99B, 0x9AEE,
    0xE999, 0x9AEF,
    0xE99D, 0x9AF1,
    0xE99C, 0x9AF4,
    0xE99E, 0x9AF7,
    0xE99F, 0x9AFB,
    0xE9A0, 0x9B06,
    0xE9A1, 0x9B18,
    0xE9A2, 0x9B1A,
    0xE9A3, 0x9B1F,
    0xE9A4, 0x9B22,
    0xE9A5, 0x9B23,
    0xE9A6, 0x9B25,
    0xE9A7, 0x9B27,
    0xE9A8, 0x9B28,
    0xE9A9, 0x9B29,
    0xE9AA, 0x9B2A,
    0xE9AB, 0x9B2E,
    0xE9AC, 0x9B2F,
    0x9F54, 0x9B31,
    0xE9AD, 0x9B32,
    0xE2F6, 0x9B3B,
    0x8B53, 0x9B3C,
    0x8A40, 0x9B41,
    0x8DB0, 0x9B42,
    0xE9AF, 0x9B43,
    0xE9AE, 0x9B44,
    0x96A3, 0x9B45,
    0xE9B1, 0x9B4D,
    0xE9B2, 0x9B4E,
    0xE9B0, 0x9B4F,
    0xE9B3, 0x9B51,
    0x9682, 0x9B54,
    0xE9B4, 0x9B58,
    0x8B9B, 0x9B5A,
    0x9844, 0x9B6F,
    0xE9B5, 0x9B74,
    0xE9B7, 0x9B83,
    0x88BC, 0x9B8E,
    0xE9B8, 0x9B91,
    0x95A9, 0x9B92,
    0xE9B6, 0x9B93,
    0xE9B9, 0x9B96,
    0xE9BA, 0x9B97,
    0xE9BB, 0x9B9F,
    0xE9BC, 0x9BA0,
    0xE9BD, 0x9BA8,
    0x968E, 0x9BAA,
    0x8E4C, 0x9BAB,
    0x8DF8, 0x9BAD,
    0x914E, 0x9BAE,
    0xE9BE, 0x9BB4,
    0xE9C1, 0x9BB9,
    0xE9BF, 0x9BC0,
    0xE9C2, 0x9BC6,
    0x8CEF, 0x9BC9,
    0xE9C0, 0x9BCA,
    0xE9C3, 0x9BCF,
    0xE9C4, 0x9BD1,
    0xE9C5, 0x9BD2,
    0xE9C9, 0x9BD4,
    0x8E49, 0x9BD6,
    0x91E2, 0x9BDB,
    0xE9CA, 0x9BE1,
    0xE9C7, 0x9BE2,
    0xE9C6, 0x9BE3,
    0xE9C8, 0x9BE4,
    0x8C7E, 0x9BE8,
    0xE9CE, 0x9BF0,
    0xE9CD, 0x9BF1,
    0xE9CC, 0x9BF2,
    0x88B1, 0x9BF5,
    0xE9D8, 0x9C04,
    0xE9D4, 0x9C06,
    0xE9D5, 0x9C08,
    0xE9D1, 0x9C09,
    0xE9D7, 0x9C0A,
    0xE9D3, 0x9C0C,
    0x8A82, 0x9C0D,
    0x986B, 0x9C10,
    0xE9D6, 0x9C12,
    0xE9D2, 0x9C13,
    0xE9D0, 0x9C14,
    0xE9CF, 0x9C15,
    0xE9DA, 0x9C1B,
    0xE9DD, 0x9C21,
    0xE9DC, 0x9C24,
    0xE9DB, 0x9C25,
    0x9568, 0x9C2D,
    0xE9D9, 0x9C2E,
    0x88F1, 0x9C2F,
    0xE9DE, 0x9C30,
    0xE9E0, 0x9C32,
    0x8A8F, 0x9C39,
    0xE9CB, 0x9C3A,
    0x8956, 0x9C3B,
    0xE9E2, 0x9C3E,
    0xE9E1, 0x9C46,
    0xE9DF, 0x9C47,
    0x924C, 0x9C48,
    0x9690, 0x9C52,
    0x97D8, 0x9C57,
    0xE9E3, 0x9C5A,
    0xE9E4, 0x9C60,
    0xE9E5, 0x9C67,
    0xE9E6, 0x9C76,
    0xE9E7, 0x9C78,
    0x92B9, 0x9CE5,
    0xE9E8, 0x9CE7,
    0x94B5, 0x9CE9,
    0xE9ED, 0x9CEB,
    0xE9E9, 0x9CEC,
    0xE9EA, 0x9CF0,
    0x9650, 0x9CF3,
    0x96C2, 0x9CF4,
    0x93CE, 0x9CF6,
    0xE9EE, 0x9D03,
    0xE9EF, 0x9D06,
    0x93BC, 0x9D07,
    0xE9EC, 0x9D08,
    0xE9EB, 0x9D09,
    0x89A8, 0x9D0E,
    0xE9F7, 0x9D12,
    0xE9F6, 0x9D15,
    0x8995, 0x9D1B,
    0xE9F4, 0x9D1F,
    0xE9F3, 0x9D23,
    0xE9F1, 0x9D26,
    0x8A9B, 0x9D28,
    0xE9F0, 0x9D2A,
    0x8EB0, 0x9D2B,
    0x89A7, 0x9D2C,
    0x8D83, 0x9D3B,
    0xE9FA, 0x9D3E,
    0xE9F9, 0x9D3F,
    0xE9F8, 0x9D41,
    0xE9F5, 0x9D44,
    0xE9FB, 0x9D46,
    0xE9FC, 0x9D48,
    0xEA44, 0x9D50,
    0xEA43, 0x9D51,
    0xEA45, 0x9D59,
    0x894C, 0x9D5C,
    0xEA40, 0x9D5D,
    0xEA41, 0x9D5E,
    0x8D94, 0x9D60,
    0x96B7, 0x9D61,
    0xEA42, 0x9D64,
    0x9651, 0x9D6C,
    0xEA4A, 0x9D6F,
    0xEA46, 0x9D72,
    0xEA4B, 0x9D7A,
    0xEA48, 0x9D87,
    0xEA47, 0x9D89,
    0x8C7B, 0x9D8F,
    0xEA4C, 0x9D9A,
    0xEA4D, 0x9DA4,
    0xEA4E, 0x9DA9,
    0xEA49, 0x9DAB,
    0xE9F2, 0x9DAF,
    0xEA4F, 0x9DB2,
    0x92DF, 0x9DB4,
    0xEA53, 0x9DB8,
    0xEA54, 0x9DBA,
    0xEA52, 0x9DBB,
    0xEA51, 0x9DC1,
    0xEA57, 0x9DC2,
    0xEA50, 0x9DC4,
    0xEA55, 0x9DC6,
    0xEA56, 0x9DCF,
    0xEA59, 0x9DD3,
    0xEA58, 0x9DD9,
    0xEA5B, 0x9DE6,
    0xEA5C, 0x9DED,
    0xEA5D, 0x9DEF,
    0x9868, 0x9DF2,
    0xEA5A, 0x9DF8,
    0x91E9, 0x9DF9,
    0x8DEB, 0x9DFA,
    0xEA5E, 0x9DFD,
    0xEA5F, 0x9E1A,
    0xEA60, 0x9E1B,
    0xEA61, 0x9E1E,
    0xEA62, 0x9E75,
    0x8CB2, 0x9E78,
    0xEA63, 0x9E79,
    0xEA64, 0x9E7D,
    0x8EAD, 0x9E7F,
    0xEA65, 0x9E81,
    0xEA66, 0x9E88,
    0xEA67, 0x9E8B,
    0xEA68, 0x9E8C,
    0xEA6B, 0x9E91,
    0xEA69, 0x9E92,
    0x985B, 0x9E93,
    0xEA6A, 0x9E95,
    0x97ED, 0x9E97,
    0xEA6C, 0x9E9D,
    0x97D9, 0x9E9F,
    0xEA6D, 0x9EA5,
    0x949E, 0x9EA6,
    0xEA6E, 0x9EA9,
    0xEA70, 0x9EAA,
    0xEA71, 0x9EAD,
    0xEA6F, 0x9EB8,
    0x8D8D, 0x9EB9,
    0x96CB, 0x9EBA,
    0x9683, 0x9EBB,
    0x9BF5, 0x9EBC,
    0x9F80, 0x9EBE,
    0x969B, 0x9EBF,
    0x89A9, 0x9EC4,
    0xEA73, 0x9ECC,
    0x8B6F, 0x9ECD,
    0xEA74, 0x9ECE,
    0xEA75, 0x9ECF,
    0xEA76, 0x9ED0,
    0x8D95, 0x9ED2,
    0xEA77, 0x9ED4,
    0xE0D2, 0x9ED8,
    0x96D9, 0x9ED9,
    0x91E1, 0x9EDB,
    0xEA78, 0x9EDC,
    0xEA7A, 0x9EDD,
    0xEA79, 0x9EDE,
    0xEA7B, 0x9EE0,
    0xEA7C, 0x9EE5,
    0xEA7D, 0x9EE8,
    0xEA7E, 0x9EEF,
    0xEA80, 0x9EF4,
    0xEA81, 0x9EF6,
    0xEA82, 0x9EF7,
    0xEA83, 0x9EF9,
    0xEA84, 0x9EFB,
    0xEA85, 0x9EFC,
    0xEA86, 0x9EFD,
    0xEA87, 0x9F07,
    0xEA88, 0x9F08,
    0x9343, 0x9F0E,
    0x8CDB, 0x9F13,
    0xEA8A, 0x9F15,
    0x916C, 0x9F20,
    0xEA8B, 0x9F21,
    0xEA8C, 0x9F2C,
    0x9540, 0x9F3B,
    0xEA8D, 0x9F3E,
    0xEA8E, 0x9F4A,
    0xE256, 0x9F4B,
    0xE6D8, 0x9F4E,
    0xE8EB, 0x9F4F,
    0xEA8F, 0x9F52,
    0xEA90, 0x9F54,
    0xEA92, 0x9F5F,
    0xEA93, 0x9F60,
    0xEA94, 0x9F61,
    0x97EE, 0x9F62,
    0xEA91, 0x9F63,
    0xEA95, 0x9F66,
    0xEA96, 0x9F67,
    0xEA98, 0x9F6A,
    0xEA97, 0x9F6C,
    0xEA9A, 0x9F72,
    0xEA9B, 0x9F76,
    0xEA99, 0x9F77,
    0x97B4, 0x9F8D,
    0xEA9C, 0x9F95,
    0xEA9D, 0x9F9C,
    0xE273, 0x9F9D,
    0xEA9E, 0x9FA0,
    0x8149, 0xFF01,
    0x8194, 0xFF03,
    0x8190, 0xFF04,
    0x8193, 0xFF05,
    0x8195, 0xFF06,
    0x8169, 0xFF08,
    0x816A, 0xFF09,
    0x8196, 0xFF0A,
    0x817B, 0xFF0B,
    0x8143, 0xFF0C,
    0x8144, 0xFF0E,
    0x815E, 0xFF0F,
    0x824F, 0xFF10,
    0x8250, 0xFF11,
    0x8251, 0xFF12,
    0x8252, 0xFF13,
    0x8253, 0xFF14,
    0x8254, 0xFF15,
    0x8255, 0xFF16,
    0x8256, 0xFF17,
    0x8257, 0xFF18,
    0x8258, 0xFF19,
    0x8146, 0xFF1A,
    0x8147, 0xFF1B,
    0x8183, 0xFF1C,
    0x8181, 0xFF1D,
    0x8184, 0xFF1E,
    0x8148, 0xFF1F,
    0x8197, 0xFF20,
    0x8260, 0xFF21,
    0x8261, 0xFF22,
    0x8262, 0xFF23,
    0x8263, 0xFF24,
    0x8264, 0xFF25,
    0x8265, 0xFF26,
    0x8266, 0xFF27,
    0x8267, 0xFF28,
    0x8268, 0xFF29,
    0x8269, 0xFF2A,
    0x826A, 0xFF2B,
    0x826B, 0xFF2C,
    0x826C, 0xFF2D,
    0x826D, 0xFF2E,
    0x826E, 0xFF2F,
    0x826F, 0xFF30,
    0x8270, 0xFF31,
    0x8271, 0xFF32,
    0x8272, 0xFF33,
    0x8273, 0xFF34,
    0x8274, 0xFF35,
    0x8275, 0xFF36,
    0x8276, 0xFF37,
    0x8277, 0xFF38,
    0x8278, 0xFF39,
    0x8279, 0xFF3A,
    0x816D, 0xFF3B,
    0x816E, 0xFF3D,
    0x814F, 0xFF3E,
    0x8151, 0xFF3F,
    0x814D, 0xFF40,
    0x8281, 0xFF41,
    0x8282, 0xFF42,
    0x8283, 0xFF43,
    0x8284, 0xFF44,
    0x8285, 0xFF45,
    0x8286, 0xFF46,
    0x8287, 0xFF47,
    0x8288, 0xFF48,
    0x8289, 0xFF49,
    0x828A, 0xFF4A,
    0x828B, 0xFF4B,
    0x828C, 0xFF4C,
    0x828D, 0xFF4D,
    0x828E, 0xFF4E,
    0x828F, 0xFF4F,
    0x8290, 0xFF50,
    0x8291, 0xFF51,
    0x8292, 0xFF52,
    0x8293, 0xFF53,
    0x8294, 0xFF54,
    0x8295, 0xFF55,
    0x8296, 0xFF56,
    0x8297, 0xFF57,
    0x8298, 0xFF58,
    0x8299, 0xFF59,
    0x829A, 0xFF5A,
    0x816F, 0xFF5B,
    0x8162, 0xFF5C,
    0x8170, 0xFF5D,
    0x00A1, 0xFF61,
    0x00A2, 0xFF62,
    0x00A3, 0xFF63,
    0x00A4, 0xFF64,
    0x00A5, 0xFF65,
    0x00A6, 0xFF66,
    0x00A7, 0xFF67,
    0x00A8, 0xFF68,
    0x00A9, 0xFF69,
    0x00AA, 0xFF6A,
    0x00AB, 0xFF6B,
    0x00AC, 0xFF6C,
    0x00AD, 0xFF6D,
    0x00AE, 0xFF6E,
    0x00AF, 0xFF6F,
    0x00B0, 0xFF70,
    0x00B1, 0xFF71,
    0x00B2, 0xFF72,
    0x00B3, 0xFF73,
    0x00B4, 0xFF74,
    0x00B5, 0xFF75,
    0x00B6, 0xFF76,
    0x00B7, 0xFF77,
    0x00B8, 0xFF78,
    0x00B9, 0xFF79,
    0x00BA, 0xFF7A,
    0x00BB, 0xFF7B,
    0x00BC, 0xFF7C,
    0x00BD, 0xFF7D,
    0x00BE, 0xFF7E,
    0x00BF, 0xFF7F,
    0x00C0, 0xFF80,
    0x00C1, 0xFF81,
    0x00C2, 0xFF82,
    0x00C3, 0xFF83,
    0x00C4, 0xFF84,
    0x00C5, 0xFF85,
    0x00C6, 0xFF86,
    0x00C7, 0xFF87,
    0x00C8, 0xFF88,
    0x00C9, 0xFF89,
    0x00CA, 0xFF8A,
    0x00CB, 0xFF8B,
    0x00CC, 0xFF8C,
    0x00CD, 0xFF8D,
    0x00CE, 0xFF8E,
    0x00CF, 0xFF8F,
    0x00D0, 0xFF90,
    0x00D1, 0xFF91,
    0x00D2, 0xFF92,
    0x00D3, 0xFF93,
    0x00D4, 0xFF94,
    0x00D5, 0xFF95,
    0x00D6, 0xFF96,
    0x00D7, 0xFF97,
    0x00D8, 0xFF98,
    0x00D9, 0xFF99,
    0x00DA, 0xFF9A,
    0x00DB, 0xFF9B,
    0x00DC, 0xFF9C,
    0x00DD, 0xFF9D,
    0x00DE, 0xFF9E,
    0x00DF, 0xFF9F,
    0x8150, 0xFFE3,
    0x818F, 0xFFE5,
};

static const unsigned int test_sjis_tab_ind[] = {
0,
440,
440,
656,
1054,
1466,
4228,
7042,
9404,
11812,
13766,
13766,
13766,
13766,
13766,
13766,
};
Added jni/zint/backend/tests/test_upcean.c.


















































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

static void test_upce_length(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int ret;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { BARCODE_UPCE, "12345", 0 },
        /* 1*/ { BARCODE_UPCE_CHK, "12345", ZINT_ERROR_INVALID_CHECK },
        /* 2*/ { BARCODE_UPCE_CHK, "12344", 0 }, // 4 is correct check digit
        /* 3*/ { BARCODE_UPCE, "123456", 0 },
        /* 4*/ { BARCODE_UPCE_CHK, "123456", ZINT_ERROR_INVALID_CHECK },
        /* 5*/ { BARCODE_UPCE_CHK, "123457", 0 }, // 7 is correct check digit
        /* 6*/ { BARCODE_UPCE, "1234567", 0 },
        /* 7*/ { BARCODE_UPCE_CHK, "1234567", ZINT_ERROR_INVALID_CHECK },
        /* 8*/ { BARCODE_UPCE_CHK, "1234565", 0 }, // 5 is correct check digit
        /* 9*/ { BARCODE_UPCE, "12345678", ZINT_ERROR_TOO_LONG },
        /*10*/ { BARCODE_UPCE_CHK, "12345678", ZINT_ERROR_INVALID_CHECK },
        /*11*/ { BARCODE_UPCE_CHK, "12345670", 0 }, // 0 is correct check digit
        /*12*/ { BARCODE_UPCE, "123456789", ZINT_ERROR_TOO_LONG },
        /*13*/ { BARCODE_UPCE_CHK, "123456789", ZINT_ERROR_TOO_LONG },
        /*14*/ { BARCODE_UPCE, "123406", ZINT_ERROR_INVALID_DATA }, // If last digit (emode) 6, 2nd last can't be zero
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

// Note requires ZINT_SANITIZE to be set
static void test_upca_print(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int ret;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%3d*\/", line(".") - line("'<"))
    struct item data[] = {
        /*  0*/ { BARCODE_UPCA, "01234567890", 0 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret, "i:%d ret %d != %d\n", i, ret, data[i].ret);

        strcpy(symbol->outfile, "out.gif");
        ret = ZBarcode_Print(symbol, 0);
        assert_zero(ret, "i:%d %s ZBarcode_Print %s ret %d != 0\n", i, testUtilBarcodeName(data[i].symbology), symbol->outfile, ret);

        assert_zero(remove(symbol->outfile), "i:%d remove(%s) != 0\n", i, symbol->outfile);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_isbn(void)
{
    testStart("");

    int ret;
    struct item {
        unsigned char* data;
        int ret_encode;
        int ret_vector;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { "0", 0, 0 }, // Left zero-padded if < 10 chars
        /* 1*/ { "12345678", ZINT_ERROR_INVALID_CHECK, -1 },
        /* 2*/ { "12345679", 0, 0 }, // 9 is correct check digit
        /* 3*/ { "123456789", 0, 0 },
        /* 4*/ { "0123456789", 0, 0 },
        /* 5*/ { "1234567890", ZINT_ERROR_INVALID_CHECK, -1 },
        /* 6*/ { "123456789X", 0, 0 }, // X is correct check digit
        /* 7*/ { "8175257660", 0, 0 }, // 0 is correct check digit
        /* 8*/ { "0590764845", 0, 0 }, // 5 is correct check digit
        /* 9*/ { "0906495741", 0, 0 }, // 1 is correct check digit
        /*10*/ { "0140430016", 0, 0 }, // 6 is correct check digit
        /*11*/ { "0571086187", 0, 0 }, // 7 is correct check digit
        /*12*/ { "0486600882", 0, 0 }, // 2 is correct check digit
        /*13*/ { "12345678901", ZINT_ERROR_TOO_LONG, -1 },
        /*14*/ { "123456789012", ZINT_ERROR_TOO_LONG, -1 },
        /*15*/ { "1234567890123", ZINT_ERROR_INVALID_DATA, -1 },
        /*16*/ { "9784567890120", 0, 0 }, // 0 is correct check digit
        /*17*/ { "9783161484100", 0, 0 }, // 0 is correct check digit
        /*18*/ { "9781846688225", 0, 0 }, // 5 is correct check digit
        /*19*/ { "9781847657954", 0, 0 }, // 4 is correct check digit
        /*20*/ { "9781846688188", 0, 0 }, // 8 is correct check digit
        /*21*/ { "9781847659293", 0, 0 }, // 3 is correct check digit
        /*22*/ { "97845678901201", ZINT_ERROR_TOO_LONG, -1 },
        /*23*/ { "3954994+12", 0, 0 },
        /*24*/ { "3954994+12345", 0, 0 },
        /*25*/ { "3954994+123456", ZINT_ERROR_TOO_LONG, -1 },
        /*26*/ { "3954994+", 0, 0 },
        /*27*/ { "61954993+1", 0, 0 },
        /*28*/ { "61954993+123", 0, 0 },
        /*29*/ { "361954999+12", 0, 0 },
        /*30*/ { "361954999+1234", 0, 0 },
        /*31*/ { "361954999+12", 0, 0 },
        /*32*/ { "199900003X+12", 0, 0 },
        /*33*/ { "199900003X+12345", 0, 0 },
        /*34*/ { "9791234567896+12", 0, 0 },
        /*35*/ { "9791234567896+12345", 0, 0 },
        /*36*/ { "9791234567896+", 0, 0 },
        /*37*/ { "97912345678961+", ZINT_ERROR_TOO_LONG, -1 },
        /*38*/ { "97912345678961+12345", ZINT_ERROR_TOO_LONG, -1 },
        /*39*/ { "9791234567896+123456", ZINT_ERROR_TOO_LONG, -1 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = BARCODE_ISBNX;
        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d, errtxt %s\n", i, ret, data[i].ret_encode, symbol->errtxt);

        if (data[i].ret_vector != -1) {
            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);
        }

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

static void test_vector_same(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int ret_encode;
        int ret_vector;
    };
    struct item data[] = {
        /* 0*/ { BARCODE_UPCE, "123456", 0, 0 },
        /* 1*/ { BARCODE_UPCE_CHK, "1234565", 0, 0 }, // 5 is correct check digit
        /* 2*/ { BARCODE_ISBNX, "0195049969", 0, 0 }, // 9 is correct check digit
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_vector* vectors[4];
        int vectors_size = sizeof(vectors) / sizeof(struct zint_vector*);

        for (int j = 0; j < vectors_size; j++) {
            struct zint_symbol* symbol = ZBarcode_Create();
            assert_nonnull(symbol, "Symbol not created\n");

            symbol->symbology = data[i].symbology;
            int length = strlen(data[i].data);

            ret = ZBarcode_Encode(symbol, data[i].data, length);
            assert_equal(ret, data[i].ret_encode, "i:%d ZBarcode_Encode ret %d != %d\n", i, ret, data[i].ret_encode);

            ret = ZBarcode_Buffer_Vector(symbol, 0);
            assert_equal(ret, data[i].ret_vector, "i:%d ZBarcode_Buffer_Vector ret %d != %d\n", i, ret, data[i].ret_vector);

            assert_nonnull(symbol->vector, "i:%d symbol->vector NULL\n", i);
            vectors[j] = testUtilVectorCpy(symbol->vector);

            ZBarcode_Delete(symbol);
        }

        for (int j = 1; j < vectors_size; j++) {
            ret = testUtilVectorCmp(vectors[j - 1], vectors[j]);
            assert_zero(ret, "i:%d testUtilVectorCmp ret %d != 0\n", i, ret);
        }

        for (int j = 0; j < vectors_size; j++) {
            struct zint_symbol symbol_vector;
            symbol_vector.vector = vectors[j];
            vector_free(&symbol_vector);
        }
    }

    testFinish();
}

int main()
{
    test_upce_length();
    test_upca_print();
    test_isbn();
    test_vector_same();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/test_vector.c.




























































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include "testcommon.h"

//#define TEST_BUFFER_VECTOR_GENERATE_EXPECTED 1

static void test_buffer_vector(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        char* composite;

        int expected_height;
        int expected_rows;
        int expected_width;
        float expected_vector_width;
        float expected_vector_height;
    };
    struct item data[] = {
        /*  0*/ { BARCODE_CODE11, "0000000000", "", 50, 1, 99, 198.0, 118.0 },
        /*  1*/ { BARCODE_C25MATRIX, "0000000000", "", 50, 1, 117, 234.0, 118.0 },
        /*  2*/ { BARCODE_C25INTER, "0000000000", "", 50, 1, 99, 198.0, 118.0 },
        /*  3*/ { BARCODE_C25IATA, "0000000000", "", 50, 1, 149, 298.0, 118.0 },
        /*  4*/ { BARCODE_C25LOGIC, "0000000000", "", 50, 1, 109, 218.0, 118.0 },
        /*  5*/ { BARCODE_C25IND, "0000000000", "", 50, 1, 159, 318.0, 118.0 },
        /*  6*/ { BARCODE_CODE39, "0000000000", "", 50, 1, 155, 310.0, 118.0 },
        /*  7*/ { BARCODE_EXCODE39, "0000000000", "", 50, 1, 155, 310.0, 118.0 },
        /*  8*/ { BARCODE_EANX, "123456789012", "", 50, 1, 95, 230.0, 118.0 },
        /*  9*/ { BARCODE_EANX_CHK, "1234567890128", "", 50, 1, 95, 230.0, 118.0 },
        /* 10*/ { BARCODE_EAN128, "[01]12345678901234", "", 50, 1, 134, 268.0, 118.0 },
        /* 11*/ { BARCODE_CODABAR, "A00000000B", "", 50, 1, 102, 204.0, 118.0 },
        /* 12*/ { BARCODE_CODE128, "0000000000", "", 50, 1, 90, 180.0, 118.0 },
        /* 13*/ { BARCODE_DPLEIT, "1234567890123", "", 50, 1, 135, 270.0, 118.0 },
        /* 14*/ { BARCODE_DPIDENT, "12345678901", "", 50, 1, 117, 234.0, 118.0 },
        /* 15*/ { BARCODE_CODE16K, "0000000000", "", 20, 2, 70, 212.0, 48.0 },
        /* 16*/ { BARCODE_CODE49, "0000000000", "", 20, 2, 70, 188.0, 48.0 },
        /* 17*/ { BARCODE_CODE93, "0000000000", "", 50, 1, 127, 254.0, 118.0 },
        /* 18*/ { BARCODE_FLAT, "1234567890", "", 50, 1, 90, 180.0, 100.0 },
        /* 19*/ { BARCODE_RSS14, "1234567890123", "", 50, 1, 96, 192.0, 118.0 },
        /* 20*/ { BARCODE_RSS_LTD, "1234567890123", "", 50, 1, 74, 148.0, 118.0 },
        /* 21*/ { BARCODE_RSS_EXP, "[01]12345678901234", "", 34, 1, 134, 268.0, 86.0 },
        /* 22*/ { BARCODE_TELEPEN, "0000000000", "", 50, 1, 208, 416.0, 118.0 },
        /* 23*/ { BARCODE_UPCA, "12345678904", "", 50, 1, 95, 230.0, 118.0 },
        /* 24*/ { BARCODE_UPCA_CHK, "12345678905", "", 50, 1, 95, 230.0, 118.0 },
        /* 25*/ { BARCODE_UPCE, "1234567", "", 50, 1, 51, 142.0, 118.0 },
        /* 26*/ { BARCODE_UPCE_CHK, "12345670", "", 50, 1, 51, 142.0, 118.0 },
        /* 27*/ { BARCODE_POSTNET, "00000000000", "", 12, 2, 185, 370.0, 24.0 },
        /* 28*/ { BARCODE_MSI_PLESSEY, "0000000000", "", 50, 1, 127, 254.0, 118.0 },
        /* 29*/ { BARCODE_FIM, "A", "", 50, 1, 17, 34.0, 100.0 },
        /* 30*/ { BARCODE_LOGMARS, "0000000000", "", 50, 1, 207, 414.0, 118.0 },
        /* 31*/ { BARCODE_PHARMA, "123456", "", 50, 1, 58, 116.0, 100.0 },
        /* 32*/ { BARCODE_PZN, "123456", "", 50, 1, 142, 284.0, 118.0 },
        /* 33*/ { BARCODE_PHARMA_TWO, "12345678", "", 10, 2, 29, 58.0, 20.0 },
        /* 34*/ { BARCODE_PDF417, "0000000000", "", 21, 7, 103, 206.0, 42.0 },
        /* 35*/ { BARCODE_PDF417TRUNC, "0000000000", "", 21, 7, 68, 136.0, 42.0 },
        /* 36*/ { BARCODE_MAXICODE, "0000000000", "", 165, 33, 30, 74.0, 72.0 },
        /* 37*/ { BARCODE_QRCODE, "1234567890AB", "", 21, 21, 21, 42.0, 42.0 },
        /* 38*/ { BARCODE_CODE128B, "0000000000", "", 50, 1, 145, 290.0, 118.0 },
        /* 39*/ { BARCODE_AUSPOST, "12345678901234567890123", "", 8, 3, 133, 266.0, 16.0 },
        /* 40*/ { BARCODE_AUSREPLY, "12345678", "", 8, 3, 73, 146.0, 16.0 },
        /* 41*/ { BARCODE_AUSROUTE, "12345678", "", 8, 3, 73, 146.0, 16.0 },
        /* 42*/ { BARCODE_AUSREDIRECT, "12345678", "", 8, 3, 73, 146.0, 16.0 },
        /* 43*/ { BARCODE_ISBNX, "123456789", "", 50, 1, 95, 230.0, 118.0 },
        /* 44*/ { BARCODE_RM4SCC, "0000000000", "", 8, 3, 91, 182.0, 16.0 },
        /* 45*/ { BARCODE_DATAMATRIX, "ABC", "", 10, 10, 10, 20.0, 20.0 },
        /* 46*/ { BARCODE_EAN14, "1234567890123", "", 50, 1, 134, 268.0, 118.0 },
        /* 47*/ { BARCODE_VIN, "00000000000000000", "", 50, 1, 246, 492.0, 118.0 },
        /* 48*/ { BARCODE_CODABLOCKF, "0000000000", "", 10, 1, 90, 188.0, 28.0 },
        /* 49*/ { BARCODE_NVE18, "12345678901234567", "", 50, 1, 156, 312.0, 118.0 },
        /* 50*/ { BARCODE_JAPANPOST, "0000000000", "", 8, 3, 133, 266.0, 16.0 },
        /* 51*/ { BARCODE_KOREAPOST, "123456", "", 50, 1, 167, 334.0, 118.0 },
        /* 52*/ { BARCODE_RSS14STACK, "0000000000000", "", 13, 3, 50, 100.0, 26.0 },
        /* 53*/ { BARCODE_RSS14STACK_OMNI, "0000000000000", "", 69, 5, 50, 100.0, 138.0 },
        /* 54*/ { BARCODE_RSS_EXPSTACK, "[01]12345678901234", "", 71, 5, 102, 204.0, 142.0 },
        /* 55*/ { BARCODE_PLANET, "00000000000", "", 12, 2, 185, 370.0, 24.0 },
        /* 56*/ { BARCODE_MICROPDF417, "0000000000", "", 12, 6, 82, 164.0, 24.0 },
        /* 57*/ { BARCODE_ONECODE, "12345678901234567890", "", 8, 3, 129, 258.0, 16.0 },
        /* 58*/ { BARCODE_PLESSEY, "0000000000", "", 50, 1, 227, 454.0, 118.0 },
        /* 59*/ { BARCODE_TELEPEN_NUM, "0000000000", "", 50, 1, 128, 256.0, 118.0 },
        /* 60*/ { BARCODE_ITF14, "0000000000", "", 50, 1, 135, 382.0, 150.0 },
        /* 61*/ { BARCODE_KIX, "123456ABCDE", "", 8, 3, 87, 174.0, 16.0 },
        /* 62*/ { BARCODE_AZTEC, "1234567890AB", "", 15, 15, 15, 30.0, 30.0 },
        /* 63*/ { BARCODE_DAFT, "DAFTDAFTDAFTDAFT", "", 8, 3, 31, 62.0, 16.0 },
        /* 64*/ { BARCODE_MICROQR, "12345", "", 11, 11, 11, 22.0, 22.0 },
        /* 65*/ { BARCODE_HIBC_128, "0000000000", "", 50, 1, 134, 268.0, 118.0 },
        /* 66*/ { BARCODE_HIBC_39, "0000000000", "", 50, 1, 223, 446.0, 118.0 },
        /* 67*/ { BARCODE_HIBC_DM, "ABC", "", 12, 12, 12, 24.0, 24.0 },
        /* 68*/ { BARCODE_HIBC_QR, "1234567890AB", "", 21, 21, 21, 42.0, 42.0 },
        /* 69*/ { BARCODE_HIBC_PDF, "0000000000", "", 27, 9, 103, 206.0, 54.0 },
        /* 70*/ { BARCODE_HIBC_MICPDF, "0000000000", "", 34, 17, 38, 76.0, 68.0 },
        /* 71*/ { BARCODE_HIBC_BLOCKF, "0000000000", "", 40, 4, 90, 188.0, 88.0 },
        /* 72*/ { BARCODE_HIBC_AZTEC, "1234567890AB", "", 19, 19, 19, 38.0, 38.0 },
        /* 73*/ { BARCODE_DOTCODE, "ABC", "", 11, 11, 16, 32.0, 22.0 },
        /* 74*/ { BARCODE_HANXIN, "1234567890AB", "", 23, 23, 23, 46.0, 46.0 },
        /* 75*/ { BARCODE_MAILMARK, "01000000000000000AA00AA0A", "", 10, 3, 155, 310.0, 20.0 },
        /* 76*/ { BARCODE_AZRUNE, "255", "", 11, 11, 11, 22.0, 22.0 },
        /* 77*/ { BARCODE_CODE32, "12345678", "", 50, 1, 103, 206.0, 118.0 },
        /* 78*/ { BARCODE_EANX_CC, "123456789012", "[20]01", 50, 7, 99, 238.0, 118.0 },
        /* 79*/ { BARCODE_EAN128_CC, "[01]12345678901234", "[20]01", 50, 5, 145, 290.0, 118.0 },
        /* 80*/ { BARCODE_RSS14_CC, "1234567890123", "[20]01", 21, 5, 100, 200.0, 60.0 },
        /* 81*/ { BARCODE_RSS_LTD_CC, "1234567890123", "[20]01", 19, 6, 74, 148.0, 56.0 },
        /* 82*/ { BARCODE_RSS_EXP_CC, "[01]12345678901234", "[20]01", 41, 5, 134, 268.0, 100.0 },
        /* 83*/ { BARCODE_UPCA_CC, "12345678901", "[20]01", 50, 7, 99, 238.0, 118.0 },
        /* 84*/ { BARCODE_UPCE_CC, "1234567", "[20]01", 50, 9, 55, 150.0, 118.0 },
        /* 85*/ { BARCODE_RSS14STACK_CC, "0000000000000", "[20]01", 24, 9, 56, 112.0, 48.0 },
        /* 86*/ { BARCODE_RSS14_OMNI_CC, "0000000000000", "[20]01", 80, 11, 56, 112.0, 160.0 },
        /* 87*/ { BARCODE_RSS_EXPSTACK_CC, "[01]12345678901234", "[20]01", 78, 9, 102, 204.0, 156.0 },
        /* 88*/ { BARCODE_CHANNEL, "00", "", 50, 1, 19, 38.0, 118.0 },
        /* 89*/ { BARCODE_CODEONE, "12345678901234567890", "", 22, 22, 22, 44.0, 44.0 },
        /* 90*/ { BARCODE_GRIDMATRIX, "ABC", "", 18, 18, 18, 36.0, 36.0 },
        /* 91*/ { BARCODE_UPNQR, "1234567890AB", "", 77, 77, 77, 154.0, 154.0 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    char* text;

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->input_mode = UNICODE_MODE;

        if (strlen(data[i].composite)) {
            text = data[i].composite;
            strcpy(symbol->primary, data[i].data);
        } else {
            text = data[i].data;
        }
        int length = strlen(text);

        ret = ZBarcode_Encode(symbol, text, length);
        assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt);

        ret = ZBarcode_Buffer_Vector(symbol, 0);
        assert_zero(ret, "i:%d ZBarcode_Buffer_Vector(%d) ret %d != 0\n", i, data[i].symbology, ret);
        assert_nonnull(symbol->vector, "i:%d ZBarcode_Buffer_Vector(%d) vector NULL\n", i, data[i].symbology);

        #ifdef TEST_BUFFER_VECTOR_GENERATE_EXPECTED
        printf("        /*%3d*/ { %s, \"%s\", \"%s\", %d, %d, %d, %.1f, %.1f },\n",
                i, testUtilBarcodeName(data[i].symbology), data[i].data, data[i].composite,
                symbol->height, symbol->rows, symbol->width, symbol->vector->width, symbol->vector->height);

        #else

        assert_equal(symbol->height, data[i].expected_height, "i:%d (%s) symbol->height %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->height, data[i].expected_height);
        assert_equal(symbol->rows, data[i].expected_rows, "i:%d (%s) symbol->rows %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->rows, data[i].expected_rows);
        assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width);
        assert_equal(symbol->vector->width, data[i].expected_vector_width, "i:%d (%s) symbol->vector->width %f != %f\n",
            i, testUtilBarcodeName(data[i].symbology), symbol->vector->width, data[i].expected_vector_width);
        assert_equal(symbol->vector->height, data[i].expected_vector_height, "i:%d (%s) symbol->vector->height %f != %f\n",
            i, testUtilBarcodeName(data[i].symbology), symbol->vector->height, data[i].expected_vector_height);

        #endif

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

// Checks that symbol lead-in (composite offset) isn't used to calc string position for non-composite barcodes
static void test_noncomposite_string_x(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;

        int expected_width;
        float expected_string_x;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { BARCODE_RSS14, "1234567890123", 96, 96 },
        /* 1*/ { BARCODE_RSS_LTD, "1234567890123", 74, 74 },
        /* 2*/ { BARCODE_RSS_EXP, "[01]12345678901234", 134, 134 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->input_mode = UNICODE_MODE;

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt);

        ret = ZBarcode_Buffer_Vector(symbol, 0);
        assert_zero(ret, "i:%d ZBarcode_Buffer_Vector(%d) ret %d != 0\n", i, data[i].symbology, ret);
        assert_nonnull(symbol->vector, "i:%d ZBarcode_Buffer_Vector(%d) vector NULL\n", i, data[i].symbology);

        assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width);
        assert_nonnull(symbol->vector->strings, "i:%d ZBarcode_Buffer_Vector(%d) vector->strings NULL\n", i, data[i].symbology);
        assert_equal(symbol->vector->strings->x, data[i].expected_string_x,
            "i:%d (%s) symbol->vector->strings->x %f != %f\n", i, testUtilBarcodeName(data[i].symbology), symbol->vector->strings->x, data[i].expected_string_x);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

// Checks UPCA/UPCE main_symbol_width_x (used for addon formatting) set whether whitespace width set or not
static void test_upcean_whitespace_width(void)
{
    testStart("");

    int ret;
    struct item {
        int symbology;
        unsigned char* data;
        int whitespace_width;

        int expected_width;
        float expected_vector_width;
        int expected_string_cnt;
        float expected_string_y;
    };
    // s/\/\*[ 0-9]*\*\//\=printf("\/*%2d*\/", line(".") - line("'<"))
    struct item data[] = {
        /* 0*/ { BARCODE_UPCA, "12345678904+12345", 0, 151, 342.0, 5, 16.0 },
        /* 1*/ { BARCODE_UPCA, "12345678904+12345", 11, 151, 342.0 + 4 * (11 - 10), 5, 16.0 },
        /* 2*/ { BARCODE_UPCE, "1234567+12", 0, 80, 200.0, 4, 16.0 },
        /* 3*/ { BARCODE_UPCE, "1234567+12", 8, 80, 200.0 + 4 * (8 - 10), 4, 16.0 }, // Note: change from previous behaviour where if whitespace < 10 then set to 10
    };
    int data_size = sizeof(data) / sizeof(struct item);

    struct zint_vector_string* string;
    int string_cnt;

    for (int i = 0; i < data_size; i++) {

        struct zint_symbol* symbol = ZBarcode_Create();
        assert_nonnull(symbol, "Symbol not created\n");

        symbol->symbology = data[i].symbology;
        symbol->input_mode = UNICODE_MODE;
        symbol->whitespace_width = data[i].whitespace_width;

        int length = strlen(data[i].data);

        ret = ZBarcode_Encode(symbol, data[i].data, length);
        assert_zero(ret, "i:%d ZBarcode_Encode(%d) ret %d != 0 %s\n", i, data[i].symbology, ret, symbol->errtxt);

        ret = ZBarcode_Buffer_Vector(symbol, 0);
        assert_zero(ret, "i:%d ZBarcode_Buffer_Vector(%d) ret %d != 0\n", i, data[i].symbology, ret);
        assert_nonnull(symbol->vector, "i:%d ZBarcode_Buffer_Vector(%d) vector NULL\n", i, data[i].symbology);

        assert_equal(symbol->width, data[i].expected_width, "i:%d (%s) symbol->width %d != %d\n", i, testUtilBarcodeName(data[i].symbology), symbol->width, data[i].expected_width);
        assert_equal(symbol->vector->width, data[i].expected_vector_width, "i:%d (%s) symbol->vector->width %f != %f\n",
            i, testUtilBarcodeName(data[i].symbology), symbol->vector->width, data[i].expected_vector_width);

        assert_nonnull(symbol->vector->strings, "i:%d ZBarcode_Buffer_Vector(%d) vector->strings NULL\n", i, data[i].symbology);
        // Get add-on string (last)
        for (string = symbol->vector->strings, string_cnt = 1; string->next; string_cnt++) {
            string = string->next;
        }
        assert_equal(string_cnt, data[i].expected_string_cnt, "i:%d (%s) string_cnt %d != %d\n", i, testUtilBarcodeName(data[i].symbology), string_cnt, data[i].expected_string_cnt);
        assert_equal(string->y, data[i].expected_string_y, "i:%d (%s) string->y %f != %f\n", i, testUtilBarcodeName(data[i].symbology), string->y, data[i].expected_string_y);

        ZBarcode_Delete(symbol);
    }

    testFinish();
}

int main()
{
    test_buffer_vector();
    test_noncomposite_string_x();
    test_upcean_whitespace_width();

    testReport();

    return 0;
}
Added jni/zint/backend/tests/testcommon.c.
































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */
/*
 * Adapted from qrencode/tests/common.c
 * Copyright (C) 2006-2017 Kentaro Fukuchi <kentaro@fukuchi.org>
 */

#include <stdio.h>
#include <string.h>
#include "testcommon.h"
#ifndef NO_PNG
#include <png.h>
#include <zlib.h>
#include <setjmp.h>
#endif

extern int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord);

static int tests = 0;
static int failed = 0;
int assertionFailed = 0;
int assertionNum = 0;
static const char *testName = NULL;
static const char *testFunc = NULL;

void testStartReal(const char *func, const char *name)
{
    tests++;
    testName = name;
    testFunc = func;
    assertionFailed = 0;
    assertionNum = 0;
    printf("_____%d: %s: %s...\n", tests, func, name);
}

void testEnd(int result)
{
    if (testName[0]) {
        printf(".....%d: %s: %s ", tests, testFunc, testName);
    } else {
        printf(".....%d: %s: ", tests, testFunc);
    }
    if (result) {
        puts("FAILED.");
        failed++;
    } else {
        puts("PASSED.");
    }
}

void testFinish(void)
{
    if (testName[0]) {
        printf(".....%d: %s: %s ", tests, testFunc, testName);
    } else {
        printf(".....%d: %s: ", tests, testFunc);
    }
    if (assertionFailed) {
        printf("FAILED. (%d assertions failed.)\n", assertionFailed);
        failed++;
    } else {
        printf("PASSED. (%d assertions passed.)\n", assertionNum);
    }
}

void testReport()
{
    if ( failed ) {
        printf("Total %d tests, %d fails.\n", tests, failed);
        exit(-1);
    } else {
        printf("Total %d tests, all passed.\n", tests);
    }
}

char* testUtilBarcodeName(int symbology) {
    struct item {
        int define;
        char* name;
        int val;
    };
    struct item data[] = {
        { -1, "", 0 },
        { BARCODE_CODE11, "BARCODE_CODE11", 1 },
        { BARCODE_C25MATRIX, "BARCODE_C25MATRIX", 2 },
        { BARCODE_C25INTER, "BARCODE_C25INTER", 3 },
        { BARCODE_C25IATA, "BARCODE_C25IATA", 4 },
        { -1, "", 5 },
        { BARCODE_C25LOGIC, "BARCODE_C25LOGIC", 6 },
        { BARCODE_C25IND, "BARCODE_C25IND", 7 },
        { BARCODE_CODE39, "BARCODE_CODE39", 8 },
        { BARCODE_EXCODE39, "BARCODE_EXCODE39", 9 },
        { -1, "", 10 },
        { -1, "", 11 },
        { -1, "", 12 },
        { BARCODE_EANX, "BARCODE_EANX", 13 },
        { BARCODE_EANX_CHK, "BARCODE_EANX_CHK", 14 },
        { -1, "", 15 },
        { BARCODE_EAN128, "BARCODE_EAN128", 16 },
        { -1, "", 17 },
        { BARCODE_CODABAR, "BARCODE_CODABAR", 18 },
        { -1, "", 19 },
        { BARCODE_CODE128, "BARCODE_CODE128", 20 },
        { BARCODE_DPLEIT, "BARCODE_DPLEIT", 21 },
        { BARCODE_DPIDENT, "BARCODE_DPIDENT", 22 },
        { BARCODE_CODE16K, "BARCODE_CODE16K", 23 },
        { BARCODE_CODE49, "BARCODE_CODE49", 24 },
        { BARCODE_CODE93, "BARCODE_CODE93", 25 },
        { -1, "", 26 },
        { -1, "", 27 },
        { BARCODE_FLAT, "BARCODE_FLAT", 28 },
        { BARCODE_RSS14, "BARCODE_RSS14", 29 },
        { BARCODE_RSS_LTD, "BARCODE_RSS_LTD", 30 },
        { BARCODE_RSS_EXP, "BARCODE_RSS_EXP", 31 },
        { BARCODE_TELEPEN, "BARCODE_TELEPEN", 32 },
        { -1, "", 33 },
        { BARCODE_UPCA, "BARCODE_UPCA", 34 },
        { BARCODE_UPCA_CHK, "BARCODE_UPCA_CHK", 35 },
        { -1, "", 36 },
        { BARCODE_UPCE, "BARCODE_UPCE", 37 },
        { BARCODE_UPCE_CHK, "BARCODE_UPCE_CHK", 38 },
        { -1, "", 39 },
        { BARCODE_POSTNET, "BARCODE_POSTNET", 40 },
        { -1, "", 41 },
        { -1, "", 42 },
        { -1, "", 43 },
        { -1, "", 44 },
        { -1, "", 45 },
        { -1, "", 46 },
        { BARCODE_MSI_PLESSEY, "BARCODE_MSI_PLESSEY", 47 },
        { -1, "", 48 },
        { BARCODE_FIM, "BARCODE_FIM", 49 },
        { BARCODE_LOGMARS, "BARCODE_LOGMARS", 50 },
        { BARCODE_PHARMA, "BARCODE_PHARMA", 51 },
        { BARCODE_PZN, "BARCODE_PZN", 52 },
        { BARCODE_PHARMA_TWO, "BARCODE_PHARMA_TWO", 53 },
        { -1, "", 54 },
        { BARCODE_PDF417, "BARCODE_PDF417", 55 },
        { BARCODE_PDF417TRUNC, "BARCODE_PDF417TRUNC", 56 },
        { BARCODE_MAXICODE, "BARCODE_MAXICODE", 57 },
        { BARCODE_QRCODE, "BARCODE_QRCODE", 58 },
        { -1, "", 59 },
        { BARCODE_CODE128B, "BARCODE_CODE128B", 60 },
        { -1, "", 61 },
        { -1, "", 62 },
        { BARCODE_AUSPOST, "BARCODE_AUSPOST", 63 },
        { -1, "", 64 },
        { -1, "", 65 },
        { BARCODE_AUSREPLY, "BARCODE_AUSREPLY", 66 },
        { BARCODE_AUSROUTE, "BARCODE_AUSROUTE", 67 },
        { BARCODE_AUSREDIRECT, "BARCODE_AUSREDIRECT", 68 },
        { BARCODE_ISBNX, "BARCODE_ISBNX", 69 },
        { BARCODE_RM4SCC, "BARCODE_RM4SCC", 70 },
        { BARCODE_DATAMATRIX, "BARCODE_DATAMATRIX", 71 },
        { BARCODE_EAN14, "BARCODE_EAN14", 72 },
        { BARCODE_VIN, "BARCODE_VIN", 73 },
        { BARCODE_CODABLOCKF, "BARCODE_CODABLOCKF", 74 },
        { BARCODE_NVE18, "BARCODE_NVE18", 75 },
        { BARCODE_JAPANPOST, "BARCODE_JAPANPOST", 76 },
        { BARCODE_KOREAPOST, "BARCODE_KOREAPOST", 77 },
        { -1, "", 78 },
        { BARCODE_RSS14STACK, "BARCODE_RSS14STACK", 79 },
        { BARCODE_RSS14STACK_OMNI, "BARCODE_RSS14STACK_OMNI", 80 },
        { BARCODE_RSS_EXPSTACK, "BARCODE_RSS_EXPSTACK", 81 },
        { BARCODE_PLANET, "BARCODE_PLANET", 82 },
        { -1, "", 83 },
        { BARCODE_MICROPDF417, "BARCODE_MICROPDF417", 84 },
        { BARCODE_ONECODE, "BARCODE_ONECODE", 85 },
        { BARCODE_PLESSEY, "BARCODE_PLESSEY", 86 },
        { BARCODE_TELEPEN_NUM, "BARCODE_TELEPEN_NUM", 87 },
        { -1, "", 88 },
        { BARCODE_ITF14, "BARCODE_ITF14", 89 },
        { BARCODE_KIX, "BARCODE_KIX", 90 },
        { -1, "", 91 },
        { BARCODE_AZTEC, "BARCODE_AZTEC", 92 },
        { BARCODE_DAFT, "BARCODE_DAFT", 93 },
        { -1, "", 94 },
        { -1, "", 95 },
        { -1, "", 96 },
        { BARCODE_MICROQR, "BARCODE_MICROQR", 97 },
        { BARCODE_HIBC_128, "BARCODE_HIBC_128", 98 },
        { BARCODE_HIBC_39, "BARCODE_HIBC_39", 99 },
        { -1, "", 100 },
        { -1, "", 101 },
        { BARCODE_HIBC_DM, "BARCODE_HIBC_DM", 102 },
        { -1, "", 103 },
        { BARCODE_HIBC_QR, "BARCODE_HIBC_QR", 104 },
        { -1, "", 105 },
        { BARCODE_HIBC_PDF, "BARCODE_HIBC_PDF", 106 },
        { -1, "", 107 },
        { BARCODE_HIBC_MICPDF, "BARCODE_HIBC_MICPDF", 108 },
        { -1, "", 109 },
        { BARCODE_HIBC_BLOCKF, "BARCODE_HIBC_BLOCKF", 110 },
        { -1, "", 111 },
        { BARCODE_HIBC_AZTEC, "BARCODE_HIBC_AZTEC", 112 },
        { -1, "", 113 },
        { -1, "", 114 },
        { BARCODE_DOTCODE, "BARCODE_DOTCODE", 115 },
        { BARCODE_HANXIN, "BARCODE_HANXIN", 116 },
        { -1, "", 117 },
        { -1, "", 118 },
        { -1, "", 119 },
        { -1, "", 120 },
        { BARCODE_MAILMARK, "BARCODE_MAILMARK", 121 },
        { -1, "", 122 },
        { -1, "", 123 },
        { -1, "", 124 },
        { -1, "", 125 },
        { -1, "", 126 },
        { -1, "", 127 },
        { BARCODE_AZRUNE, "BARCODE_AZRUNE", 128 },
        { BARCODE_CODE32, "BARCODE_CODE32", 129 },
        { BARCODE_EANX_CC, "BARCODE_EANX_CC", 130 },
        { BARCODE_EAN128_CC, "BARCODE_EAN128_CC", 131 },
        { BARCODE_RSS14_CC, "BARCODE_RSS14_CC", 132 },
        { BARCODE_RSS_LTD_CC, "BARCODE_RSS_LTD_CC", 133 },
        { BARCODE_RSS_EXP_CC, "BARCODE_RSS_EXP_CC", 134 },
        { BARCODE_UPCA_CC, "BARCODE_UPCA_CC", 135 },
        { BARCODE_UPCE_CC, "BARCODE_UPCE_CC", 136 },
        { BARCODE_RSS14STACK_CC, "BARCODE_RSS14STACK_CC", 137 },
        { BARCODE_RSS14_OMNI_CC, "BARCODE_RSS14_OMNI_CC", 138 },
        { BARCODE_RSS_EXPSTACK_CC, "BARCODE_RSS_EXPSTACK_CC", 139 },
        { BARCODE_CHANNEL, "BARCODE_CHANNEL", 140 },
        { BARCODE_CODEONE, "BARCODE_CODEONE", 141 },
        { BARCODE_GRIDMATRIX, "BARCODE_GRIDMATRIX", 142 },
        { BARCODE_UPNQR, "BARCODE_UPNQR", 143 },
        { BARCODE_ULTRA, "BARCODE_ULTRA", 144 },
        { BARCODE_RMQR, "BARCODE_RMQR", 145 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    if (symbology < 0 || symbology >= data_size) {
        return "";
    }
    if (data[symbology].val != symbology || (data[symbology].define != -1 && data[symbology].define != symbology)) { // Self-check
        fprintf(stderr, "testUtilBarcodeName data table out of sync (%d)\n", symbology);
        abort();
    }
    return data[symbology].name;
}

char* testUtilErrorName(int error_number) {
    struct item {
        int define;
        char* name;
        int val;
    };
    struct item data[] = {
        { 0, "0", 0 },
        { -1, "", 1 },
        { ZINT_WARN_INVALID_OPTION, "ZINT_WARN_INVALID_OPTION", 2 },
        { ZINT_WARN_USES_ECI, "ZINT_WARN_USES_ECI", 3 },
        { -1, "", 4 },
        { ZINT_ERROR_TOO_LONG, "ZINT_ERROR_TOO_LONG", 5 },
        { ZINT_ERROR_INVALID_DATA, "ZINT_ERROR_INVALID_DATA", 6 },
        { ZINT_ERROR_INVALID_CHECK, "ZINT_ERROR_INVALID_CHECK", 7 },
        { ZINT_ERROR_INVALID_OPTION, "ZINT_ERROR_INVALID_OPTION", 8 },
        { ZINT_ERROR_ENCODING_PROBLEM, "ZINT_ERROR_ENCODING_PROBLEM", 9 },
        { ZINT_ERROR_FILE_ACCESS, "ZINT_ERROR_FILE_ACCESS", 10 },
        { ZINT_ERROR_MEMORY, "ZINT_ERROR_MEMORY", 11 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    if (error_number < 0 || error_number >= data_size) {
        return "";
    }
    if (data[error_number].val != error_number || (data[error_number].define != -1 && data[error_number].define != error_number)) { // Self-check
        fprintf(stderr, "testUtilErrorName data table out of sync (%d)\n", error_number);
        abort();
    }
    return data[error_number].name;
}

char* testUtilInputModeName(int input_mode) {
    struct item {
        int define;
        char* name;
        int val;
    };
    struct item data[] = {
        { DATA_MODE, "DATA_MODE", 0 },
        { UNICODE_MODE, "UNICODE_MODE", 1 },
        { GS1_MODE, "GS1_MODE", 2 },
        { -1, "", 3 },
        { -1, "", 4 },
        { -1, "", 5 },
        { -1, "", 6 },
        { -1, "", 7 },
        { DATA_MODE | ESCAPE_MODE, "DATA_MODE | ESCAPE_MODE", 8 },
        { UNICODE_MODE | ESCAPE_MODE, "UNICODE_MODE | ESCAPE_MODE", 9 },
        { GS1_MODE | ESCAPE_MODE, "GS1_MODE | ESCAPE_MODE", 10 },
    };
    int data_size = sizeof(data) / sizeof(struct item);

    if (input_mode < 0 || input_mode >= data_size) {
        return input_mode == -1 ? "-1" : "";
    }
    if (data[input_mode].val != input_mode || (data[input_mode].define != -1 && data[input_mode].define != input_mode)) { // Self-check
        fprintf(stderr, "testUtilInputModeName data table out of sync (%d)\n", input_mode);
        abort();
    }
    return data[input_mode].name;
}

int testUtilDAFTConvert(const struct zint_symbol* symbol, char* buffer, int buffer_size)
{
    buffer[0] = '\0';
    char* b = buffer;
    for (int i = 0; i < symbol->width && b < buffer + buffer_size; i += 2) {
        if (module_is_set(symbol, 0, i) && module_is_set(symbol, 2, i)) {
            *b++ = 'F';
        } else if (module_is_set(symbol, 0, i)) {
            *b++ = 'A';
        } else if (module_is_set(symbol, 2, i)) {
            *b++ = 'D';
        } else {
            *b++ = 'T';
        }
    }
    if (b == buffer + buffer_size) {
        return FALSE;
    }
    *b = '\0';
    return TRUE;
}

/* Is string valid UTF-8? */
int testUtilIsValidUTF8(const unsigned char str[], const size_t length) {
    int i;
    unsigned int codepoint, state = 0;

    for (i = 0; i < length; i++) {
        if (decode_utf8(&state, &codepoint, str[i]) == 12) {
            return 0;
        }
    }

    return state == 0;
}

char* testUtilEscape(char* buffer, int length, char* escaped, int escaped_size)
{
    int i;
    unsigned char* b = buffer;
    unsigned char* be = buffer + length;
    int non_utf8 = !testUtilIsValidUTF8(buffer, length);

    for (i = 0; b < be && i < escaped_size; b++) {
        if (non_utf8 || *b < ' ' || *b == '\177') {
            if (i < escaped_size - 4) {
                sprintf(escaped + i, "\\%.3o", *b);
            }
            i += 4;
        } else if (*b == '\\' || *b == '"') {
            if (i < escaped_size - 2) {
                escaped[i] = '\\';
                escaped[i + 1] = *b;
            }
            i += 2;
        } else if (b + 1 < be && *b == 0xC2 && *(b + 1) < 0xA0) {
            if (i < escaped_size - 8) {
                sprintf(escaped + i, "\\%.3o\\%.3o", *b, *(b + 1));
            }
            i += 8;
            b++;
        } else {
            escaped[i++] = *b;
        }
    }
    if (i >= escaped_size) {
        return NULL;
    }
    escaped[i] = '\0';
    return escaped;
}

char* testUtilReadCSVField(char* buffer, char* field, int field_size)
{
    int i;
    char* b = buffer;
    for (i = 0; i < field_size && *b && *b != ',' && *b != '\n' && *b != '\r'; i++) {
        field[i] = *b++;
    }
    if (i == field_size) {
        return NULL;
    }
    field[i] = '\0';
    return b;
}

int testUtilSymbolCmp(const struct zint_symbol* a, const struct zint_symbol* b)
{
    if (a->symbology != b->symbology) {
        return 1;
    }
    if (a->rows != b->rows) {
        return 2;
    }
    if (a->width != b->width) {
        return 3;
    }
    for (int i = 0; i < a->rows; i++) {
        for (int j = 0; j < a->width; j++) {
            if (module_is_set(a, i, j) != module_is_set(b, i, j)) {
                return 4;
            }
        }
    }
    if (a->height != b->height) {
        return 5;
    }
    if (a->whitespace_width != b->whitespace_width) {
        return 6;
    }
    if (a->border_width != b->border_width) {
        return 7;
    }
    if (a->output_options != b->output_options) {
        return 8;
    }
    if (a->scale != b->scale) {
        return 9;
    }

    return 0;
}

struct zint_vector* testUtilVectorCpy(const struct zint_vector* in)
{
    struct zint_vector* out = (struct zint_vector*)malloc(sizeof(struct zint_vector));
    out->width = in->width;
    out->height = in->height;
    out->rectangles = NULL;
    out->strings = NULL;
    out->circles = NULL;
    out->hexagons = NULL;

    struct zint_vector_rect* rect;
    struct zint_vector_string* string;
    struct zint_vector_circle* circle;
    struct zint_vector_hexagon* hexagon;

    struct zint_vector_rect** outrect;
    struct zint_vector_string** outstring;
    struct zint_vector_circle** outcircle;
    struct zint_vector_hexagon** outhexagon;

    // Copy rectangles
    rect = in->rectangles;
    outrect = &(out->rectangles);
    while (rect) {
        *outrect = (struct zint_vector_rect*) malloc(sizeof(struct zint_vector_rect));
        memcpy(*outrect, rect, sizeof(struct zint_vector_rect));
        outrect = &((*outrect)->next);
        rect = rect->next;
    }
    *outrect = NULL;

    // Copy Strings
    string = in->strings;
    outstring = &(out->strings);
    while (string) {
        *outstring = (struct zint_vector_string*) malloc(sizeof(struct zint_vector_string));
        memcpy(*outstring, string, sizeof(struct zint_vector_string));
        (*outstring)->text = (unsigned char*) malloc(sizeof(unsigned char) * (ustrlen(string->text) + 1));
        ustrcpy((*outstring)->text, string->text);
        outstring = &((*outstring)->next);
        string = string->next;
    }
    *outstring = NULL;

    // Copy Circles
    circle = in->circles;
    outcircle = &(out->circles);
    while (circle) {
        *outcircle = (struct zint_vector_circle*) malloc(sizeof(struct zint_vector_circle));
        memcpy(*outcircle, circle, sizeof(struct zint_vector_circle));
        outcircle = &((*outcircle)->next);
        circle = circle->next;
    }
    *outcircle = NULL;

    // Copy Hexagons
    hexagon = in->hexagons;
    outhexagon = &(out->hexagons);
    while (hexagon) {
        *outhexagon = (struct zint_vector_hexagon*) malloc(sizeof(struct zint_vector_hexagon));
        memcpy(*outhexagon, hexagon, sizeof(struct zint_vector_hexagon));
        outhexagon = &((*outhexagon)->next);
        hexagon = hexagon->next;
    }
    *outhexagon = NULL;

    return out;
}

int testUtilVectorCmp(const struct zint_vector* a, const struct zint_vector* b)
{
    struct zint_vector_rect* arect;
    struct zint_vector_string* astring;
    struct zint_vector_circle* acircle;
    struct zint_vector_hexagon* ahexagon;

    struct zint_vector_rect* brect;
    struct zint_vector_string* bstring;
    struct zint_vector_circle* bcircle;
    struct zint_vector_hexagon* bhexagon;

    if (a->width != b->width) {
        return 1;
    }
    if (a->height != b->height) {
        return 2;
    }

    // Compare rectangles
    arect = a->rectangles;
    brect = b->rectangles;
    while (arect) {
        if (!brect) {
            return 11;
        }
        if (arect->x != brect->x) {
            return 12;
        }
        if (arect->y != brect->y) {
            return 13;
        }
        if (arect->height != brect->height) {
            return 14;
        }
        if (arect->width != brect->width) {
            return 15;
        }
        if (arect->colour != brect->colour) {
            return 16;
        }
        arect = arect->next;
        brect = brect->next;
    }
    if (brect) {
        return 10;
    }

    // Compare strings
    astring = a->strings;
    bstring = b->strings;
    while (astring) {
        if (!bstring) {
            return 21;
        }
        if (astring->x != bstring->x) {
            return 22;
        }
        if (astring->y != bstring->y) {
            return 23;
        }
        if (astring->fsize != bstring->fsize) {
            return 24;
        }
        if (astring->width != bstring->width) {
            return 25;
        }
        if (astring->length != bstring->length) {
            return 26;
        }
        if (ustrlen(astring->text) != ustrlen(bstring->text)) {
            return 27;
        }
        if (strcmp((const char*)astring->text, (const char*)bstring->text) != 0) {
            return 28;
        }
        astring = astring->next;
        bstring = bstring->next;
    }
    if (bstring) {
        return 20;
    }

    // Compare circles
    acircle = a->circles;
    bcircle = b->circles;
    while (acircle) {
        if (!bcircle) {
            return 31;
        }
        if (acircle->x != bcircle->x) {
            return 32;
        }
        if (acircle->y != bcircle->y) {
            return 33;
        }
        if (acircle->diameter != bcircle->diameter) {
            return 34;
        }
        if (acircle->colour != bcircle->colour) {
            return 35;
        }
        acircle = acircle->next;
        bcircle = bcircle->next;
    }
    if (bcircle) {
        return 30;
    }

    // Compare hexagons
    ahexagon = a->hexagons;
    bhexagon = b->hexagons;
    while (ahexagon) {
        if (!bhexagon) {
            return 41;
        }
        if (ahexagon->x != bhexagon->x) {
            return 42;
        }
        if (ahexagon->y != bhexagon->y) {
            return 43;
        }
        if (ahexagon->diameter != bhexagon->diameter) {
            return 44;
        }
        ahexagon = ahexagon->next;
        bhexagon = bhexagon->next;
    }
    if (bhexagon) {
        return 40;
    }

    return 0;
}

void testUtilLargeDump(const char* name, const short int reg[])
{
    unsigned words[4];
    words[0] = words[1] = words[2] = words[3] = 0;
    int w = 0;
    for (int i = 0; i < 112; i += 32 ) {
        for (int j = 0; j < 32 && i + j < 112; j++) {
            if (reg[i + j]) {
                words[w] += 1 << j;
            }
        }
        w++;
    }
    printf("%4x 0x%08x%08x%08x %s", words[3], words[2], words[1], words[0], name);
}

void testUtilModulesDump(const struct zint_symbol* symbol, char* prefix, char* postfix)
{
    int r, w;
    for (r = 0; r < symbol->rows; r++) {
        if (*prefix) {
            fputs(prefix, stdout);
        }
        putchar('"');
        for (w = 0; w < symbol->width; w++) {
            putchar(module_is_set(symbol, r, w) ? '1' : '0');
        }
        putchar('"');
        if (*postfix) {
            fputs(postfix, stdout);
        }
    }
}

int testUtilModulesCmp(const struct zint_symbol* symbol, const char* expected, int* row, int* width)
{
    const char* e = expected;
    const char* ep = expected + strlen(expected);
    int r, w = 0;
    for (r = 0; r < symbol->rows && e < ep; r++) {
        for (w = 0; w < symbol->width && e < ep; w++) {
            if (module_is_set(symbol, r, w) != (*e == '1')) {
                *row = r;
                *width = w;
                return 1 /*fail*/;
            }
            e++;
        }
    }
    *row = r;
    *width = w;
    return e != ep || r != symbol->rows || w != symbol->width ? 1 /*fail*/ : 0 /*success*/;
}

int testUtilModulesDumpHex(const struct zint_symbol* symbol, char dump[], int dump_size)
{
    int i, r;
    char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
        '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    int space = 0;
    char* d = dump;
    char* de = dump + dump_size;

    for (r = 0; r < symbol->rows && d < de; r++) {
        int byt = 0;
        for (i = 0; i < symbol->width && d < de; i++) {
            if (space == 2) {
                *d++ = ' ';
                space = 0;
            }
            byt = byt << 1;
            if (module_is_set(symbol, r, i)) {
                byt += 1;
            }
            if (d < de && ((i + 1) % 4) == 0) {
                *d++ = hex[byt];
                space++;
                byt = 0;
            }
        }
        if (d < de && (symbol->width % 4) != 0) {
            byt = byt << (4 - (symbol->width % 4));
            *d++ = hex[byt];
            space++;
        }
    }
    if (d == de) {
        return -1;
    }
    *d = '\0';
    return d - dump;
}

int testUtilExists(char* filename)
{
    FILE* fp = fopen(filename, "r");
    if (fp == NULL) {
        return 0;
    }
    fclose(fp);
    return 1;
}

int testUtilCmpPngs(char* png1, char* png2)
{
    int ret = -1;
#ifndef NO_PNG
    FILE* fp1;
    FILE* fp2;
    png_structp png_ptr1, png_ptr2;
    png_infop info_ptr1, info_ptr2;
    int width1, height1, width2, height2;
    png_byte color_type1, color_type2;
    png_byte bit_depth1, bit_depth2;
    png_bytep row1 = NULL, row2 = NULL;
    size_t rowbytes1, rowbytes2;
    int r;

    fp1 = fopen(png1, "rb");
    if (!fp1) {
        return 2;
    }
    fp2 = fopen(png2, "rb");
    if (!fp2) {
        fclose(fp1);
        return 3;
    }

    png_ptr1 = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL, NULL, NULL);
    if (!png_ptr1) {
        fclose(fp1);
        fclose(fp2);
        return 4;
    }
    info_ptr1 = png_create_info_struct(png_ptr1);
    if (!info_ptr1) {
        png_destroy_read_struct(&png_ptr1, (png_infopp)NULL, (png_infopp)NULL);
        fclose(fp1);
        fclose(fp2);
        return 5;
    }

    png_ptr2 = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL, NULL, NULL);
    if (!png_ptr2) {
        png_destroy_read_struct(&png_ptr1, &info_ptr1, (png_infopp)NULL);
        fclose(fp1);
        fclose(fp2);
        return 6;
    }
    info_ptr2 = png_create_info_struct(png_ptr2);
    if (!info_ptr2) {
        png_destroy_read_struct(&png_ptr1, &info_ptr1, (png_infopp)NULL);
        png_destroy_read_struct(&png_ptr2, (png_infopp)NULL, (png_infopp)NULL);
        fclose(fp1);
        fclose(fp2);
        return 7;
    }

    if (setjmp(png_jmpbuf(png_ptr1))) {
        if (row1) {
            free(row1);
        }
        if (row2) {
            free(row2);
        }
        png_destroy_read_struct(&png_ptr1, &info_ptr1, (png_infopp)NULL);
        png_destroy_read_struct(&png_ptr2, &info_ptr2, (png_infopp)NULL);
        fclose(fp1);
        fclose(fp2);
        return 8;
    }
    if (setjmp(png_jmpbuf(png_ptr2))) {
        if (row1) {
            free(row1);
        }
        if (row2) {
            free(row2);
        }
        png_destroy_read_struct(&png_ptr1, &info_ptr1, (png_infopp)NULL);
        png_destroy_read_struct(&png_ptr2, &info_ptr2, (png_infopp)NULL);
        fclose(fp1);
        fclose(fp2);
        return 9;
    }

    png_init_io(png_ptr1, fp1);
    png_init_io(png_ptr2, fp2);

    png_read_info(png_ptr1, info_ptr1);
    png_read_info(png_ptr2, info_ptr2);

    width1 = png_get_image_width(png_ptr1, info_ptr1);
    height1 = png_get_image_height(png_ptr1, info_ptr1);
    width2 = png_get_image_width(png_ptr2, info_ptr2);
    height2 = png_get_image_height(png_ptr2, info_ptr2);

    if (width1 != width2 || height1 != height2) {
        printf("width1 %d, width2 %d, height1 %d, height2 %d\n", width1, width2, height1, height2);
        png_destroy_read_struct(&png_ptr1, &info_ptr1, (png_infopp)NULL);
        png_destroy_read_struct(&png_ptr2, &info_ptr2, (png_infopp)NULL);
        fclose(fp1);
        fclose(fp2);
        return 10;
    }

    color_type1 = png_get_color_type(png_ptr1, info_ptr1);
    bit_depth1 = png_get_bit_depth(png_ptr1, info_ptr1);
    if (bit_depth1 == 16) {
        png_set_scale_16(png_ptr1);
    }
    if (color_type1 == PNG_COLOR_TYPE_PALETTE) {
        png_set_palette_to_rgb(png_ptr1);
    }
    if (color_type1 == PNG_COLOR_TYPE_GRAY && bit_depth1 < 8) {
        png_set_expand_gray_1_2_4_to_8(png_ptr1);
    }
    if (png_get_valid(png_ptr1, info_ptr1, PNG_INFO_tRNS)) {
        png_set_tRNS_to_alpha(png_ptr1);
    }
    if (color_type1 == PNG_COLOR_TYPE_RGB || color_type1 == PNG_COLOR_TYPE_GRAY || color_type1 == PNG_COLOR_TYPE_PALETTE) {
        png_set_filler(png_ptr1, 0xFF, PNG_FILLER_AFTER);
    }
    if (color_type1 == PNG_COLOR_TYPE_GRAY || color_type1 == PNG_COLOR_TYPE_GRAY_ALPHA) {
        png_set_gray_to_rgb(png_ptr1);
    }

    color_type2 = png_get_color_type(png_ptr2, info_ptr2);
    bit_depth2 = png_get_bit_depth(png_ptr2, info_ptr2);
    if (bit_depth2 == 16) {
        png_set_scale_16(png_ptr2);
    }
    if (color_type2 == PNG_COLOR_TYPE_PALETTE) {
        png_set_palette_to_rgb(png_ptr2);
    }
    if (color_type2 == PNG_COLOR_TYPE_GRAY && bit_depth2 < 8) {
        png_set_expand_gray_1_2_4_to_8(png_ptr2);
    }
    if (png_get_valid(png_ptr2, info_ptr2, PNG_INFO_tRNS)) {
        png_set_tRNS_to_alpha(png_ptr2);
    }
    if (color_type2 == PNG_COLOR_TYPE_RGB || color_type2 == PNG_COLOR_TYPE_GRAY || color_type2 == PNG_COLOR_TYPE_PALETTE) {
        png_set_filler(png_ptr2, 0xFF, PNG_FILLER_AFTER);
    }
    if (color_type2 == PNG_COLOR_TYPE_GRAY || color_type2 == PNG_COLOR_TYPE_GRAY_ALPHA) {
        png_set_gray_to_rgb(png_ptr2);
    }

    png_read_update_info(png_ptr1, info_ptr1);
    png_read_update_info(png_ptr2, info_ptr2);

    rowbytes1 = png_get_rowbytes(png_ptr1, info_ptr1);
    rowbytes2 = png_get_rowbytes(png_ptr2, info_ptr2);
    if (rowbytes1 != rowbytes2) {
        png_destroy_read_struct(&png_ptr1, &info_ptr1, (png_infopp)NULL);
        png_destroy_read_struct(&png_ptr2, &info_ptr2, (png_infopp)NULL);
        fclose(fp1);
        fclose(fp2);
        return 11;
    }

    row1 = (png_byte*)malloc(rowbytes1);
    if (!row1) {
        png_destroy_read_struct(&png_ptr1, &info_ptr1, (png_infopp)NULL);
        png_destroy_read_struct(&png_ptr2, &info_ptr2, (png_infopp)NULL);
        fclose(fp1);
        fclose(fp2);
        return 12;
    }
    row2 = (png_byte*)malloc(rowbytes2);
    if (!row2) {
        free(row1);
        png_destroy_read_struct(&png_ptr1, &info_ptr1, (png_infopp)NULL);
        png_destroy_read_struct(&png_ptr2, &info_ptr2, (png_infopp)NULL);
        fclose(fp1);
        fclose(fp2);
        return 13;
    }

    for (r = 0; r < height1; r++) {
        png_read_row(png_ptr1, row1, NULL);
        png_read_row(png_ptr2, row2, NULL);
        if (memcmp(row1, row2, rowbytes1) != 0) {
            break;
        }
    }
    ret = r == height1 ? 0 : 20;

    free(row1);
    free(row2);
    png_destroy_read_struct(&png_ptr1, &info_ptr1, (png_infopp)NULL);
    png_destroy_read_struct(&png_ptr2, &info_ptr2, (png_infopp)NULL);
    fclose(fp1);
    fclose(fp2);
#endif
    return ret;
}

static int testUtilCmpTxts(char* txt1, char* txt2)
{
    int ret = -1;
    FILE* fp1;
    FILE* fp2;
    char buf1[1024];
    char buf2[1024];
    size_t len1 = 0, len2 = 0;

    fp1 = fopen(txt1, "r");
    if (!fp1) {
        return 2;
    }
    fp2 = fopen(txt2, "r");
    if (!fp2) {
        fclose(fp1);
        return 3;
    }

    while (1) {
        if (fgets(buf1, sizeof(buf1), fp1) == NULL) {
            if (fgets(buf2, sizeof(buf2), fp2) != NULL) {
                ret = 4;
                break;
            }
            break;
        }
        if (fgets(buf2, sizeof(buf2), fp2) == NULL) {
            ret = 5;
            break;
        }
        len1 = strlen(buf1);
        len2 = strlen(buf2);
        if (len1 != len2) {
            ret = 6;
            break;
        }
        if (strcmp(buf1, buf2) != 0) {
            ret = 7;
            break;
        }
    }
    if (ret == -1) {
        ret = feof(fp1) && feof(fp2) ? 0 : 20;
    }
    fclose(fp1);
    fclose(fp2);

    return ret;
}

static int testUtilCmpBins(char* bin1, char* bin2)
{
    int ret = -1;
    FILE* fp1;
    FILE* fp2;
    char buf1[1024];
    char buf2[1024];
    size_t len1 = 0, len2 = 0;

    fp1 = fopen(bin1, "rb");
    if (!fp1) {
        return 2;
    }
    fp2 = fopen(bin2, "rb");
    if (!fp2) {
        fclose(fp1);
        return 3;
    }

    do {
        len1 = fread(buf1, 1, sizeof(buf1), fp1);
        len2 = fread(buf2, 1, sizeof(buf2), fp2);
        if (len1 != len2) {
            ret = 6;
            break;
        }
        if (memcmp(buf1, buf2, len1) != 0) {
            ret = 7;
            break;
        }
    } while (!feof(fp1) && !feof(fp2));

    if (ret == -1) {
        ret = feof(fp1) && feof(fp2) ? 0 : 20;
    }
    fclose(fp1);
    fclose(fp2);

    return ret;
}

int testUtilCmpSvgs(char* svg1, char* svg2)
{
    return testUtilCmpTxts(svg1, svg2);
}

int testUtilCmpEpss(char* eps1, char* eps2)
{
    int ret = -1;
    FILE* fp1;
    FILE* fp2;
    char buf1[1024];
    char buf2[1024];
    size_t len1 = 0, len2 = 0;
    char first_line[] = "%!PS-Adobe-3.0 EPSF-3.0\n";
    char second_line_start[] = "%%Creator: Zint ";

    fp1 = fopen(eps1, "r");
    if (!fp1) {
        return 2;
    }
    fp2 = fopen(eps2, "r");
    if (!fp2) {
        fclose(fp1);
        return 3;
    }

    // Preprocess the 1st 2 lines to avoid comparing changeable Zint version in 2nd line
    if (fgets(buf1, sizeof(buf1), fp1) == NULL || strcmp(buf1, first_line) != 0
            || fgets(buf2, sizeof(buf2), fp2) == NULL || strcmp(buf2, first_line) != 0) {
        ret = 10;
    } else if (fgets(buf1, sizeof(buf1), fp1) == NULL || strncmp(buf1, second_line_start, sizeof(second_line_start) - 1) != 0
            || fgets(buf2, sizeof(buf2), fp2) == NULL || strncmp(buf2, second_line_start, sizeof(second_line_start) - 1) != 0) {
        ret = 11;
    }

    if (ret == -1) {
        while (1) {
            if (fgets(buf1, sizeof(buf1), fp1) == NULL) {
                if (fgets(buf2, sizeof(buf2), fp2) != NULL) {
                    ret = 4;
                    break;
                }
                break;
            }
            if (fgets(buf2, sizeof(buf2), fp2) == NULL) {
                ret = 5;
                break;
            }
            len1 = strlen(buf1);
            len2 = strlen(buf2);
            if (len1 != len2) {
                ret = 6;
                break;
            }
            if (strcmp(buf1, buf2) != 0) {
                ret = 7;
                break;
            }
        }
        if (ret == -1) {
            ret = feof(fp1) && feof(fp2) ? 0 : 20;
        }
    }
    fclose(fp1);
    fclose(fp2);

    return ret;
}

int testUtilCmpEmfs(char* emf1, char* emf2)
{
    return testUtilCmpBins(emf1, emf2);
}

int testUtilCmpGifs(char* gif1, char* gif2)
{
    return testUtilCmpBins(gif1, gif2);
}

int testUtilCmpBmps(char* bmp1, char* bmp2)
{
    return testUtilCmpBins(bmp1, bmp2);
}

int testUtilCmpPcxs(char* pcx1, char* pcx2)
{
    return testUtilCmpBins(pcx1, pcx2);
}
Added jni/zint/backend/tests/testcommon.h.


















































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
       notice, this list of conditions and the following disclaimer in the
       documentation and/or other materials provided with the distribution.
    3. Neither the name of the project nor the names of its contributors
       may be used to endorse or promote products derived from this software
       without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */
/*
 * Adapted from qrencode/tests/common.h
 * Copyright (C) 2006-2017 Kentaro Fukuchi <kentaro@fukuchi.org>
 */

#ifndef TESTCOMMON_H
#define TESTCOMMON_H

#include <stdio.h>
#include <string.h>
#include "../common.h"

extern int assertionFailed;
extern int assertionNum;

#define testStart(__arg__) (testStartReal(__func__, __arg__))
#define testEndExp(__arg__) (testEnd(!(__arg__)))
void testStartReal(const char *func, const char *name);
void testEnd(int result);
void testFinish(void);
void testReport();

#define assert_exp(__exp__, ...) \
{assertionNum++;if(!(__exp__)) {assertionFailed++; printf(__VA_ARGS__);testFinish();return;}}

#define assert_zero(__exp__, ...) assert_exp((__exp__) == 0, __VA_ARGS__)
#define assert_nonzero(__exp__, ...) assert_exp((__exp__) != 0, __VA_ARGS__)
#define assert_null(__ptr__, ...) assert_exp((__ptr__) == NULL, __VA_ARGS__)
#define assert_nonnull(__ptr__, ...) assert_exp((__ptr__) != NULL, __VA_ARGS__)
#define assert_equal(__e1__, __e2__, ...) assert_exp((__e1__) == (__e2__), __VA_ARGS__)
#define assert_notequal(__e1__, __e2__, ...) assert_exp((__e1__) != (__e2__), __VA_ARGS__)
#define assert_fail(...) assert_exp(0, __VA_ARGS__)
#define assert_nothing(__exp__, ...) {printf(__VA_ARGS__); __exp__;}

extern void vector_free(struct zint_symbol *symbol); /* Free vector structures */

char* testUtilBarcodeName(int symbology);
char* testUtilErrorName(int error_number);
char* testUtilInputModeName(int input_mode);
int testUtilDAFTConvert(const struct zint_symbol* symbol, char* buffer, int buffer_size);
char* testUtilEscape(char* buffer, int length, char* escaped, int escaped_size);
char* testUtilReadCSVField(char* buffer, char* field, int field_size);
int testUtilSymbolCmp(const struct zint_symbol* a, const struct zint_symbol* b);
struct zint_vector* testUtilVectorCpy(const struct zint_vector* in);
int testUtilVectorCmp(const struct zint_vector* a, const struct zint_vector* b);
void testUtilLargeDump(const char* name, const short reg[]);
void testUtilModulesDump(const struct zint_symbol* symbol, char* prefix, char* postfix);
int testUtilModulesCmp(const struct zint_symbol* symbol, const char* expected, int* row, int* width);
int testUtilModulesDumpHex(const struct zint_symbol* symbol, char dump[], int dump_size);
int testUtilExists(char* filename);
int testUtilCmpPngs(char* file1, char* file2);
int testUtilCmpSvgs(char* svg1, char* svg2);
int testUtilCmpEpss(char* eps1, char* eps2);
int testUtilCmpEmfs(char* emf1, char* emf2);
int testUtilCmpGifs(char* gif1, char* gif2);
int testUtilCmpBmps(char* bmp1, char* bmp2);
int testUtilCmpPcxs(char* pcx1, char* pcx2);

#endif /* TESTCOMMON_H */
Added jni/zint/backend/tests/tools/data/GB18030.TXT.README.






>
>
>
1
2
3
# GB18030.TXT not included as 21MB in size. It can be downloaded from
# https://haible.de/bruno/charsets/conversion-tables/GB18030.html
# The version used is libiconv-1.11/GB18030.TXT
Added jni/zint/backend/tests/tools/data/GB2312.TXT.












































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
#
#	Name:             GB2312-80 to Unicode table (complete, hex format)
#	Unicode version:  3.0
#	Table version:    1.0
#	Table format:     Format A
#	Date:             1999 October 8
#	Author:           Ken Whistler <kenw@sybase.com>
#       Original authors: Glenn Adams, John H. Jenkin <jenkins@apple.com>
#
#	Copyright (c) 1991-1999 Unicode, Inc.  All Rights reserved.
#
#	This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
#	No claims are made as to fitness for any particular purpose.  No
#	warranties of any kind are expressed or implied.  The recipient
#	agrees to determine applicability of information provided.  If this
#	file has been provided on optical media by Unicode, Inc., the sole
#	remedy for any claim will be exchange of defective media within 90
#	days of receipt.
#
#	Unicode, Inc. hereby grants the right to freely use the information
#	supplied in this file in the creation of products supporting the
#	Unicode Standard, and to make copies of this file in any form for
#	internal or external distribution as long as this notice remains
#	attached.
#
#	General notes:
#
#	This table contains the datathe Unicode Consortium currently has on how
#       GB2312-80 characters map into Unicode.
#
#	Format:  Three tab-separated columns
#		 Column #1 is the GB2312 code (in hex as 0xXXXX)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#					The official names for Unicode characters U+4E00
#					to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX",
#					where XXXX is the code point.  Including all these
#					names in this file increases its size substantially
#					and needlessly.  The token "<CJK>" is used for the
#					name of these characters.  If necessary, it can be
#					expanded algorithmically by a parser or editor.
#
#	The entries are in GB2312 order
#
#	The following algorithms can be used to change the hex form
#		of GB2312 to other standard forms:
#
#		To change hex to EUC form, add 0x8080
#		To change hex to kuten form, first subtract 0x2020.  Then
#			the high and low bytes correspond to the ku and ten of
#			the kuten form.  For example, 0x2121 -> 0x0101 -> 0101;
#			0x777E -> 0x575E -> 8794
#
#	Version history
#	1.0 version updates 0.0d2 version by correcting mapping for 0x212C
#             from U+2225 to U+2016.
#
#	Updated versions of this file may be found in:
#		<ftp://ftp.unicode.org/Public/MAPPINGS/>
#
#	Any comments or problems, contact <errata@unicode.orgm>
#	Please note that <errata@unicode.org> is an archival address;
#	notices will be checked, but do not expect an immediate response.
#

0x2121	0x3000	# IDEOGRAPHIC SPACE
0x2122	0x3001	# IDEOGRAPHIC COMMA
0x2123	0x3002	# IDEOGRAPHIC FULL STOP
0x2124	0x30FB	# KATAKANA MIDDLE DOT
0x2125	0x02C9	# MODIFIER LETTER MACRON (Mandarin Chinese first tone)
0x2126	0x02C7	# CARON (Mandarin Chinese third tone)
0x2127	0x00A8	# DIAERESIS
0x2128	0x3003	# DITTO MARK
0x2129	0x3005	# IDEOGRAPHIC ITERATION MARK
0x212A	0x2015	# HORIZONTAL BAR
0x212B	0xFF5E	# FULLWIDTH TILDE
0x212C	0x2016	# DOUBLE VERTICAL LINE
0x212D	0x2026	# HORIZONTAL ELLIPSIS
0x212E	0x2018	# LEFT SINGLE QUOTATION MARK
0x212F	0x2019	# RIGHT SINGLE QUOTATION MARK
0x2130	0x201C	# LEFT DOUBLE QUOTATION MARK
0x2131	0x201D	# RIGHT DOUBLE QUOTATION MARK
0x2132	0x3014	# LEFT TORTOISE SHELL BRACKET
0x2133	0x3015	# RIGHT TORTOISE SHELL BRACKET
0x2134	0x3008	# LEFT ANGLE BRACKET
0x2135	0x3009	# RIGHT ANGLE BRACKET
0x2136	0x300A	# LEFT DOUBLE ANGLE BRACKET
0x2137	0x300B	# RIGHT DOUBLE ANGLE BRACKET
0x2138	0x300C	# LEFT CORNER BRACKET
0x2139	0x300D	# RIGHT CORNER BRACKET
0x213A	0x300E	# LEFT WHITE CORNER BRACKET
0x213B	0x300F	# RIGHT WHITE CORNER BRACKET
0x213C	0x3016	# LEFT WHITE LENTICULAR BRACKET
0x213D	0x3017	# RIGHT WHITE LENTICULAR BRACKET
0x213E	0x3010	# LEFT BLACK LENTICULAR BRACKET
0x213F	0x3011	# RIGHT BLACK LENTICULAR BRACKET
0x2140	0x00B1	# PLUS-MINUS SIGN
0x2141	0x00D7	# MULTIPLICATION SIGN
0x2142	0x00F7	# DIVISION SIGN
0x2143	0x2236	# RATIO
0x2144	0x2227	# LOGICAL AND
0x2145	0x2228	# LOGICAL OR
0x2146	0x2211	# N-ARY SUMMATION
0x2147	0x220F	# N-ARY PRODUCT
0x2148	0x222A	# UNION
0x2149	0x2229	# INTERSECTION
0x214A	0x2208	# ELEMENT OF
0x214B	0x2237	# PROPORTION
0x214C	0x221A	# SQUARE ROOT
0x214D	0x22A5	# UP TACK
0x214E	0x2225	# PARALLEL TO
0x214F	0x2220	# ANGLE
0x2150	0x2312	# ARC
0x2151	0x2299	# CIRCLED DOT OPERATOR
0x2152	0x222B	# INTEGRAL
0x2153	0x222E	# CONTOUR INTEGRAL
0x2154	0x2261	# IDENTICAL TO
0x2155	0x224C	# ALL EQUAL TO
0x2156	0x2248	# ALMOST EQUAL TO
0x2157	0x223D	# REVERSED TILDE
0x2158	0x221D	# PROPORTIONAL TO
0x2159	0x2260	# NOT EQUAL TO
0x215A	0x226E	# NOT LESS-THAN
0x215B	0x226F	# NOT GREATER-THAN
0x215C	0x2264	# LESS-THAN OR EQUAL TO
0x215D	0x2265	# GREATER-THAN OR EQUAL TO
0x215E	0x221E	# INFINITY
0x215F	0x2235	# BECAUSE
0x2160	0x2234	# THEREFORE
0x2161	0x2642	# MALE SIGN
0x2162	0x2640	# FEMALE SIGN
0x2163	0x00B0	# DEGREE SIGN
0x2164	0x2032	# PRIME
0x2165	0x2033	# DOUBLE PRIME
0x2166	0x2103	# DEGREE CELSIUS
0x2167	0xFF04	# FULLWIDTH DOLLAR SIGN
0x2168	0x00A4	# CURRENCY SIGN
0x2169	0xFFE0	# FULLWIDTH CENT SIGN
0x216A	0xFFE1	# FULLWIDTH POUND SIGN
0x216B	0x2030	# PER MILLE SIGN
0x216C	0x00A7	# SECTION SIGN
0x216D	0x2116	# NUMERO SIGN
0x216E	0x2606	# WHITE STAR
0x216F	0x2605	# BLACK STAR
0x2170	0x25CB	# WHITE CIRCLE
0x2171	0x25CF	# BLACK CIRCLE
0x2172	0x25CE	# BULLSEYE
0x2173	0x25C7	# WHITE DIAMOND
0x2174	0x25C6	# BLACK DIAMOND
0x2175	0x25A1	# WHITE SQUARE
0x2176	0x25A0	# BLACK SQUARE
0x2177	0x25B3	# WHITE UP-POINTING TRIANGLE
0x2178	0x25B2	# BLACK UP-POINTING TRIANGLE
0x2179	0x203B	# REFERENCE MARK
0x217A	0x2192	# RIGHTWARDS ARROW
0x217B	0x2190	# LEFTWARDS ARROW
0x217C	0x2191	# UPWARDS ARROW
0x217D	0x2193	# DOWNWARDS ARROW
0x217E	0x3013	# GETA MARK
0x2231	0x2488	# DIGIT ONE FULL STOP
0x2232	0x2489	# DIGIT TWO FULL STOP
0x2233	0x248A	# DIGIT THREE FULL STOP
0x2234	0x248B	# DIGIT FOUR FULL STOP
0x2235	0x248C	# DIGIT FIVE FULL STOP
0x2236	0x248D	# DIGIT SIX FULL STOP
0x2237	0x248E	# DIGIT SEVEN FULL STOP
0x2238	0x248F	# DIGIT EIGHT FULL STOP
0x2239	0x2490	# DIGIT NINE FULL STOP
0x223A	0x2491	# NUMBER TEN FULL STOP
0x223B	0x2492	# NUMBER ELEVEN FULL STOP
0x223C	0x2493	# NUMBER TWELVE FULL STOP
0x223D	0x2494	# NUMBER THIRTEEN FULL STOP
0x223E	0x2495	# NUMBER FOURTEEN FULL STOP
0x223F	0x2496	# NUMBER FIFTEEN FULL STOP
0x2240	0x2497	# NUMBER SIXTEEN FULL STOP
0x2241	0x2498	# NUMBER SEVENTEEN FULL STOP
0x2242	0x2499	# NUMBER EIGHTEEN FULL STOP
0x2243	0x249A	# NUMBER NINETEEN FULL STOP
0x2244	0x249B	# NUMBER TWENTY FULL STOP
0x2245	0x2474	# PARENTHESIZED DIGIT ONE
0x2246	0x2475	# PARENTHESIZED DIGIT TWO
0x2247	0x2476	# PARENTHESIZED DIGIT THREE
0x2248	0x2477	# PARENTHESIZED DIGIT FOUR
0x2249	0x2478	# PARENTHESIZED DIGIT FIVE
0x224A	0x2479	# PARENTHESIZED DIGIT SIX
0x224B	0x247A	# PARENTHESIZED DIGIT SEVEN
0x224C	0x247B	# PARENTHESIZED DIGIT EIGHT
0x224D	0x247C	# PARENTHESIZED DIGIT NINE
0x224E	0x247D	# PARENTHESIZED NUMBER TEN
0x224F	0x247E	# PARENTHESIZED NUMBER ELEVEN
0x2250	0x247F	# PARENTHESIZED NUMBER TWELVE
0x2251	0x2480	# PARENTHESIZED NUMBER THIRTEEN
0x2252	0x2481	# PARENTHESIZED NUMBER FOURTEEN
0x2253	0x2482	# PARENTHESIZED NUMBER FIFTEEN
0x2254	0x2483	# PARENTHESIZED NUMBER SIXTEEN
0x2255	0x2484	# PARENTHESIZED NUMBER SEVENTEEN
0x2256	0x2485	# PARENTHESIZED NUMBER EIGHTEEN
0x2257	0x2486	# PARENTHESIZED NUMBER NINETEEN
0x2258	0x2487	# PARENTHESIZED NUMBER TWENTY
0x2259	0x2460	# CIRCLED DIGIT ONE
0x225A	0x2461	# CIRCLED DIGIT TWO
0x225B	0x2462	# CIRCLED DIGIT THREE
0x225C	0x2463	# CIRCLED DIGIT FOUR
0x225D	0x2464	# CIRCLED DIGIT FIVE
0x225E	0x2465	# CIRCLED DIGIT SIX
0x225F	0x2466	# CIRCLED DIGIT SEVEN
0x2260	0x2467	# CIRCLED DIGIT EIGHT
0x2261	0x2468	# CIRCLED DIGIT NINE
0x2262	0x2469	# CIRCLED NUMBER TEN
0x2265	0x3220	# PARENTHESIZED IDEOGRAPH ONE
0x2266	0x3221	# PARENTHESIZED IDEOGRAPH TWO
0x2267	0x3222	# PARENTHESIZED IDEOGRAPH THREE
0x2268	0x3223	# PARENTHESIZED IDEOGRAPH FOUR
0x2269	0x3224	# PARENTHESIZED IDEOGRAPH FIVE
0x226A	0x3225	# PARENTHESIZED IDEOGRAPH SIX
0x226B	0x3226	# PARENTHESIZED IDEOGRAPH SEVEN
0x226C	0x3227	# PARENTHESIZED IDEOGRAPH EIGHT
0x226D	0x3228	# PARENTHESIZED IDEOGRAPH NINE
0x226E	0x3229	# PARENTHESIZED IDEOGRAPH TEN
0x2271	0x2160	# ROMAN NUMERAL ONE
0x2272	0x2161	# ROMAN NUMERAL TWO
0x2273	0x2162	# ROMAN NUMERAL THREE
0x2274	0x2163	# ROMAN NUMERAL FOUR
0x2275	0x2164	# ROMAN NUMERAL FIVE
0x2276	0x2165	# ROMAN NUMERAL SIX
0x2277	0x2166	# ROMAN NUMERAL SEVEN
0x2278	0x2167	# ROMAN NUMERAL EIGHT
0x2279	0x2168	# ROMAN NUMERAL NINE
0x227A	0x2169	# ROMAN NUMERAL TEN
0x227B	0x216A	# ROMAN NUMERAL ELEVEN
0x227C	0x216B	# ROMAN NUMERAL TWELVE
0x2321	0xFF01	# FULLWIDTH EXCLAMATION MARK
0x2322	0xFF02	# FULLWIDTH QUOTATION MARK
0x2323	0xFF03	# FULLWIDTH NUMBER SIGN
0x2324	0xFFE5	# FULLWIDTH YEN SIGN
0x2325	0xFF05	# FULLWIDTH PERCENT SIGN
0x2326	0xFF06	# FULLWIDTH AMPERSAND
0x2327	0xFF07	# FULLWIDTH APOSTROPHE
0x2328	0xFF08	# FULLWIDTH LEFT PARENTHESIS
0x2329	0xFF09	# FULLWIDTH RIGHT PARENTHESIS
0x232A	0xFF0A	# FULLWIDTH ASTERISK
0x232B	0xFF0B	# FULLWIDTH PLUS SIGN
0x232C	0xFF0C	# FULLWIDTH COMMA
0x232D	0xFF0D	# FULLWIDTH HYPHEN-MINUS
0x232E	0xFF0E	# FULLWIDTH FULL STOP
0x232F	0xFF0F	# FULLWIDTH SOLIDUS
0x2330	0xFF10	# FULLWIDTH DIGIT ZERO
0x2331	0xFF11	# FULLWIDTH DIGIT ONE
0x2332	0xFF12	# FULLWIDTH DIGIT TWO
0x2333	0xFF13	# FULLWIDTH DIGIT THREE
0x2334	0xFF14	# FULLWIDTH DIGIT FOUR
0x2335	0xFF15	# FULLWIDTH DIGIT FIVE
0x2336	0xFF16	# FULLWIDTH DIGIT SIX
0x2337	0xFF17	# FULLWIDTH DIGIT SEVEN
0x2338	0xFF18	# FULLWIDTH DIGIT EIGHT
0x2339	0xFF19	# FULLWIDTH DIGIT NINE
0x233A	0xFF1A	# FULLWIDTH COLON
0x233B	0xFF1B	# FULLWIDTH SEMICOLON
0x233C	0xFF1C	# FULLWIDTH LESS-THAN SIGN
0x233D	0xFF1D	# FULLWIDTH EQUALS SIGN
0x233E	0xFF1E	# FULLWIDTH GREATER-THAN SIGN
0x233F	0xFF1F	# FULLWIDTH QUESTION MARK
0x2340	0xFF20	# FULLWIDTH COMMERCIAL AT
0x2341	0xFF21	# FULLWIDTH LATIN CAPITAL LETTER A
0x2342	0xFF22	# FULLWIDTH LATIN CAPITAL LETTER B
0x2343	0xFF23	# FULLWIDTH LATIN CAPITAL LETTER C
0x2344	0xFF24	# FULLWIDTH LATIN CAPITAL LETTER D
0x2345	0xFF25	# FULLWIDTH LATIN CAPITAL LETTER E
0x2346	0xFF26	# FULLWIDTH LATIN CAPITAL LETTER F
0x2347	0xFF27	# FULLWIDTH LATIN CAPITAL LETTER G
0x2348	0xFF28	# FULLWIDTH LATIN CAPITAL LETTER H
0x2349	0xFF29	# FULLWIDTH LATIN CAPITAL LETTER I
0x234A	0xFF2A	# FULLWIDTH LATIN CAPITAL LETTER J
0x234B	0xFF2B	# FULLWIDTH LATIN CAPITAL LETTER K
0x234C	0xFF2C	# FULLWIDTH LATIN CAPITAL LETTER L
0x234D	0xFF2D	# FULLWIDTH LATIN CAPITAL LETTER M
0x234E	0xFF2E	# FULLWIDTH LATIN CAPITAL LETTER N
0x234F	0xFF2F	# FULLWIDTH LATIN CAPITAL LETTER O
0x2350	0xFF30	# FULLWIDTH LATIN CAPITAL LETTER P
0x2351	0xFF31	# FULLWIDTH LATIN CAPITAL LETTER Q
0x2352	0xFF32	# FULLWIDTH LATIN CAPITAL LETTER R
0x2353	0xFF33	# FULLWIDTH LATIN CAPITAL LETTER S
0x2354	0xFF34	# FULLWIDTH LATIN CAPITAL LETTER T
0x2355	0xFF35	# FULLWIDTH LATIN CAPITAL LETTER U
0x2356	0xFF36	# FULLWIDTH LATIN CAPITAL LETTER V
0x2357	0xFF37	# FULLWIDTH LATIN CAPITAL LETTER W
0x2358	0xFF38	# FULLWIDTH LATIN CAPITAL LETTER X
0x2359	0xFF39	# FULLWIDTH LATIN CAPITAL LETTER Y
0x235A	0xFF3A	# FULLWIDTH LATIN CAPITAL LETTER Z
0x235B	0xFF3B	# FULLWIDTH LEFT SQUARE BRACKET
0x235C	0xFF3C	# FULLWIDTH REVERSE SOLIDUS
0x235D	0xFF3D	# FULLWIDTH RIGHT SQUARE BRACKET
0x235E	0xFF3E	# FULLWIDTH CIRCUMFLEX ACCENT
0x235F	0xFF3F	# FULLWIDTH LOW LINE
0x2360	0xFF40	# FULLWIDTH GRAVE ACCENT
0x2361	0xFF41	# FULLWIDTH LATIN SMALL LETTER A
0x2362	0xFF42	# FULLWIDTH LATIN SMALL LETTER B
0x2363	0xFF43	# FULLWIDTH LATIN SMALL LETTER C
0x2364	0xFF44	# FULLWIDTH LATIN SMALL LETTER D
0x2365	0xFF45	# FULLWIDTH LATIN SMALL LETTER E
0x2366	0xFF46	# FULLWIDTH LATIN SMALL LETTER F
0x2367	0xFF47	# FULLWIDTH LATIN SMALL LETTER G
0x2368	0xFF48	# FULLWIDTH LATIN SMALL LETTER H
0x2369	0xFF49	# FULLWIDTH LATIN SMALL LETTER I
0x236A	0xFF4A	# FULLWIDTH LATIN SMALL LETTER J
0x236B	0xFF4B	# FULLWIDTH LATIN SMALL LETTER K
0x236C	0xFF4C	# FULLWIDTH LATIN SMALL LETTER L
0x236D	0xFF4D	# FULLWIDTH LATIN SMALL LETTER M
0x236E	0xFF4E	# FULLWIDTH LATIN SMALL LETTER N
0x236F	0xFF4F	# FULLWIDTH LATIN SMALL LETTER O
0x2370	0xFF50	# FULLWIDTH LATIN SMALL LETTER P
0x2371	0xFF51	# FULLWIDTH LATIN SMALL LETTER Q
0x2372	0xFF52	# FULLWIDTH LATIN SMALL LETTER R
0x2373	0xFF53	# FULLWIDTH LATIN SMALL LETTER S
0x2374	0xFF54	# FULLWIDTH LATIN SMALL LETTER T
0x2375	0xFF55	# FULLWIDTH LATIN SMALL LETTER U
0x2376	0xFF56	# FULLWIDTH LATIN SMALL LETTER V
0x2377	0xFF57	# FULLWIDTH LATIN SMALL LETTER W
0x2378	0xFF58	# FULLWIDTH LATIN SMALL LETTER X
0x2379	0xFF59	# FULLWIDTH LATIN SMALL LETTER Y
0x237A	0xFF5A	# FULLWIDTH LATIN SMALL LETTER Z
0x237B	0xFF5B	# FULLWIDTH LEFT CURLY BRACKET
0x237C	0xFF5C	# FULLWIDTH VERTICAL LINE
0x237D	0xFF5D	# FULLWIDTH RIGHT CURLY BRACKET
0x237E	0xFFE3	# FULLWIDTH MACRON
0x2421	0x3041	# HIRAGANA LETTER SMALL A
0x2422	0x3042	# HIRAGANA LETTER A
0x2423	0x3043	# HIRAGANA LETTER SMALL I
0x2424	0x3044	# HIRAGANA LETTER I
0x2425	0x3045	# HIRAGANA LETTER SMALL U
0x2426	0x3046	# HIRAGANA LETTER U
0x2427	0x3047	# HIRAGANA LETTER SMALL E
0x2428	0x3048	# HIRAGANA LETTER E
0x2429	0x3049	# HIRAGANA LETTER SMALL O
0x242A	0x304A	# HIRAGANA LETTER O
0x242B	0x304B	# HIRAGANA LETTER KA
0x242C	0x304C	# HIRAGANA LETTER GA
0x242D	0x304D	# HIRAGANA LETTER KI
0x242E	0x304E	# HIRAGANA LETTER GI
0x242F	0x304F	# HIRAGANA LETTER KU
0x2430	0x3050	# HIRAGANA LETTER GU
0x2431	0x3051	# HIRAGANA LETTER KE
0x2432	0x3052	# HIRAGANA LETTER GE
0x2433	0x3053	# HIRAGANA LETTER KO
0x2434	0x3054	# HIRAGANA LETTER GO
0x2435	0x3055	# HIRAGANA LETTER SA
0x2436	0x3056	# HIRAGANA LETTER ZA
0x2437	0x3057	# HIRAGANA LETTER SI
0x2438	0x3058	# HIRAGANA LETTER ZI
0x2439	0x3059	# HIRAGANA LETTER SU
0x243A	0x305A	# HIRAGANA LETTER ZU
0x243B	0x305B	# HIRAGANA LETTER SE
0x243C	0x305C	# HIRAGANA LETTER ZE
0x243D	0x305D	# HIRAGANA LETTER SO
0x243E	0x305E	# HIRAGANA LETTER ZO
0x243F	0x305F	# HIRAGANA LETTER TA
0x2440	0x3060	# HIRAGANA LETTER DA
0x2441	0x3061	# HIRAGANA LETTER TI
0x2442	0x3062	# HIRAGANA LETTER DI
0x2443	0x3063	# HIRAGANA LETTER SMALL TU
0x2444	0x3064	# HIRAGANA LETTER TU
0x2445	0x3065	# HIRAGANA LETTER DU
0x2446	0x3066	# HIRAGANA LETTER TE
0x2447	0x3067	# HIRAGANA LETTER DE
0x2448	0x3068	# HIRAGANA LETTER TO
0x2449	0x3069	# HIRAGANA LETTER DO
0x244A	0x306A	# HIRAGANA LETTER NA
0x244B	0x306B	# HIRAGANA LETTER NI
0x244C	0x306C	# HIRAGANA LETTER NU
0x244D	0x306D	# HIRAGANA LETTER NE
0x244E	0x306E	# HIRAGANA LETTER NO
0x244F	0x306F	# HIRAGANA LETTER HA
0x2450	0x3070	# HIRAGANA LETTER BA
0x2451	0x3071	# HIRAGANA LETTER PA
0x2452	0x3072	# HIRAGANA LETTER HI
0x2453	0x3073	# HIRAGANA LETTER BI
0x2454	0x3074	# HIRAGANA LETTER PI
0x2455	0x3075	# HIRAGANA LETTER HU
0x2456	0x3076	# HIRAGANA LETTER BU
0x2457	0x3077	# HIRAGANA LETTER PU
0x2458	0x3078	# HIRAGANA LETTER HE
0x2459	0x3079	# HIRAGANA LETTER BE
0x245A	0x307A	# HIRAGANA LETTER PE
0x245B	0x307B	# HIRAGANA LETTER HO
0x245C	0x307C	# HIRAGANA LETTER BO
0x245D	0x307D	# HIRAGANA LETTER PO
0x245E	0x307E	# HIRAGANA LETTER MA
0x245F	0x307F	# HIRAGANA LETTER MI
0x2460	0x3080	# HIRAGANA LETTER MU
0x2461	0x3081	# HIRAGANA LETTER ME
0x2462	0x3082	# HIRAGANA LETTER MO
0x2463	0x3083	# HIRAGANA LETTER SMALL YA
0x2464	0x3084	# HIRAGANA LETTER YA
0x2465	0x3085	# HIRAGANA LETTER SMALL YU
0x2466	0x3086	# HIRAGANA LETTER YU
0x2467	0x3087	# HIRAGANA LETTER SMALL YO
0x2468	0x3088	# HIRAGANA LETTER YO
0x2469	0x3089	# HIRAGANA LETTER RA
0x246A	0x308A	# HIRAGANA LETTER RI
0x246B	0x308B	# HIRAGANA LETTER RU
0x246C	0x308C	# HIRAGANA LETTER RE
0x246D	0x308D	# HIRAGANA LETTER RO
0x246E	0x308E	# HIRAGANA LETTER SMALL WA
0x246F	0x308F	# HIRAGANA LETTER WA
0x2470	0x3090	# HIRAGANA LETTER WI
0x2471	0x3091	# HIRAGANA LETTER WE
0x2472	0x3092	# HIRAGANA LETTER WO
0x2473	0x3093	# HIRAGANA LETTER N
0x2521	0x30A1	# KATAKANA LETTER SMALL A
0x2522	0x30A2	# KATAKANA LETTER A
0x2523	0x30A3	# KATAKANA LETTER SMALL I
0x2524	0x30A4	# KATAKANA LETTER I
0x2525	0x30A5	# KATAKANA LETTER SMALL U
0x2526	0x30A6	# KATAKANA LETTER U
0x2527	0x30A7	# KATAKANA LETTER SMALL E
0x2528	0x30A8	# KATAKANA LETTER E
0x2529	0x30A9	# KATAKANA LETTER SMALL O
0x252A	0x30AA	# KATAKANA LETTER O
0x252B	0x30AB	# KATAKANA LETTER KA
0x252C	0x30AC	# KATAKANA LETTER GA
0x252D	0x30AD	# KATAKANA LETTER KI
0x252E	0x30AE	# KATAKANA LETTER GI
0x252F	0x30AF	# KATAKANA LETTER KU
0x2530	0x30B0	# KATAKANA LETTER GU
0x2531	0x30B1	# KATAKANA LETTER KE
0x2532	0x30B2	# KATAKANA LETTER GE
0x2533	0x30B3	# KATAKANA LETTER KO
0x2534	0x30B4	# KATAKANA LETTER GO
0x2535	0x30B5	# KATAKANA LETTER SA
0x2536	0x30B6	# KATAKANA LETTER ZA
0x2537	0x30B7	# KATAKANA LETTER SI
0x2538	0x30B8	# KATAKANA LETTER ZI
0x2539	0x30B9	# KATAKANA LETTER SU
0x253A	0x30BA	# KATAKANA LETTER ZU
0x253B	0x30BB	# KATAKANA LETTER SE
0x253C	0x30BC	# KATAKANA LETTER ZE
0x253D	0x30BD	# KATAKANA LETTER SO
0x253E	0x30BE	# KATAKANA LETTER ZO
0x253F	0x30BF	# KATAKANA LETTER TA
0x2540	0x30C0	# KATAKANA LETTER DA
0x2541	0x30C1	# KATAKANA LETTER TI
0x2542	0x30C2	# KATAKANA LETTER DI
0x2543	0x30C3	# KATAKANA LETTER SMALL TU
0x2544	0x30C4	# KATAKANA LETTER TU
0x2545	0x30C5	# KATAKANA LETTER DU
0x2546	0x30C6	# KATAKANA LETTER TE
0x2547	0x30C7	# KATAKANA LETTER DE
0x2548	0x30C8	# KATAKANA LETTER TO
0x2549	0x30C9	# KATAKANA LETTER DO
0x254A	0x30CA	# KATAKANA LETTER NA
0x254B	0x30CB	# KATAKANA LETTER NI
0x254C	0x30CC	# KATAKANA LETTER NU
0x254D	0x30CD	# KATAKANA LETTER NE
0x254E	0x30CE	# KATAKANA LETTER NO
0x254F	0x30CF	# KATAKANA LETTER HA
0x2550	0x30D0	# KATAKANA LETTER BA
0x2551	0x30D1	# KATAKANA LETTER PA
0x2552	0x30D2	# KATAKANA LETTER HI
0x2553	0x30D3	# KATAKANA LETTER BI
0x2554	0x30D4	# KATAKANA LETTER PI
0x2555	0x30D5	# KATAKANA LETTER HU
0x2556	0x30D6	# KATAKANA LETTER BU
0x2557	0x30D7	# KATAKANA LETTER PU
0x2558	0x30D8	# KATAKANA LETTER HE
0x2559	0x30D9	# KATAKANA LETTER BE
0x255A	0x30DA	# KATAKANA LETTER PE
0x255B	0x30DB	# KATAKANA LETTER HO
0x255C	0x30DC	# KATAKANA LETTER BO
0x255D	0x30DD	# KATAKANA LETTER PO
0x255E	0x30DE	# KATAKANA LETTER MA
0x255F	0x30DF	# KATAKANA LETTER MI
0x2560	0x30E0	# KATAKANA LETTER MU
0x2561	0x30E1	# KATAKANA LETTER ME
0x2562	0x30E2	# KATAKANA LETTER MO
0x2563	0x30E3	# KATAKANA LETTER SMALL YA
0x2564	0x30E4	# KATAKANA LETTER YA
0x2565	0x30E5	# KATAKANA LETTER SMALL YU
0x2566	0x30E6	# KATAKANA LETTER YU
0x2567	0x30E7	# KATAKANA LETTER SMALL YO
0x2568	0x30E8	# KATAKANA LETTER YO
0x2569	0x30E9	# KATAKANA LETTER RA
0x256A	0x30EA	# KATAKANA LETTER RI
0x256B	0x30EB	# KATAKANA LETTER RU
0x256C	0x30EC	# KATAKANA LETTER RE
0x256D	0x30ED	# KATAKANA LETTER RO
0x256E	0x30EE	# KATAKANA LETTER SMALL WA
0x256F	0x30EF	# KATAKANA LETTER WA
0x2570	0x30F0	# KATAKANA LETTER WI
0x2571	0x30F1	# KATAKANA LETTER WE
0x2572	0x30F2	# KATAKANA LETTER WO
0x2573	0x30F3	# KATAKANA LETTER N
0x2574	0x30F4	# KATAKANA LETTER VU
0x2575	0x30F5	# KATAKANA LETTER SMALL KA
0x2576	0x30F6	# KATAKANA LETTER SMALL KE
0x2621	0x0391	# GREEK CAPITAL LETTER ALPHA
0x2622	0x0392	# GREEK CAPITAL LETTER BETA
0x2623	0x0393	# GREEK CAPITAL LETTER GAMMA
0x2624	0x0394	# GREEK CAPITAL LETTER DELTA
0x2625	0x0395	# GREEK CAPITAL LETTER EPSILON
0x2626	0x0396	# GREEK CAPITAL LETTER ZETA
0x2627	0x0397	# GREEK CAPITAL LETTER ETA
0x2628	0x0398	# GREEK CAPITAL LETTER THETA
0x2629	0x0399	# GREEK CAPITAL LETTER IOTA
0x262A	0x039A	# GREEK CAPITAL LETTER KAPPA
0x262B	0x039B	# GREEK CAPITAL LETTER LAMDA
0x262C	0x039C	# GREEK CAPITAL LETTER MU
0x262D	0x039D	# GREEK CAPITAL LETTER NU
0x262E	0x039E	# GREEK CAPITAL LETTER XI
0x262F	0x039F	# GREEK CAPITAL LETTER OMICRON
0x2630	0x03A0	# GREEK CAPITAL LETTER PI
0x2631	0x03A1	# GREEK CAPITAL LETTER RHO
0x2632	0x03A3	# GREEK CAPITAL LETTER SIGMA
0x2633	0x03A4	# GREEK CAPITAL LETTER TAU
0x2634	0x03A5	# GREEK CAPITAL LETTER UPSILON
0x2635	0x03A6	# GREEK CAPITAL LETTER PHI
0x2636	0x03A7	# GREEK CAPITAL LETTER CHI
0x2637	0x03A8	# GREEK CAPITAL LETTER PSI
0x2638	0x03A9	# GREEK CAPITAL LETTER OMEGA
0x2641	0x03B1	# GREEK SMALL LETTER ALPHA
0x2642	0x03B2	# GREEK SMALL LETTER BETA
0x2643	0x03B3	# GREEK SMALL LETTER GAMMA
0x2644	0x03B4	# GREEK SMALL LETTER DELTA
0x2645	0x03B5	# GREEK SMALL LETTER EPSILON
0x2646	0x03B6	# GREEK SMALL LETTER ZETA
0x2647	0x03B7	# GREEK SMALL LETTER ETA
0x2648	0x03B8	# GREEK SMALL LETTER THETA
0x2649	0x03B9	# GREEK SMALL LETTER IOTA
0x264A	0x03BA	# GREEK SMALL LETTER KAPPA
0x264B	0x03BB	# GREEK SMALL LETTER LAMDA
0x264C	0x03BC	# GREEK SMALL LETTER MU
0x264D	0x03BD	# GREEK SMALL LETTER NU
0x264E	0x03BE	# GREEK SMALL LETTER XI
0x264F	0x03BF	# GREEK SMALL LETTER OMICRON
0x2650	0x03C0	# GREEK SMALL LETTER PI
0x2651	0x03C1	# GREEK SMALL LETTER RHO
0x2652	0x03C3	# GREEK SMALL LETTER SIGMA
0x2653	0x03C4	# GREEK SMALL LETTER TAU
0x2654	0x03C5	# GREEK SMALL LETTER UPSILON
0x2655	0x03C6	# GREEK SMALL LETTER PHI
0x2656	0x03C7	# GREEK SMALL LETTER CHI
0x2657	0x03C8	# GREEK SMALL LETTER PSI
0x2658	0x03C9	# GREEK SMALL LETTER OMEGA
0x2721	0x0410	# CYRILLIC CAPITAL LETTER A
0x2722	0x0411	# CYRILLIC CAPITAL LETTER BE
0x2723	0x0412	# CYRILLIC CAPITAL LETTER VE
0x2724	0x0413	# CYRILLIC CAPITAL LETTER GHE
0x2725	0x0414	# CYRILLIC CAPITAL LETTER DE
0x2726	0x0415	# CYRILLIC CAPITAL LETTER IE
0x2727	0x0401	# CYRILLIC CAPITAL LETTER IO
0x2728	0x0416	# CYRILLIC CAPITAL LETTER ZHE
0x2729	0x0417	# CYRILLIC CAPITAL LETTER ZE
0x272A	0x0418	# CYRILLIC CAPITAL LETTER I
0x272B	0x0419	# CYRILLIC CAPITAL LETTER SHORT I
0x272C	0x041A	# CYRILLIC CAPITAL LETTER KA
0x272D	0x041B	# CYRILLIC CAPITAL LETTER EL
0x272E	0x041C	# CYRILLIC CAPITAL LETTER EM
0x272F	0x041D	# CYRILLIC CAPITAL LETTER EN
0x2730	0x041E	# CYRILLIC CAPITAL LETTER O
0x2731	0x041F	# CYRILLIC CAPITAL LETTER PE
0x2732	0x0420	# CYRILLIC CAPITAL LETTER ER
0x2733	0x0421	# CYRILLIC CAPITAL LETTER ES
0x2734	0x0422	# CYRILLIC CAPITAL LETTER TE
0x2735	0x0423	# CYRILLIC CAPITAL LETTER U
0x2736	0x0424	# CYRILLIC CAPITAL LETTER EF
0x2737	0x0425	# CYRILLIC CAPITAL LETTER HA
0x2738	0x0426	# CYRILLIC CAPITAL LETTER TSE
0x2739	0x0427	# CYRILLIC CAPITAL LETTER CHE
0x273A	0x0428	# CYRILLIC CAPITAL LETTER SHA
0x273B	0x0429	# CYRILLIC CAPITAL LETTER SHCHA
0x273C	0x042A	# CYRILLIC CAPITAL LETTER HARD SIGN
0x273D	0x042B	# CYRILLIC CAPITAL LETTER YERU
0x273E	0x042C	# CYRILLIC CAPITAL LETTER SOFT SIGN
0x273F	0x042D	# CYRILLIC CAPITAL LETTER E
0x2740	0x042E	# CYRILLIC CAPITAL LETTER YU
0x2741	0x042F	# CYRILLIC CAPITAL LETTER YA
0x2751	0x0430	# CYRILLIC SMALL LETTER A
0x2752	0x0431	# CYRILLIC SMALL LETTER BE
0x2753	0x0432	# CYRILLIC SMALL LETTER VE
0x2754	0x0433	# CYRILLIC SMALL LETTER GHE
0x2755	0x0434	# CYRILLIC SMALL LETTER DE
0x2756	0x0435	# CYRILLIC SMALL LETTER IE
0x2757	0x0451	# CYRILLIC SMALL LETTER IO
0x2758	0x0436	# CYRILLIC SMALL LETTER ZHE
0x2759	0x0437	# CYRILLIC SMALL LETTER ZE
0x275A	0x0438	# CYRILLIC SMALL LETTER I
0x275B	0x0439	# CYRILLIC SMALL LETTER SHORT I
0x275C	0x043A	# CYRILLIC SMALL LETTER KA
0x275D	0x043B	# CYRILLIC SMALL LETTER EL
0x275E	0x043C	# CYRILLIC SMALL LETTER EM
0x275F	0x043D	# CYRILLIC SMALL LETTER EN
0x2760	0x043E	# CYRILLIC SMALL LETTER O
0x2761	0x043F	# CYRILLIC SMALL LETTER PE
0x2762	0x0440	# CYRILLIC SMALL LETTER ER
0x2763	0x0441	# CYRILLIC SMALL LETTER ES
0x2764	0x0442	# CYRILLIC SMALL LETTER TE
0x2765	0x0443	# CYRILLIC SMALL LETTER U
0x2766	0x0444	# CYRILLIC SMALL LETTER EF
0x2767	0x0445	# CYRILLIC SMALL LETTER HA
0x2768	0x0446	# CYRILLIC SMALL LETTER TSE
0x2769	0x0447	# CYRILLIC SMALL LETTER CHE
0x276A	0x0448	# CYRILLIC SMALL LETTER SHA
0x276B	0x0449	# CYRILLIC SMALL LETTER SHCHA
0x276C	0x044A	# CYRILLIC SMALL LETTER HARD SIGN
0x276D	0x044B	# CYRILLIC SMALL LETTER YERU
0x276E	0x044C	# CYRILLIC SMALL LETTER SOFT SIGN
0x276F	0x044D	# CYRILLIC SMALL LETTER E
0x2770	0x044E	# CYRILLIC SMALL LETTER YU
0x2771	0x044F	# CYRILLIC SMALL LETTER YA
0x2821	0x0101	# LATIN SMALL LETTER A WITH MACRON
0x2822	0x00E1	# LATIN SMALL LETTER A WITH ACUTE
0x2823	0x01CE	# LATIN SMALL LETTER A WITH CARON
0x2824	0x00E0	# LATIN SMALL LETTER A WITH GRAVE
0x2825	0x0113	# LATIN SMALL LETTER E WITH MACRON
0x2826	0x00E9	# LATIN SMALL LETTER E WITH ACUTE
0x2827	0x011B	# LATIN SMALL LETTER E WITH CARON
0x2828	0x00E8	# LATIN SMALL LETTER E WITH GRAVE
0x2829	0x012B	# LATIN SMALL LETTER I WITH MACRON
0x282A	0x00ED	# LATIN SMALL LETTER I WITH ACUTE
0x282B	0x01D0	# LATIN SMALL LETTER I WITH CARON
0x282C	0x00EC	# LATIN SMALL LETTER I WITH GRAVE
0x282D	0x014D	# LATIN SMALL LETTER O WITH MACRON
0x282E	0x00F3	# LATIN SMALL LETTER O WITH ACUTE
0x282F	0x01D2	# LATIN SMALL LETTER O WITH CARON
0x2830	0x00F2	# LATIN SMALL LETTER O WITH GRAVE
0x2831	0x016B	# LATIN SMALL LETTER U WITH MACRON
0x2832	0x00FA	# LATIN SMALL LETTER U WITH ACUTE
0x2833	0x01D4	# LATIN SMALL LETTER U WITH CARON
0x2834	0x00F9	# LATIN SMALL LETTER U WITH GRAVE
0x2835	0x01D6	# LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
0x2836	0x01D8	# LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
0x2837	0x01DA	# LATIN SMALL LETTER U WITH DIAERESIS AND CARON
0x2838	0x01DC	# LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
0x2839	0x00FC	# LATIN SMALL LETTER U WITH DIAERESIS
0x283A	0x00EA	# LATIN SMALL LETTER E WITH CIRCUMFLEX
0x2845	0x3105	# BOPOMOFO LETTER B
0x2846	0x3106	# BOPOMOFO LETTER P
0x2847	0x3107	# BOPOMOFO LETTER M
0x2848	0x3108	# BOPOMOFO LETTER F
0x2849	0x3109	# BOPOMOFO LETTER D
0x284A	0x310A	# BOPOMOFO LETTER T
0x284B	0x310B	# BOPOMOFO LETTER N
0x284C	0x310C	# BOPOMOFO LETTER L
0x284D	0x310D	# BOPOMOFO LETTER G
0x284E	0x310E	# BOPOMOFO LETTER K
0x284F	0x310F	# BOPOMOFO LETTER H
0x2850	0x3110	# BOPOMOFO LETTER J
0x2851	0x3111	# BOPOMOFO LETTER Q
0x2852	0x3112	# BOPOMOFO LETTER X
0x2853	0x3113	# BOPOMOFO LETTER ZH
0x2854	0x3114	# BOPOMOFO LETTER CH
0x2855	0x3115	# BOPOMOFO LETTER SH
0x2856	0x3116	# BOPOMOFO LETTER R
0x2857	0x3117	# BOPOMOFO LETTER Z
0x2858	0x3118	# BOPOMOFO LETTER C
0x2859	0x3119	# BOPOMOFO LETTER S
0x285A	0x311A	# BOPOMOFO LETTER A
0x285B	0x311B	# BOPOMOFO LETTER O
0x285C	0x311C	# BOPOMOFO LETTER E
0x285D	0x311D	# BOPOMOFO LETTER EH
0x285E	0x311E	# BOPOMOFO LETTER AI
0x285F	0x311F	# BOPOMOFO LETTER EI
0x2860	0x3120	# BOPOMOFO LETTER AU
0x2861	0x3121	# BOPOMOFO LETTER OU
0x2862	0x3122	# BOPOMOFO LETTER AN
0x2863	0x3123	# BOPOMOFO LETTER EN
0x2864	0x3124	# BOPOMOFO LETTER ANG
0x2865	0x3125	# BOPOMOFO LETTER ENG
0x2866	0x3126	# BOPOMOFO LETTER ER
0x2867	0x3127	# BOPOMOFO LETTER I
0x2868	0x3128	# BOPOMOFO LETTER U
0x2869	0x3129	# BOPOMOFO LETTER IU
0x2924	0x2500	# BOX DRAWINGS LIGHT HORIZONTAL
0x2925	0x2501	# BOX DRAWINGS HEAVY HORIZONTAL
0x2926	0x2502	# BOX DRAWINGS LIGHT VERTICAL
0x2927	0x2503	# BOX DRAWINGS HEAVY VERTICAL
0x2928	0x2504	# BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
0x2929	0x2505	# BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
0x292A	0x2506	# BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
0x292B	0x2507	# BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
0x292C	0x2508	# BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
0x292D	0x2509	# BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
0x292E	0x250A	# BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
0x292F	0x250B	# BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
0x2930	0x250C	# BOX DRAWINGS LIGHT DOWN AND RIGHT
0x2931	0x250D	# BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
0x2932	0x250E	# BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
0x2933	0x250F	# BOX DRAWINGS HEAVY DOWN AND RIGHT
0x2934	0x2510	# BOX DRAWINGS LIGHT DOWN AND LEFT
0x2935	0x2511	# BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
0x2936	0x2512	# BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
0x2937	0x2513	# BOX DRAWINGS HEAVY DOWN AND LEFT
0x2938	0x2514	# BOX DRAWINGS LIGHT UP AND RIGHT
0x2939	0x2515	# BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
0x293A	0x2516	# BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
0x293B	0x2517	# BOX DRAWINGS HEAVY UP AND RIGHT
0x293C	0x2518	# BOX DRAWINGS LIGHT UP AND LEFT
0x293D	0x2519	# BOX DRAWINGS UP LIGHT AND LEFT HEAVY
0x293E	0x251A	# BOX DRAWINGS UP HEAVY AND LEFT LIGHT
0x293F	0x251B	# BOX DRAWINGS HEAVY UP AND LEFT
0x2940	0x251C	# BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0x2941	0x251D	# BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
0x2942	0x251E	# BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
0x2943	0x251F	# BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
0x2944	0x2520	# BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
0x2945	0x2521	# BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
0x2946	0x2522	# BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
0x2947	0x2523	# BOX DRAWINGS HEAVY VERTICAL AND RIGHT
0x2948	0x2524	# BOX DRAWINGS LIGHT VERTICAL AND LEFT
0x2949	0x2525	# BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
0x294A	0x2526	# BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
0x294B	0x2527	# BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
0x294C	0x2528	# BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
0x294D	0x2529	# BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
0x294E	0x252A	# BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
0x294F	0x252B	# BOX DRAWINGS HEAVY VERTICAL AND LEFT
0x2950	0x252C	# BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0x2951	0x252D	# BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
0x2952	0x252E	# BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
0x2953	0x252F	# BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
0x2954	0x2530	# BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
0x2955	0x2531	# BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
0x2956	0x2532	# BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
0x2957	0x2533	# BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
0x2958	0x2534	# BOX DRAWINGS LIGHT UP AND HORIZONTAL
0x2959	0x2535	# BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
0x295A	0x2536	# BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
0x295B	0x2537	# BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
0x295C	0x2538	# BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
0x295D	0x2539	# BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
0x295E	0x253A	# BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
0x295F	0x253B	# BOX DRAWINGS HEAVY UP AND HORIZONTAL
0x2960	0x253C	# BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0x2961	0x253D	# BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
0x2962	0x253E	# BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
0x2963	0x253F	# BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
0x2964	0x2540	# BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
0x2965	0x2541	# BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
0x2966	0x2542	# BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
0x2967	0x2543	# BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
0x2968	0x2544	# BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
0x2969	0x2545	# BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
0x296A	0x2546	# BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
0x296B	0x2547	# BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
0x296C	0x2548	# BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
0x296D	0x2549	# BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
0x296E	0x254A	# BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
0x296F	0x254B	# BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
0x3021	0x554A	# <CJK>
0x3022	0x963F	# <CJK>
0x3023	0x57C3	# <CJK>
0x3024	0x6328	# <CJK>
0x3025	0x54CE	# <CJK>
0x3026	0x5509	# <CJK>
0x3027	0x54C0	# <CJK>
0x3028	0x7691	# <CJK>
0x3029	0x764C	# <CJK>
0x302A	0x853C	# <CJK>
0x302B	0x77EE	# <CJK>
0x302C	0x827E	# <CJK>
0x302D	0x788D	# <CJK>
0x302E	0x7231	# <CJK>
0x302F	0x9698	# <CJK>
0x3030	0x978D	# <CJK>
0x3031	0x6C28	# <CJK>
0x3032	0x5B89	# <CJK>
0x3033	0x4FFA	# <CJK>
0x3034	0x6309	# <CJK>
0x3035	0x6697	# <CJK>
0x3036	0x5CB8	# <CJK>
0x3037	0x80FA	# <CJK>
0x3038	0x6848	# <CJK>
0x3039	0x80AE	# <CJK>
0x303A	0x6602	# <CJK>
0x303B	0x76CE	# <CJK>
0x303C	0x51F9	# <CJK>
0x303D	0x6556	# <CJK>
0x303E	0x71AC	# <CJK>
0x303F	0x7FF1	# <CJK>
0x3040	0x8884	# <CJK>
0x3041	0x50B2	# <CJK>
0x3042	0x5965	# <CJK>
0x3043	0x61CA	# <CJK>
0x3044	0x6FB3	# <CJK>
0x3045	0x82AD	# <CJK>
0x3046	0x634C	# <CJK>
0x3047	0x6252	# <CJK>
0x3048	0x53ED	# <CJK>
0x3049	0x5427	# <CJK>
0x304A	0x7B06	# <CJK>
0x304B	0x516B	# <CJK>
0x304C	0x75A4	# <CJK>
0x304D	0x5DF4	# <CJK>
0x304E	0x62D4	# <CJK>
0x304F	0x8DCB	# <CJK>
0x3050	0x9776	# <CJK>
0x3051	0x628A	# <CJK>
0x3052	0x8019	# <CJK>
0x3053	0x575D	# <CJK>
0x3054	0x9738	# <CJK>
0x3055	0x7F62	# <CJK>
0x3056	0x7238	# <CJK>
0x3057	0x767D	# <CJK>
0x3058	0x67CF	# <CJK>
0x3059	0x767E	# <CJK>
0x305A	0x6446	# <CJK>
0x305B	0x4F70	# <CJK>
0x305C	0x8D25	# <CJK>
0x305D	0x62DC	# <CJK>
0x305E	0x7A17	# <CJK>
0x305F	0x6591	# <CJK>
0x3060	0x73ED	# <CJK>
0x3061	0x642C	# <CJK>
0x3062	0x6273	# <CJK>
0x3063	0x822C	# <CJK>
0x3064	0x9881	# <CJK>
0x3065	0x677F	# <CJK>
0x3066	0x7248	# <CJK>
0x3067	0x626E	# <CJK>
0x3068	0x62CC	# <CJK>
0x3069	0x4F34	# <CJK>
0x306A	0x74E3	# <CJK>
0x306B	0x534A	# <CJK>
0x306C	0x529E	# <CJK>
0x306D	0x7ECA	# <CJK>
0x306E	0x90A6	# <CJK>
0x306F	0x5E2E	# <CJK>
0x3070	0x6886	# <CJK>
0x3071	0x699C	# <CJK>
0x3072	0x8180	# <CJK>
0x3073	0x7ED1	# <CJK>
0x3074	0x68D2	# <CJK>
0x3075	0x78C5	# <CJK>
0x3076	0x868C	# <CJK>
0x3077	0x9551	# <CJK>
0x3078	0x508D	# <CJK>
0x3079	0x8C24	# <CJK>
0x307A	0x82DE	# <CJK>
0x307B	0x80DE	# <CJK>
0x307C	0x5305	# <CJK>
0x307D	0x8912	# <CJK>
0x307E	0x5265	# <CJK>
0x3121	0x8584	# <CJK>
0x3122	0x96F9	# <CJK>
0x3123	0x4FDD	# <CJK>
0x3124	0x5821	# <CJK>
0x3125	0x9971	# <CJK>
0x3126	0x5B9D	# <CJK>
0x3127	0x62B1	# <CJK>
0x3128	0x62A5	# <CJK>
0x3129	0x66B4	# <CJK>
0x312A	0x8C79	# <CJK>
0x312B	0x9C8D	# <CJK>
0x312C	0x7206	# <CJK>
0x312D	0x676F	# <CJK>
0x312E	0x7891	# <CJK>
0x312F	0x60B2	# <CJK>
0x3130	0x5351	# <CJK>
0x3131	0x5317	# <CJK>
0x3132	0x8F88	# <CJK>
0x3133	0x80CC	# <CJK>
0x3134	0x8D1D	# <CJK>
0x3135	0x94A1	# <CJK>
0x3136	0x500D	# <CJK>
0x3137	0x72C8	# <CJK>
0x3138	0x5907	# <CJK>
0x3139	0x60EB	# <CJK>
0x313A	0x7119	# <CJK>
0x313B	0x88AB	# <CJK>
0x313C	0x5954	# <CJK>
0x313D	0x82EF	# <CJK>
0x313E	0x672C	# <CJK>
0x313F	0x7B28	# <CJK>
0x3140	0x5D29	# <CJK>
0x3141	0x7EF7	# <CJK>
0x3142	0x752D	# <CJK>
0x3143	0x6CF5	# <CJK>
0x3144	0x8E66	# <CJK>
0x3145	0x8FF8	# <CJK>
0x3146	0x903C	# <CJK>
0x3147	0x9F3B	# <CJK>
0x3148	0x6BD4	# <CJK>
0x3149	0x9119	# <CJK>
0x314A	0x7B14	# <CJK>
0x314B	0x5F7C	# <CJK>
0x314C	0x78A7	# <CJK>
0x314D	0x84D6	# <CJK>
0x314E	0x853D	# <CJK>
0x314F	0x6BD5	# <CJK>
0x3150	0x6BD9	# <CJK>
0x3151	0x6BD6	# <CJK>
0x3152	0x5E01	# <CJK>
0x3153	0x5E87	# <CJK>
0x3154	0x75F9	# <CJK>
0x3155	0x95ED	# <CJK>
0x3156	0x655D	# <CJK>
0x3157	0x5F0A	# <CJK>
0x3158	0x5FC5	# <CJK>
0x3159	0x8F9F	# <CJK>
0x315A	0x58C1	# <CJK>
0x315B	0x81C2	# <CJK>
0x315C	0x907F	# <CJK>
0x315D	0x965B	# <CJK>
0x315E	0x97AD	# <CJK>
0x315F	0x8FB9	# <CJK>
0x3160	0x7F16	# <CJK>
0x3161	0x8D2C	# <CJK>
0x3162	0x6241	# <CJK>
0x3163	0x4FBF	# <CJK>
0x3164	0x53D8	# <CJK>
0x3165	0x535E	# <CJK>
0x3166	0x8FA8	# <CJK>
0x3167	0x8FA9	# <CJK>
0x3168	0x8FAB	# <CJK>
0x3169	0x904D	# <CJK>
0x316A	0x6807	# <CJK>
0x316B	0x5F6A	# <CJK>
0x316C	0x8198	# <CJK>
0x316D	0x8868	# <CJK>
0x316E	0x9CD6	# <CJK>
0x316F	0x618B	# <CJK>
0x3170	0x522B	# <CJK>
0x3171	0x762A	# <CJK>
0x3172	0x5F6C	# <CJK>
0x3173	0x658C	# <CJK>
0x3174	0x6FD2	# <CJK>
0x3175	0x6EE8	# <CJK>
0x3176	0x5BBE	# <CJK>
0x3177	0x6448	# <CJK>
0x3178	0x5175	# <CJK>
0x3179	0x51B0	# <CJK>
0x317A	0x67C4	# <CJK>
0x317B	0x4E19	# <CJK>
0x317C	0x79C9	# <CJK>
0x317D	0x997C	# <CJK>
0x317E	0x70B3	# <CJK>
0x3221	0x75C5	# <CJK>
0x3222	0x5E76	# <CJK>
0x3223	0x73BB	# <CJK>
0x3224	0x83E0	# <CJK>
0x3225	0x64AD	# <CJK>
0x3226	0x62E8	# <CJK>
0x3227	0x94B5	# <CJK>
0x3228	0x6CE2	# <CJK>
0x3229	0x535A	# <CJK>
0x322A	0x52C3	# <CJK>
0x322B	0x640F	# <CJK>
0x322C	0x94C2	# <CJK>
0x322D	0x7B94	# <CJK>
0x322E	0x4F2F	# <CJK>
0x322F	0x5E1B	# <CJK>
0x3230	0x8236	# <CJK>
0x3231	0x8116	# <CJK>
0x3232	0x818A	# <CJK>
0x3233	0x6E24	# <CJK>
0x3234	0x6CCA	# <CJK>
0x3235	0x9A73	# <CJK>
0x3236	0x6355	# <CJK>
0x3237	0x535C	# <CJK>
0x3238	0x54FA	# <CJK>
0x3239	0x8865	# <CJK>
0x323A	0x57E0	# <CJK>
0x323B	0x4E0D	# <CJK>
0x323C	0x5E03	# <CJK>
0x323D	0x6B65	# <CJK>
0x323E	0x7C3F	# <CJK>
0x323F	0x90E8	# <CJK>
0x3240	0x6016	# <CJK>
0x3241	0x64E6	# <CJK>
0x3242	0x731C	# <CJK>
0x3243	0x88C1	# <CJK>
0x3244	0x6750	# <CJK>
0x3245	0x624D	# <CJK>
0x3246	0x8D22	# <CJK>
0x3247	0x776C	# <CJK>
0x3248	0x8E29	# <CJK>
0x3249	0x91C7	# <CJK>
0x324A	0x5F69	# <CJK>
0x324B	0x83DC	# <CJK>
0x324C	0x8521	# <CJK>
0x324D	0x9910	# <CJK>
0x324E	0x53C2	# <CJK>
0x324F	0x8695	# <CJK>
0x3250	0x6B8B	# <CJK>
0x3251	0x60ED	# <CJK>
0x3252	0x60E8	# <CJK>
0x3253	0x707F	# <CJK>
0x3254	0x82CD	# <CJK>
0x3255	0x8231	# <CJK>
0x3256	0x4ED3	# <CJK>
0x3257	0x6CA7	# <CJK>
0x3258	0x85CF	# <CJK>
0x3259	0x64CD	# <CJK>
0x325A	0x7CD9	# <CJK>
0x325B	0x69FD	# <CJK>
0x325C	0x66F9	# <CJK>
0x325D	0x8349	# <CJK>
0x325E	0x5395	# <CJK>
0x325F	0x7B56	# <CJK>
0x3260	0x4FA7	# <CJK>
0x3261	0x518C	# <CJK>
0x3262	0x6D4B	# <CJK>
0x3263	0x5C42	# <CJK>
0x3264	0x8E6D	# <CJK>
0x3265	0x63D2	# <CJK>
0x3266	0x53C9	# <CJK>
0x3267	0x832C	# <CJK>
0x3268	0x8336	# <CJK>
0x3269	0x67E5	# <CJK>
0x326A	0x78B4	# <CJK>
0x326B	0x643D	# <CJK>
0x326C	0x5BDF	# <CJK>
0x326D	0x5C94	# <CJK>
0x326E	0x5DEE	# <CJK>
0x326F	0x8BE7	# <CJK>
0x3270	0x62C6	# <CJK>
0x3271	0x67F4	# <CJK>
0x3272	0x8C7A	# <CJK>
0x3273	0x6400	# <CJK>
0x3274	0x63BA	# <CJK>
0x3275	0x8749	# <CJK>
0x3276	0x998B	# <CJK>
0x3277	0x8C17	# <CJK>
0x3278	0x7F20	# <CJK>
0x3279	0x94F2	# <CJK>
0x327A	0x4EA7	# <CJK>
0x327B	0x9610	# <CJK>
0x327C	0x98A4	# <CJK>
0x327D	0x660C	# <CJK>
0x327E	0x7316	# <CJK>
0x3321	0x573A	# <CJK>
0x3322	0x5C1D	# <CJK>
0x3323	0x5E38	# <CJK>
0x3324	0x957F	# <CJK>
0x3325	0x507F	# <CJK>
0x3326	0x80A0	# <CJK>
0x3327	0x5382	# <CJK>
0x3328	0x655E	# <CJK>
0x3329	0x7545	# <CJK>
0x332A	0x5531	# <CJK>
0x332B	0x5021	# <CJK>
0x332C	0x8D85	# <CJK>
0x332D	0x6284	# <CJK>
0x332E	0x949E	# <CJK>
0x332F	0x671D	# <CJK>
0x3330	0x5632	# <CJK>
0x3331	0x6F6E	# <CJK>
0x3332	0x5DE2	# <CJK>
0x3333	0x5435	# <CJK>
0x3334	0x7092	# <CJK>
0x3335	0x8F66	# <CJK>
0x3336	0x626F	# <CJK>
0x3337	0x64A4	# <CJK>
0x3338	0x63A3	# <CJK>
0x3339	0x5F7B	# <CJK>
0x333A	0x6F88	# <CJK>
0x333B	0x90F4	# <CJK>
0x333C	0x81E3	# <CJK>
0x333D	0x8FB0	# <CJK>
0x333E	0x5C18	# <CJK>
0x333F	0x6668	# <CJK>
0x3340	0x5FF1	# <CJK>
0x3341	0x6C89	# <CJK>
0x3342	0x9648	# <CJK>
0x3343	0x8D81	# <CJK>
0x3344	0x886C	# <CJK>
0x3345	0x6491	# <CJK>
0x3346	0x79F0	# <CJK>
0x3347	0x57CE	# <CJK>
0x3348	0x6A59	# <CJK>
0x3349	0x6210	# <CJK>
0x334A	0x5448	# <CJK>
0x334B	0x4E58	# <CJK>
0x334C	0x7A0B	# <CJK>
0x334D	0x60E9	# <CJK>
0x334E	0x6F84	# <CJK>
0x334F	0x8BDA	# <CJK>
0x3350	0x627F	# <CJK>
0x3351	0x901E	# <CJK>
0x3352	0x9A8B	# <CJK>
0x3353	0x79E4	# <CJK>
0x3354	0x5403	# <CJK>
0x3355	0x75F4	# <CJK>
0x3356	0x6301	# <CJK>
0x3357	0x5319	# <CJK>
0x3358	0x6C60	# <CJK>
0x3359	0x8FDF	# <CJK>
0x335A	0x5F1B	# <CJK>
0x335B	0x9A70	# <CJK>
0x335C	0x803B	# <CJK>
0x335D	0x9F7F	# <CJK>
0x335E	0x4F88	# <CJK>
0x335F	0x5C3A	# <CJK>
0x3360	0x8D64	# <CJK>
0x3361	0x7FC5	# <CJK>
0x3362	0x65A5	# <CJK>
0x3363	0x70BD	# <CJK>
0x3364	0x5145	# <CJK>
0x3365	0x51B2	# <CJK>
0x3366	0x866B	# <CJK>
0x3367	0x5D07	# <CJK>
0x3368	0x5BA0	# <CJK>
0x3369	0x62BD	# <CJK>
0x336A	0x916C	# <CJK>
0x336B	0x7574	# <CJK>
0x336C	0x8E0C	# <CJK>
0x336D	0x7A20	# <CJK>
0x336E	0x6101	# <CJK>
0x336F	0x7B79	# <CJK>
0x3370	0x4EC7	# <CJK>
0x3371	0x7EF8	# <CJK>
0x3372	0x7785	# <CJK>
0x3373	0x4E11	# <CJK>
0x3374	0x81ED	# <CJK>
0x3375	0x521D	# <CJK>
0x3376	0x51FA	# <CJK>
0x3377	0x6A71	# <CJK>
0x3378	0x53A8	# <CJK>
0x3379	0x8E87	# <CJK>
0x337A	0x9504	# <CJK>
0x337B	0x96CF	# <CJK>
0x337C	0x6EC1	# <CJK>
0x337D	0x9664	# <CJK>
0x337E	0x695A	# <CJK>
0x3421	0x7840	# <CJK>
0x3422	0x50A8	# <CJK>
0x3423	0x77D7	# <CJK>
0x3424	0x6410	# <CJK>
0x3425	0x89E6	# <CJK>
0x3426	0x5904	# <CJK>
0x3427	0x63E3	# <CJK>
0x3428	0x5DDD	# <CJK>
0x3429	0x7A7F	# <CJK>
0x342A	0x693D	# <CJK>
0x342B	0x4F20	# <CJK>
0x342C	0x8239	# <CJK>
0x342D	0x5598	# <CJK>
0x342E	0x4E32	# <CJK>
0x342F	0x75AE	# <CJK>
0x3430	0x7A97	# <CJK>
0x3431	0x5E62	# <CJK>
0x3432	0x5E8A	# <CJK>
0x3433	0x95EF	# <CJK>
0x3434	0x521B	# <CJK>
0x3435	0x5439	# <CJK>
0x3436	0x708A	# <CJK>
0x3437	0x6376	# <CJK>
0x3438	0x9524	# <CJK>
0x3439	0x5782	# <CJK>
0x343A	0x6625	# <CJK>
0x343B	0x693F	# <CJK>
0x343C	0x9187	# <CJK>
0x343D	0x5507	# <CJK>
0x343E	0x6DF3	# <CJK>
0x343F	0x7EAF	# <CJK>
0x3440	0x8822	# <CJK>
0x3441	0x6233	# <CJK>
0x3442	0x7EF0	# <CJK>
0x3443	0x75B5	# <CJK>
0x3444	0x8328	# <CJK>
0x3445	0x78C1	# <CJK>
0x3446	0x96CC	# <CJK>
0x3447	0x8F9E	# <CJK>
0x3448	0x6148	# <CJK>
0x3449	0x74F7	# <CJK>
0x344A	0x8BCD	# <CJK>
0x344B	0x6B64	# <CJK>
0x344C	0x523A	# <CJK>
0x344D	0x8D50	# <CJK>
0x344E	0x6B21	# <CJK>
0x344F	0x806A	# <CJK>
0x3450	0x8471	# <CJK>
0x3451	0x56F1	# <CJK>
0x3452	0x5306	# <CJK>
0x3453	0x4ECE	# <CJK>
0x3454	0x4E1B	# <CJK>
0x3455	0x51D1	# <CJK>
0x3456	0x7C97	# <CJK>
0x3457	0x918B	# <CJK>
0x3458	0x7C07	# <CJK>
0x3459	0x4FC3	# <CJK>
0x345A	0x8E7F	# <CJK>
0x345B	0x7BE1	# <CJK>
0x345C	0x7A9C	# <CJK>
0x345D	0x6467	# <CJK>
0x345E	0x5D14	# <CJK>
0x345F	0x50AC	# <CJK>
0x3460	0x8106	# <CJK>
0x3461	0x7601	# <CJK>
0x3462	0x7CB9	# <CJK>
0x3463	0x6DEC	# <CJK>
0x3464	0x7FE0	# <CJK>
0x3465	0x6751	# <CJK>
0x3466	0x5B58	# <CJK>
0x3467	0x5BF8	# <CJK>
0x3468	0x78CB	# <CJK>
0x3469	0x64AE	# <CJK>
0x346A	0x6413	# <CJK>
0x346B	0x63AA	# <CJK>
0x346C	0x632B	# <CJK>
0x346D	0x9519	# <CJK>
0x346E	0x642D	# <CJK>
0x346F	0x8FBE	# <CJK>
0x3470	0x7B54	# <CJK>
0x3471	0x7629	# <CJK>
0x3472	0x6253	# <CJK>
0x3473	0x5927	# <CJK>
0x3474	0x5446	# <CJK>
0x3475	0x6B79	# <CJK>
0x3476	0x50A3	# <CJK>
0x3477	0x6234	# <CJK>
0x3478	0x5E26	# <CJK>
0x3479	0x6B86	# <CJK>
0x347A	0x4EE3	# <CJK>
0x347B	0x8D37	# <CJK>
0x347C	0x888B	# <CJK>
0x347D	0x5F85	# <CJK>
0x347E	0x902E	# <CJK>
0x3521	0x6020	# <CJK>
0x3522	0x803D	# <CJK>
0x3523	0x62C5	# <CJK>
0x3524	0x4E39	# <CJK>
0x3525	0x5355	# <CJK>
0x3526	0x90F8	# <CJK>
0x3527	0x63B8	# <CJK>
0x3528	0x80C6	# <CJK>
0x3529	0x65E6	# <CJK>
0x352A	0x6C2E	# <CJK>
0x352B	0x4F46	# <CJK>
0x352C	0x60EE	# <CJK>
0x352D	0x6DE1	# <CJK>
0x352E	0x8BDE	# <CJK>
0x352F	0x5F39	# <CJK>
0x3530	0x86CB	# <CJK>
0x3531	0x5F53	# <CJK>
0x3532	0x6321	# <CJK>
0x3533	0x515A	# <CJK>
0x3534	0x8361	# <CJK>
0x3535	0x6863	# <CJK>
0x3536	0x5200	# <CJK>
0x3537	0x6363	# <CJK>
0x3538	0x8E48	# <CJK>
0x3539	0x5012	# <CJK>
0x353A	0x5C9B	# <CJK>
0x353B	0x7977	# <CJK>
0x353C	0x5BFC	# <CJK>
0x353D	0x5230	# <CJK>
0x353E	0x7A3B	# <CJK>
0x353F	0x60BC	# <CJK>
0x3540	0x9053	# <CJK>
0x3541	0x76D7	# <CJK>
0x3542	0x5FB7	# <CJK>
0x3543	0x5F97	# <CJK>
0x3544	0x7684	# <CJK>
0x3545	0x8E6C	# <CJK>
0x3546	0x706F	# <CJK>
0x3547	0x767B	# <CJK>
0x3548	0x7B49	# <CJK>
0x3549	0x77AA	# <CJK>
0x354A	0x51F3	# <CJK>
0x354B	0x9093	# <CJK>
0x354C	0x5824	# <CJK>
0x354D	0x4F4E	# <CJK>
0x354E	0x6EF4	# <CJK>
0x354F	0x8FEA	# <CJK>
0x3550	0x654C	# <CJK>
0x3551	0x7B1B	# <CJK>
0x3552	0x72C4	# <CJK>
0x3553	0x6DA4	# <CJK>
0x3554	0x7FDF	# <CJK>
0x3555	0x5AE1	# <CJK>
0x3556	0x62B5	# <CJK>
0x3557	0x5E95	# <CJK>
0x3558	0x5730	# <CJK>
0x3559	0x8482	# <CJK>
0x355A	0x7B2C	# <CJK>
0x355B	0x5E1D	# <CJK>
0x355C	0x5F1F	# <CJK>
0x355D	0x9012	# <CJK>
0x355E	0x7F14	# <CJK>
0x355F	0x98A0	# <CJK>
0x3560	0x6382	# <CJK>
0x3561	0x6EC7	# <CJK>
0x3562	0x7898	# <CJK>
0x3563	0x70B9	# <CJK>
0x3564	0x5178	# <CJK>
0x3565	0x975B	# <CJK>
0x3566	0x57AB	# <CJK>
0x3567	0x7535	# <CJK>
0x3568	0x4F43	# <CJK>
0x3569	0x7538	# <CJK>
0x356A	0x5E97	# <CJK>
0x356B	0x60E6	# <CJK>
0x356C	0x5960	# <CJK>
0x356D	0x6DC0	# <CJK>
0x356E	0x6BBF	# <CJK>
0x356F	0x7889	# <CJK>
0x3570	0x53FC	# <CJK>
0x3571	0x96D5	# <CJK>
0x3572	0x51CB	# <CJK>
0x3573	0x5201	# <CJK>
0x3574	0x6389	# <CJK>
0x3575	0x540A	# <CJK>
0x3576	0x9493	# <CJK>
0x3577	0x8C03	# <CJK>
0x3578	0x8DCC	# <CJK>
0x3579	0x7239	# <CJK>
0x357A	0x789F	# <CJK>
0x357B	0x8776	# <CJK>
0x357C	0x8FED	# <CJK>
0x357D	0x8C0D	# <CJK>
0x357E	0x53E0	# <CJK>
0x3621	0x4E01	# <CJK>
0x3622	0x76EF	# <CJK>
0x3623	0x53EE	# <CJK>
0x3624	0x9489	# <CJK>
0x3625	0x9876	# <CJK>
0x3626	0x9F0E	# <CJK>
0x3627	0x952D	# <CJK>
0x3628	0x5B9A	# <CJK>
0x3629	0x8BA2	# <CJK>
0x362A	0x4E22	# <CJK>
0x362B	0x4E1C	# <CJK>
0x362C	0x51AC	# <CJK>
0x362D	0x8463	# <CJK>
0x362E	0x61C2	# <CJK>
0x362F	0x52A8	# <CJK>
0x3630	0x680B	# <CJK>
0x3631	0x4F97	# <CJK>
0x3632	0x606B	# <CJK>
0x3633	0x51BB	# <CJK>
0x3634	0x6D1E	# <CJK>
0x3635	0x515C	# <CJK>
0x3636	0x6296	# <CJK>
0x3637	0x6597	# <CJK>
0x3638	0x9661	# <CJK>
0x3639	0x8C46	# <CJK>
0x363A	0x9017	# <CJK>
0x363B	0x75D8	# <CJK>
0x363C	0x90FD	# <CJK>
0x363D	0x7763	# <CJK>
0x363E	0x6BD2	# <CJK>
0x363F	0x728A	# <CJK>
0x3640	0x72EC	# <CJK>
0x3641	0x8BFB	# <CJK>
0x3642	0x5835	# <CJK>
0x3643	0x7779	# <CJK>
0x3644	0x8D4C	# <CJK>
0x3645	0x675C	# <CJK>
0x3646	0x9540	# <CJK>
0x3647	0x809A	# <CJK>
0x3648	0x5EA6	# <CJK>
0x3649	0x6E21	# <CJK>
0x364A	0x5992	# <CJK>
0x364B	0x7AEF	# <CJK>
0x364C	0x77ED	# <CJK>
0x364D	0x953B	# <CJK>
0x364E	0x6BB5	# <CJK>
0x364F	0x65AD	# <CJK>
0x3650	0x7F0E	# <CJK>
0x3651	0x5806	# <CJK>
0x3652	0x5151	# <CJK>
0x3653	0x961F	# <CJK>
0x3654	0x5BF9	# <CJK>
0x3655	0x58A9	# <CJK>
0x3656	0x5428	# <CJK>
0x3657	0x8E72	# <CJK>
0x3658	0x6566	# <CJK>
0x3659	0x987F	# <CJK>
0x365A	0x56E4	# <CJK>
0x365B	0x949D	# <CJK>
0x365C	0x76FE	# <CJK>
0x365D	0x9041	# <CJK>
0x365E	0x6387	# <CJK>
0x365F	0x54C6	# <CJK>
0x3660	0x591A	# <CJK>
0x3661	0x593A	# <CJK>
0x3662	0x579B	# <CJK>
0x3663	0x8EB2	# <CJK>
0x3664	0x6735	# <CJK>
0x3665	0x8DFA	# <CJK>
0x3666	0x8235	# <CJK>
0x3667	0x5241	# <CJK>
0x3668	0x60F0	# <CJK>
0x3669	0x5815	# <CJK>
0x366A	0x86FE	# <CJK>
0x366B	0x5CE8	# <CJK>
0x366C	0x9E45	# <CJK>
0x366D	0x4FC4	# <CJK>
0x366E	0x989D	# <CJK>
0x366F	0x8BB9	# <CJK>
0x3670	0x5A25	# <CJK>
0x3671	0x6076	# <CJK>
0x3672	0x5384	# <CJK>
0x3673	0x627C	# <CJK>
0x3674	0x904F	# <CJK>
0x3675	0x9102	# <CJK>
0x3676	0x997F	# <CJK>
0x3677	0x6069	# <CJK>
0x3678	0x800C	# <CJK>
0x3679	0x513F	# <CJK>
0x367A	0x8033	# <CJK>
0x367B	0x5C14	# <CJK>
0x367C	0x9975	# <CJK>
0x367D	0x6D31	# <CJK>
0x367E	0x4E8C	# <CJK>
0x3721	0x8D30	# <CJK>
0x3722	0x53D1	# <CJK>
0x3723	0x7F5A	# <CJK>
0x3724	0x7B4F	# <CJK>
0x3725	0x4F10	# <CJK>
0x3726	0x4E4F	# <CJK>
0x3727	0x9600	# <CJK>
0x3728	0x6CD5	# <CJK>
0x3729	0x73D0	# <CJK>
0x372A	0x85E9	# <CJK>
0x372B	0x5E06	# <CJK>
0x372C	0x756A	# <CJK>
0x372D	0x7FFB	# <CJK>
0x372E	0x6A0A	# <CJK>
0x372F	0x77FE	# <CJK>
0x3730	0x9492	# <CJK>
0x3731	0x7E41	# <CJK>
0x3732	0x51E1	# <CJK>
0x3733	0x70E6	# <CJK>
0x3734	0x53CD	# <CJK>
0x3735	0x8FD4	# <CJK>
0x3736	0x8303	# <CJK>
0x3737	0x8D29	# <CJK>
0x3738	0x72AF	# <CJK>
0x3739	0x996D	# <CJK>
0x373A	0x6CDB	# <CJK>
0x373B	0x574A	# <CJK>
0x373C	0x82B3	# <CJK>
0x373D	0x65B9	# <CJK>
0x373E	0x80AA	# <CJK>
0x373F	0x623F	# <CJK>
0x3740	0x9632	# <CJK>
0x3741	0x59A8	# <CJK>
0x3742	0x4EFF	# <CJK>
0x3743	0x8BBF	# <CJK>
0x3744	0x7EBA	# <CJK>
0x3745	0x653E	# <CJK>
0x3746	0x83F2	# <CJK>
0x3747	0x975E	# <CJK>
0x3748	0x5561	# <CJK>
0x3749	0x98DE	# <CJK>
0x374A	0x80A5	# <CJK>
0x374B	0x532A	# <CJK>
0x374C	0x8BFD	# <CJK>
0x374D	0x5420	# <CJK>
0x374E	0x80BA	# <CJK>
0x374F	0x5E9F	# <CJK>
0x3750	0x6CB8	# <CJK>
0x3751	0x8D39	# <CJK>
0x3752	0x82AC	# <CJK>
0x3753	0x915A	# <CJK>
0x3754	0x5429	# <CJK>
0x3755	0x6C1B	# <CJK>
0x3756	0x5206	# <CJK>
0x3757	0x7EB7	# <CJK>
0x3758	0x575F	# <CJK>
0x3759	0x711A	# <CJK>
0x375A	0x6C7E	# <CJK>
0x375B	0x7C89	# <CJK>
0x375C	0x594B	# <CJK>
0x375D	0x4EFD	# <CJK>
0x375E	0x5FFF	# <CJK>
0x375F	0x6124	# <CJK>
0x3760	0x7CAA	# <CJK>
0x3761	0x4E30	# <CJK>
0x3762	0x5C01	# <CJK>
0x3763	0x67AB	# <CJK>
0x3764	0x8702	# <CJK>
0x3765	0x5CF0	# <CJK>
0x3766	0x950B	# <CJK>
0x3767	0x98CE	# <CJK>
0x3768	0x75AF	# <CJK>
0x3769	0x70FD	# <CJK>
0x376A	0x9022	# <CJK>
0x376B	0x51AF	# <CJK>
0x376C	0x7F1D	# <CJK>
0x376D	0x8BBD	# <CJK>
0x376E	0x5949	# <CJK>
0x376F	0x51E4	# <CJK>
0x3770	0x4F5B	# <CJK>
0x3771	0x5426	# <CJK>
0x3772	0x592B	# <CJK>
0x3773	0x6577	# <CJK>
0x3774	0x80A4	# <CJK>
0x3775	0x5B75	# <CJK>
0x3776	0x6276	# <CJK>
0x3777	0x62C2	# <CJK>
0x3778	0x8F90	# <CJK>
0x3779	0x5E45	# <CJK>
0x377A	0x6C1F	# <CJK>
0x377B	0x7B26	# <CJK>
0x377C	0x4F0F	# <CJK>
0x377D	0x4FD8	# <CJK>
0x377E	0x670D	# <CJK>
0x3821	0x6D6E	# <CJK>
0x3822	0x6DAA	# <CJK>
0x3823	0x798F	# <CJK>
0x3824	0x88B1	# <CJK>
0x3825	0x5F17	# <CJK>
0x3826	0x752B	# <CJK>
0x3827	0x629A	# <CJK>
0x3828	0x8F85	# <CJK>
0x3829	0x4FEF	# <CJK>
0x382A	0x91DC	# <CJK>
0x382B	0x65A7	# <CJK>
0x382C	0x812F	# <CJK>
0x382D	0x8151	# <CJK>
0x382E	0x5E9C	# <CJK>
0x382F	0x8150	# <CJK>
0x3830	0x8D74	# <CJK>
0x3831	0x526F	# <CJK>
0x3832	0x8986	# <CJK>
0x3833	0x8D4B	# <CJK>
0x3834	0x590D	# <CJK>
0x3835	0x5085	# <CJK>
0x3836	0x4ED8	# <CJK>
0x3837	0x961C	# <CJK>
0x3838	0x7236	# <CJK>
0x3839	0x8179	# <CJK>
0x383A	0x8D1F	# <CJK>
0x383B	0x5BCC	# <CJK>
0x383C	0x8BA3	# <CJK>
0x383D	0x9644	# <CJK>
0x383E	0x5987	# <CJK>
0x383F	0x7F1A	# <CJK>
0x3840	0x5490	# <CJK>
0x3841	0x5676	# <CJK>
0x3842	0x560E	# <CJK>
0x3843	0x8BE5	# <CJK>
0x3844	0x6539	# <CJK>
0x3845	0x6982	# <CJK>
0x3846	0x9499	# <CJK>
0x3847	0x76D6	# <CJK>
0x3848	0x6E89	# <CJK>
0x3849	0x5E72	# <CJK>
0x384A	0x7518	# <CJK>
0x384B	0x6746	# <CJK>
0x384C	0x67D1	# <CJK>
0x384D	0x7AFF	# <CJK>
0x384E	0x809D	# <CJK>
0x384F	0x8D76	# <CJK>
0x3850	0x611F	# <CJK>
0x3851	0x79C6	# <CJK>
0x3852	0x6562	# <CJK>
0x3853	0x8D63	# <CJK>
0x3854	0x5188	# <CJK>
0x3855	0x521A	# <CJK>
0x3856	0x94A2	# <CJK>
0x3857	0x7F38	# <CJK>
0x3858	0x809B	# <CJK>
0x3859	0x7EB2	# <CJK>
0x385A	0x5C97	# <CJK>
0x385B	0x6E2F	# <CJK>
0x385C	0x6760	# <CJK>
0x385D	0x7BD9	# <CJK>
0x385E	0x768B	# <CJK>
0x385F	0x9AD8	# <CJK>
0x3860	0x818F	# <CJK>
0x3861	0x7F94	# <CJK>
0x3862	0x7CD5	# <CJK>
0x3863	0x641E	# <CJK>
0x3864	0x9550	# <CJK>
0x3865	0x7A3F	# <CJK>
0x3866	0x544A	# <CJK>
0x3867	0x54E5	# <CJK>
0x3868	0x6B4C	# <CJK>
0x3869	0x6401	# <CJK>
0x386A	0x6208	# <CJK>
0x386B	0x9E3D	# <CJK>
0x386C	0x80F3	# <CJK>
0x386D	0x7599	# <CJK>
0x386E	0x5272	# <CJK>
0x386F	0x9769	# <CJK>
0x3870	0x845B	# <CJK>
0x3871	0x683C	# <CJK>
0x3872	0x86E4	# <CJK>
0x3873	0x9601	# <CJK>
0x3874	0x9694	# <CJK>
0x3875	0x94EC	# <CJK>
0x3876	0x4E2A	# <CJK>
0x3877	0x5404	# <CJK>
0x3878	0x7ED9	# <CJK>
0x3879	0x6839	# <CJK>
0x387A	0x8DDF	# <CJK>
0x387B	0x8015	# <CJK>
0x387C	0x66F4	# <CJK>
0x387D	0x5E9A	# <CJK>
0x387E	0x7FB9	# <CJK>
0x3921	0x57C2	# <CJK>
0x3922	0x803F	# <CJK>
0x3923	0x6897	# <CJK>
0x3924	0x5DE5	# <CJK>
0x3925	0x653B	# <CJK>
0x3926	0x529F	# <CJK>
0x3927	0x606D	# <CJK>
0x3928	0x9F9A	# <CJK>
0x3929	0x4F9B	# <CJK>
0x392A	0x8EAC	# <CJK>
0x392B	0x516C	# <CJK>
0x392C	0x5BAB	# <CJK>
0x392D	0x5F13	# <CJK>
0x392E	0x5DE9	# <CJK>
0x392F	0x6C5E	# <CJK>
0x3930	0x62F1	# <CJK>
0x3931	0x8D21	# <CJK>
0x3932	0x5171	# <CJK>
0x3933	0x94A9	# <CJK>
0x3934	0x52FE	# <CJK>
0x3935	0x6C9F	# <CJK>
0x3936	0x82DF	# <CJK>
0x3937	0x72D7	# <CJK>
0x3938	0x57A2	# <CJK>
0x3939	0x6784	# <CJK>
0x393A	0x8D2D	# <CJK>
0x393B	0x591F	# <CJK>
0x393C	0x8F9C	# <CJK>
0x393D	0x83C7	# <CJK>
0x393E	0x5495	# <CJK>
0x393F	0x7B8D	# <CJK>
0x3940	0x4F30	# <CJK>
0x3941	0x6CBD	# <CJK>
0x3942	0x5B64	# <CJK>
0x3943	0x59D1	# <CJK>
0x3944	0x9F13	# <CJK>
0x3945	0x53E4	# <CJK>
0x3946	0x86CA	# <CJK>
0x3947	0x9AA8	# <CJK>
0x3948	0x8C37	# <CJK>
0x3949	0x80A1	# <CJK>
0x394A	0x6545	# <CJK>
0x394B	0x987E	# <CJK>
0x394C	0x56FA	# <CJK>
0x394D	0x96C7	# <CJK>
0x394E	0x522E	# <CJK>
0x394F	0x74DC	# <CJK>
0x3950	0x5250	# <CJK>
0x3951	0x5BE1	# <CJK>
0x3952	0x6302	# <CJK>
0x3953	0x8902	# <CJK>
0x3954	0x4E56	# <CJK>
0x3955	0x62D0	# <CJK>
0x3956	0x602A	# <CJK>
0x3957	0x68FA	# <CJK>
0x3958	0x5173	# <CJK>
0x3959	0x5B98	# <CJK>
0x395A	0x51A0	# <CJK>
0x395B	0x89C2	# <CJK>
0x395C	0x7BA1	# <CJK>
0x395D	0x9986	# <CJK>
0x395E	0x7F50	# <CJK>
0x395F	0x60EF	# <CJK>
0x3960	0x704C	# <CJK>
0x3961	0x8D2F	# <CJK>
0x3962	0x5149	# <CJK>
0x3963	0x5E7F	# <CJK>
0x3964	0x901B	# <CJK>
0x3965	0x7470	# <CJK>
0x3966	0x89C4	# <CJK>
0x3967	0x572D	# <CJK>
0x3968	0x7845	# <CJK>
0x3969	0x5F52	# <CJK>
0x396A	0x9F9F	# <CJK>
0x396B	0x95FA	# <CJK>
0x396C	0x8F68	# <CJK>
0x396D	0x9B3C	# <CJK>
0x396E	0x8BE1	# <CJK>
0x396F	0x7678	# <CJK>
0x3970	0x6842	# <CJK>
0x3971	0x67DC	# <CJK>
0x3972	0x8DEA	# <CJK>
0x3973	0x8D35	# <CJK>
0x3974	0x523D	# <CJK>
0x3975	0x8F8A	# <CJK>
0x3976	0x6EDA	# <CJK>
0x3977	0x68CD	# <CJK>
0x3978	0x9505	# <CJK>
0x3979	0x90ED	# <CJK>
0x397A	0x56FD	# <CJK>
0x397B	0x679C	# <CJK>
0x397C	0x88F9	# <CJK>
0x397D	0x8FC7	# <CJK>
0x397E	0x54C8	# <CJK>
0x3A21	0x9AB8	# <CJK>
0x3A22	0x5B69	# <CJK>
0x3A23	0x6D77	# <CJK>
0x3A24	0x6C26	# <CJK>
0x3A25	0x4EA5	# <CJK>
0x3A26	0x5BB3	# <CJK>
0x3A27	0x9A87	# <CJK>
0x3A28	0x9163	# <CJK>
0x3A29	0x61A8	# <CJK>
0x3A2A	0x90AF	# <CJK>
0x3A2B	0x97E9	# <CJK>
0x3A2C	0x542B	# <CJK>
0x3A2D	0x6DB5	# <CJK>
0x3A2E	0x5BD2	# <CJK>
0x3A2F	0x51FD	# <CJK>
0x3A30	0x558A	# <CJK>
0x3A31	0x7F55	# <CJK>
0x3A32	0x7FF0	# <CJK>
0x3A33	0x64BC	# <CJK>
0x3A34	0x634D	# <CJK>
0x3A35	0x65F1	# <CJK>
0x3A36	0x61BE	# <CJK>
0x3A37	0x608D	# <CJK>
0x3A38	0x710A	# <CJK>
0x3A39	0x6C57	# <CJK>
0x3A3A	0x6C49	# <CJK>
0x3A3B	0x592F	# <CJK>
0x3A3C	0x676D	# <CJK>
0x3A3D	0x822A	# <CJK>
0x3A3E	0x58D5	# <CJK>
0x3A3F	0x568E	# <CJK>
0x3A40	0x8C6A	# <CJK>
0x3A41	0x6BEB	# <CJK>
0x3A42	0x90DD	# <CJK>
0x3A43	0x597D	# <CJK>
0x3A44	0x8017	# <CJK>
0x3A45	0x53F7	# <CJK>
0x3A46	0x6D69	# <CJK>
0x3A47	0x5475	# <CJK>
0x3A48	0x559D	# <CJK>
0x3A49	0x8377	# <CJK>
0x3A4A	0x83CF	# <CJK>
0x3A4B	0x6838	# <CJK>
0x3A4C	0x79BE	# <CJK>
0x3A4D	0x548C	# <CJK>
0x3A4E	0x4F55	# <CJK>
0x3A4F	0x5408	# <CJK>
0x3A50	0x76D2	# <CJK>
0x3A51	0x8C89	# <CJK>
0x3A52	0x9602	# <CJK>
0x3A53	0x6CB3	# <CJK>
0x3A54	0x6DB8	# <CJK>
0x3A55	0x8D6B	# <CJK>
0x3A56	0x8910	# <CJK>
0x3A57	0x9E64	# <CJK>
0x3A58	0x8D3A	# <CJK>
0x3A59	0x563F	# <CJK>
0x3A5A	0x9ED1	# <CJK>
0x3A5B	0x75D5	# <CJK>
0x3A5C	0x5F88	# <CJK>
0x3A5D	0x72E0	# <CJK>
0x3A5E	0x6068	# <CJK>
0x3A5F	0x54FC	# <CJK>
0x3A60	0x4EA8	# <CJK>
0x3A61	0x6A2A	# <CJK>
0x3A62	0x8861	# <CJK>
0x3A63	0x6052	# <CJK>
0x3A64	0x8F70	# <CJK>
0x3A65	0x54C4	# <CJK>
0x3A66	0x70D8	# <CJK>
0x3A67	0x8679	# <CJK>
0x3A68	0x9E3F	# <CJK>
0x3A69	0x6D2A	# <CJK>
0x3A6A	0x5B8F	# <CJK>
0x3A6B	0x5F18	# <CJK>
0x3A6C	0x7EA2	# <CJK>
0x3A6D	0x5589	# <CJK>
0x3A6E	0x4FAF	# <CJK>
0x3A6F	0x7334	# <CJK>
0x3A70	0x543C	# <CJK>
0x3A71	0x539A	# <CJK>
0x3A72	0x5019	# <CJK>
0x3A73	0x540E	# <CJK>
0x3A74	0x547C	# <CJK>
0x3A75	0x4E4E	# <CJK>
0x3A76	0x5FFD	# <CJK>
0x3A77	0x745A	# <CJK>
0x3A78	0x58F6	# <CJK>
0x3A79	0x846B	# <CJK>
0x3A7A	0x80E1	# <CJK>
0x3A7B	0x8774	# <CJK>
0x3A7C	0x72D0	# <CJK>
0x3A7D	0x7CCA	# <CJK>
0x3A7E	0x6E56	# <CJK>
0x3B21	0x5F27	# <CJK>
0x3B22	0x864E	# <CJK>
0x3B23	0x552C	# <CJK>
0x3B24	0x62A4	# <CJK>
0x3B25	0x4E92	# <CJK>
0x3B26	0x6CAA	# <CJK>
0x3B27	0x6237	# <CJK>
0x3B28	0x82B1	# <CJK>
0x3B29	0x54D7	# <CJK>
0x3B2A	0x534E	# <CJK>
0x3B2B	0x733E	# <CJK>
0x3B2C	0x6ED1	# <CJK>
0x3B2D	0x753B	# <CJK>
0x3B2E	0x5212	# <CJK>
0x3B2F	0x5316	# <CJK>
0x3B30	0x8BDD	# <CJK>
0x3B31	0x69D0	# <CJK>
0x3B32	0x5F8A	# <CJK>
0x3B33	0x6000	# <CJK>
0x3B34	0x6DEE	# <CJK>
0x3B35	0x574F	# <CJK>
0x3B36	0x6B22	# <CJK>
0x3B37	0x73AF	# <CJK>
0x3B38	0x6853	# <CJK>
0x3B39	0x8FD8	# <CJK>
0x3B3A	0x7F13	# <CJK>
0x3B3B	0x6362	# <CJK>
0x3B3C	0x60A3	# <CJK>
0x3B3D	0x5524	# <CJK>
0x3B3E	0x75EA	# <CJK>
0x3B3F	0x8C62	# <CJK>
0x3B40	0x7115	# <CJK>
0x3B41	0x6DA3	# <CJK>
0x3B42	0x5BA6	# <CJK>
0x3B43	0x5E7B	# <CJK>
0x3B44	0x8352	# <CJK>
0x3B45	0x614C	# <CJK>
0x3B46	0x9EC4	# <CJK>
0x3B47	0x78FA	# <CJK>
0x3B48	0x8757	# <CJK>
0x3B49	0x7C27	# <CJK>
0x3B4A	0x7687	# <CJK>
0x3B4B	0x51F0	# <CJK>
0x3B4C	0x60F6	# <CJK>
0x3B4D	0x714C	# <CJK>
0x3B4E	0x6643	# <CJK>
0x3B4F	0x5E4C	# <CJK>
0x3B50	0x604D	# <CJK>
0x3B51	0x8C0E	# <CJK>
0x3B52	0x7070	# <CJK>
0x3B53	0x6325	# <CJK>
0x3B54	0x8F89	# <CJK>
0x3B55	0x5FBD	# <CJK>
0x3B56	0x6062	# <CJK>
0x3B57	0x86D4	# <CJK>
0x3B58	0x56DE	# <CJK>
0x3B59	0x6BC1	# <CJK>
0x3B5A	0x6094	# <CJK>
0x3B5B	0x6167	# <CJK>
0x3B5C	0x5349	# <CJK>
0x3B5D	0x60E0	# <CJK>
0x3B5E	0x6666	# <CJK>
0x3B5F	0x8D3F	# <CJK>
0x3B60	0x79FD	# <CJK>
0x3B61	0x4F1A	# <CJK>
0x3B62	0x70E9	# <CJK>
0x3B63	0x6C47	# <CJK>
0x3B64	0x8BB3	# <CJK>
0x3B65	0x8BF2	# <CJK>
0x3B66	0x7ED8	# <CJK>
0x3B67	0x8364	# <CJK>
0x3B68	0x660F	# <CJK>
0x3B69	0x5A5A	# <CJK>
0x3B6A	0x9B42	# <CJK>
0x3B6B	0x6D51	# <CJK>
0x3B6C	0x6DF7	# <CJK>
0x3B6D	0x8C41	# <CJK>
0x3B6E	0x6D3B	# <CJK>
0x3B6F	0x4F19	# <CJK>
0x3B70	0x706B	# <CJK>
0x3B71	0x83B7	# <CJK>
0x3B72	0x6216	# <CJK>
0x3B73	0x60D1	# <CJK>
0x3B74	0x970D	# <CJK>
0x3B75	0x8D27	# <CJK>
0x3B76	0x7978	# <CJK>
0x3B77	0x51FB	# <CJK>
0x3B78	0x573E	# <CJK>
0x3B79	0x57FA	# <CJK>
0x3B7A	0x673A	# <CJK>
0x3B7B	0x7578	# <CJK>
0x3B7C	0x7A3D	# <CJK>
0x3B7D	0x79EF	# <CJK>
0x3B7E	0x7B95	# <CJK>
0x3C21	0x808C	# <CJK>
0x3C22	0x9965	# <CJK>
0x3C23	0x8FF9	# <CJK>
0x3C24	0x6FC0	# <CJK>
0x3C25	0x8BA5	# <CJK>
0x3C26	0x9E21	# <CJK>
0x3C27	0x59EC	# <CJK>
0x3C28	0x7EE9	# <CJK>
0x3C29	0x7F09	# <CJK>
0x3C2A	0x5409	# <CJK>
0x3C2B	0x6781	# <CJK>
0x3C2C	0x68D8	# <CJK>
0x3C2D	0x8F91	# <CJK>
0x3C2E	0x7C4D	# <CJK>
0x3C2F	0x96C6	# <CJK>
0x3C30	0x53CA	# <CJK>
0x3C31	0x6025	# <CJK>
0x3C32	0x75BE	# <CJK>
0x3C33	0x6C72	# <CJK>
0x3C34	0x5373	# <CJK>
0x3C35	0x5AC9	# <CJK>
0x3C36	0x7EA7	# <CJK>
0x3C37	0x6324	# <CJK>
0x3C38	0x51E0	# <CJK>
0x3C39	0x810A	# <CJK>
0x3C3A	0x5DF1	# <CJK>
0x3C3B	0x84DF	# <CJK>
0x3C3C	0x6280	# <CJK>
0x3C3D	0x5180	# <CJK>
0x3C3E	0x5B63	# <CJK>
0x3C3F	0x4F0E	# <CJK>
0x3C40	0x796D	# <CJK>
0x3C41	0x5242	# <CJK>
0x3C42	0x60B8	# <CJK>
0x3C43	0x6D4E	# <CJK>
0x3C44	0x5BC4	# <CJK>
0x3C45	0x5BC2	# <CJK>
0x3C46	0x8BA1	# <CJK>
0x3C47	0x8BB0	# <CJK>
0x3C48	0x65E2	# <CJK>
0x3C49	0x5FCC	# <CJK>
0x3C4A	0x9645	# <CJK>
0x3C4B	0x5993	# <CJK>
0x3C4C	0x7EE7	# <CJK>
0x3C4D	0x7EAA	# <CJK>
0x3C4E	0x5609	# <CJK>
0x3C4F	0x67B7	# <CJK>
0x3C50	0x5939	# <CJK>
0x3C51	0x4F73	# <CJK>
0x3C52	0x5BB6	# <CJK>
0x3C53	0x52A0	# <CJK>
0x3C54	0x835A	# <CJK>
0x3C55	0x988A	# <CJK>
0x3C56	0x8D3E	# <CJK>
0x3C57	0x7532	# <CJK>
0x3C58	0x94BE	# <CJK>
0x3C59	0x5047	# <CJK>
0x3C5A	0x7A3C	# <CJK>
0x3C5B	0x4EF7	# <CJK>
0x3C5C	0x67B6	# <CJK>
0x3C5D	0x9A7E	# <CJK>
0x3C5E	0x5AC1	# <CJK>
0x3C5F	0x6B7C	# <CJK>
0x3C60	0x76D1	# <CJK>
0x3C61	0x575A	# <CJK>
0x3C62	0x5C16	# <CJK>
0x3C63	0x7B3A	# <CJK>
0x3C64	0x95F4	# <CJK>
0x3C65	0x714E	# <CJK>
0x3C66	0x517C	# <CJK>
0x3C67	0x80A9	# <CJK>
0x3C68	0x8270	# <CJK>
0x3C69	0x5978	# <CJK>
0x3C6A	0x7F04	# <CJK>
0x3C6B	0x8327	# <CJK>
0x3C6C	0x68C0	# <CJK>
0x3C6D	0x67EC	# <CJK>
0x3C6E	0x78B1	# <CJK>
0x3C6F	0x7877	# <CJK>
0x3C70	0x62E3	# <CJK>
0x3C71	0x6361	# <CJK>
0x3C72	0x7B80	# <CJK>
0x3C73	0x4FED	# <CJK>
0x3C74	0x526A	# <CJK>
0x3C75	0x51CF	# <CJK>
0x3C76	0x8350	# <CJK>
0x3C77	0x69DB	# <CJK>
0x3C78	0x9274	# <CJK>
0x3C79	0x8DF5	# <CJK>
0x3C7A	0x8D31	# <CJK>
0x3C7B	0x89C1	# <CJK>
0x3C7C	0x952E	# <CJK>
0x3C7D	0x7BAD	# <CJK>
0x3C7E	0x4EF6	# <CJK>
0x3D21	0x5065	# <CJK>
0x3D22	0x8230	# <CJK>
0x3D23	0x5251	# <CJK>
0x3D24	0x996F	# <CJK>
0x3D25	0x6E10	# <CJK>
0x3D26	0x6E85	# <CJK>
0x3D27	0x6DA7	# <CJK>
0x3D28	0x5EFA	# <CJK>
0x3D29	0x50F5	# <CJK>
0x3D2A	0x59DC	# <CJK>
0x3D2B	0x5C06	# <CJK>
0x3D2C	0x6D46	# <CJK>
0x3D2D	0x6C5F	# <CJK>
0x3D2E	0x7586	# <CJK>
0x3D2F	0x848B	# <CJK>
0x3D30	0x6868	# <CJK>
0x3D31	0x5956	# <CJK>
0x3D32	0x8BB2	# <CJK>
0x3D33	0x5320	# <CJK>
0x3D34	0x9171	# <CJK>
0x3D35	0x964D	# <CJK>
0x3D36	0x8549	# <CJK>
0x3D37	0x6912	# <CJK>
0x3D38	0x7901	# <CJK>
0x3D39	0x7126	# <CJK>
0x3D3A	0x80F6	# <CJK>
0x3D3B	0x4EA4	# <CJK>
0x3D3C	0x90CA	# <CJK>
0x3D3D	0x6D47	# <CJK>
0x3D3E	0x9A84	# <CJK>
0x3D3F	0x5A07	# <CJK>
0x3D40	0x56BC	# <CJK>
0x3D41	0x6405	# <CJK>
0x3D42	0x94F0	# <CJK>
0x3D43	0x77EB	# <CJK>
0x3D44	0x4FA5	# <CJK>
0x3D45	0x811A	# <CJK>
0x3D46	0x72E1	# <CJK>
0x3D47	0x89D2	# <CJK>
0x3D48	0x997A	# <CJK>
0x3D49	0x7F34	# <CJK>
0x3D4A	0x7EDE	# <CJK>
0x3D4B	0x527F	# <CJK>
0x3D4C	0x6559	# <CJK>
0x3D4D	0x9175	# <CJK>
0x3D4E	0x8F7F	# <CJK>
0x3D4F	0x8F83	# <CJK>
0x3D50	0x53EB	# <CJK>
0x3D51	0x7A96	# <CJK>
0x3D52	0x63ED	# <CJK>
0x3D53	0x63A5	# <CJK>
0x3D54	0x7686	# <CJK>
0x3D55	0x79F8	# <CJK>
0x3D56	0x8857	# <CJK>
0x3D57	0x9636	# <CJK>
0x3D58	0x622A	# <CJK>
0x3D59	0x52AB	# <CJK>
0x3D5A	0x8282	# <CJK>
0x3D5B	0x6854	# <CJK>
0x3D5C	0x6770	# <CJK>
0x3D5D	0x6377	# <CJK>
0x3D5E	0x776B	# <CJK>
0x3D5F	0x7AED	# <CJK>
0x3D60	0x6D01	# <CJK>
0x3D61	0x7ED3	# <CJK>
0x3D62	0x89E3	# <CJK>
0x3D63	0x59D0	# <CJK>
0x3D64	0x6212	# <CJK>
0x3D65	0x85C9	# <CJK>
0x3D66	0x82A5	# <CJK>
0x3D67	0x754C	# <CJK>
0x3D68	0x501F	# <CJK>
0x3D69	0x4ECB	# <CJK>
0x3D6A	0x75A5	# <CJK>
0x3D6B	0x8BEB	# <CJK>
0x3D6C	0x5C4A	# <CJK>
0x3D6D	0x5DFE	# <CJK>
0x3D6E	0x7B4B	# <CJK>
0x3D6F	0x65A4	# <CJK>
0x3D70	0x91D1	# <CJK>
0x3D71	0x4ECA	# <CJK>
0x3D72	0x6D25	# <CJK>
0x3D73	0x895F	# <CJK>
0x3D74	0x7D27	# <CJK>
0x3D75	0x9526	# <CJK>
0x3D76	0x4EC5	# <CJK>
0x3D77	0x8C28	# <CJK>
0x3D78	0x8FDB	# <CJK>
0x3D79	0x9773	# <CJK>
0x3D7A	0x664B	# <CJK>
0x3D7B	0x7981	# <CJK>
0x3D7C	0x8FD1	# <CJK>
0x3D7D	0x70EC	# <CJK>
0x3D7E	0x6D78	# <CJK>
0x3E21	0x5C3D	# <CJK>
0x3E22	0x52B2	# <CJK>
0x3E23	0x8346	# <CJK>
0x3E24	0x5162	# <CJK>
0x3E25	0x830E	# <CJK>
0x3E26	0x775B	# <CJK>
0x3E27	0x6676	# <CJK>
0x3E28	0x9CB8	# <CJK>
0x3E29	0x4EAC	# <CJK>
0x3E2A	0x60CA	# <CJK>
0x3E2B	0x7CBE	# <CJK>
0x3E2C	0x7CB3	# <CJK>
0x3E2D	0x7ECF	# <CJK>
0x3E2E	0x4E95	# <CJK>
0x3E2F	0x8B66	# <CJK>
0x3E30	0x666F	# <CJK>
0x3E31	0x9888	# <CJK>
0x3E32	0x9759	# <CJK>
0x3E33	0x5883	# <CJK>
0x3E34	0x656C	# <CJK>
0x3E35	0x955C	# <CJK>
0x3E36	0x5F84	# <CJK>
0x3E37	0x75C9	# <CJK>
0x3E38	0x9756	# <CJK>
0x3E39	0x7ADF	# <CJK>
0x3E3A	0x7ADE	# <CJK>
0x3E3B	0x51C0	# <CJK>
0x3E3C	0x70AF	# <CJK>
0x3E3D	0x7A98	# <CJK>
0x3E3E	0x63EA	# <CJK>
0x3E3F	0x7A76	# <CJK>
0x3E40	0x7EA0	# <CJK>
0x3E41	0x7396	# <CJK>
0x3E42	0x97ED	# <CJK>
0x3E43	0x4E45	# <CJK>
0x3E44	0x7078	# <CJK>
0x3E45	0x4E5D	# <CJK>
0x3E46	0x9152	# <CJK>
0x3E47	0x53A9	# <CJK>
0x3E48	0x6551	# <CJK>
0x3E49	0x65E7	# <CJK>
0x3E4A	0x81FC	# <CJK>
0x3E4B	0x8205	# <CJK>
0x3E4C	0x548E	# <CJK>
0x3E4D	0x5C31	# <CJK>
0x3E4E	0x759A	# <CJK>
0x3E4F	0x97A0	# <CJK>
0x3E50	0x62D8	# <CJK>
0x3E51	0x72D9	# <CJK>
0x3E52	0x75BD	# <CJK>
0x3E53	0x5C45	# <CJK>
0x3E54	0x9A79	# <CJK>
0x3E55	0x83CA	# <CJK>
0x3E56	0x5C40	# <CJK>
0x3E57	0x5480	# <CJK>
0x3E58	0x77E9	# <CJK>
0x3E59	0x4E3E	# <CJK>
0x3E5A	0x6CAE	# <CJK>
0x3E5B	0x805A	# <CJK>
0x3E5C	0x62D2	# <CJK>
0x3E5D	0x636E	# <CJK>
0x3E5E	0x5DE8	# <CJK>
0x3E5F	0x5177	# <CJK>
0x3E60	0x8DDD	# <CJK>
0x3E61	0x8E1E	# <CJK>
0x3E62	0x952F	# <CJK>
0x3E63	0x4FF1	# <CJK>
0x3E64	0x53E5	# <CJK>
0x3E65	0x60E7	# <CJK>
0x3E66	0x70AC	# <CJK>
0x3E67	0x5267	# <CJK>
0x3E68	0x6350	# <CJK>
0x3E69	0x9E43	# <CJK>
0x3E6A	0x5A1F	# <CJK>
0x3E6B	0x5026	# <CJK>
0x3E6C	0x7737	# <CJK>
0x3E6D	0x5377	# <CJK>
0x3E6E	0x7EE2	# <CJK>
0x3E6F	0x6485	# <CJK>
0x3E70	0x652B	# <CJK>
0x3E71	0x6289	# <CJK>
0x3E72	0x6398	# <CJK>
0x3E73	0x5014	# <CJK>
0x3E74	0x7235	# <CJK>
0x3E75	0x89C9	# <CJK>
0x3E76	0x51B3	# <CJK>
0x3E77	0x8BC0	# <CJK>
0x3E78	0x7EDD	# <CJK>
0x3E79	0x5747	# <CJK>
0x3E7A	0x83CC	# <CJK>
0x3E7B	0x94A7	# <CJK>
0x3E7C	0x519B	# <CJK>
0x3E7D	0x541B	# <CJK>
0x3E7E	0x5CFB	# <CJK>
0x3F21	0x4FCA	# <CJK>
0x3F22	0x7AE3	# <CJK>
0x3F23	0x6D5A	# <CJK>
0x3F24	0x90E1	# <CJK>
0x3F25	0x9A8F	# <CJK>
0x3F26	0x5580	# <CJK>
0x3F27	0x5496	# <CJK>
0x3F28	0x5361	# <CJK>
0x3F29	0x54AF	# <CJK>
0x3F2A	0x5F00	# <CJK>
0x3F2B	0x63E9	# <CJK>
0x3F2C	0x6977	# <CJK>
0x3F2D	0x51EF	# <CJK>
0x3F2E	0x6168	# <CJK>
0x3F2F	0x520A	# <CJK>
0x3F30	0x582A	# <CJK>
0x3F31	0x52D8	# <CJK>
0x3F32	0x574E	# <CJK>
0x3F33	0x780D	# <CJK>
0x3F34	0x770B	# <CJK>
0x3F35	0x5EB7	# <CJK>
0x3F36	0x6177	# <CJK>
0x3F37	0x7CE0	# <CJK>
0x3F38	0x625B	# <CJK>
0x3F39	0x6297	# <CJK>
0x3F3A	0x4EA2	# <CJK>
0x3F3B	0x7095	# <CJK>
0x3F3C	0x8003	# <CJK>
0x3F3D	0x62F7	# <CJK>
0x3F3E	0x70E4	# <CJK>
0x3F3F	0x9760	# <CJK>
0x3F40	0x5777	# <CJK>
0x3F41	0x82DB	# <CJK>
0x3F42	0x67EF	# <CJK>
0x3F43	0x68F5	# <CJK>
0x3F44	0x78D5	# <CJK>
0x3F45	0x9897	# <CJK>
0x3F46	0x79D1	# <CJK>
0x3F47	0x58F3	# <CJK>
0x3F48	0x54B3	# <CJK>
0x3F49	0x53EF	# <CJK>
0x3F4A	0x6E34	# <CJK>
0x3F4B	0x514B	# <CJK>
0x3F4C	0x523B	# <CJK>
0x3F4D	0x5BA2	# <CJK>
0x3F4E	0x8BFE	# <CJK>
0x3F4F	0x80AF	# <CJK>
0x3F50	0x5543	# <CJK>
0x3F51	0x57A6	# <CJK>
0x3F52	0x6073	# <CJK>
0x3F53	0x5751	# <CJK>
0x3F54	0x542D	# <CJK>
0x3F55	0x7A7A	# <CJK>
0x3F56	0x6050	# <CJK>
0x3F57	0x5B54	# <CJK>
0x3F58	0x63A7	# <CJK>
0x3F59	0x62A0	# <CJK>
0x3F5A	0x53E3	# <CJK>
0x3F5B	0x6263	# <CJK>
0x3F5C	0x5BC7	# <CJK>
0x3F5D	0x67AF	# <CJK>
0x3F5E	0x54ED	# <CJK>
0x3F5F	0x7A9F	# <CJK>
0x3F60	0x82E6	# <CJK>
0x3F61	0x9177	# <CJK>
0x3F62	0x5E93	# <CJK>
0x3F63	0x88E4	# <CJK>
0x3F64	0x5938	# <CJK>
0x3F65	0x57AE	# <CJK>
0x3F66	0x630E	# <CJK>
0x3F67	0x8DE8	# <CJK>
0x3F68	0x80EF	# <CJK>
0x3F69	0x5757	# <CJK>
0x3F6A	0x7B77	# <CJK>
0x3F6B	0x4FA9	# <CJK>
0x3F6C	0x5FEB	# <CJK>
0x3F6D	0x5BBD	# <CJK>
0x3F6E	0x6B3E	# <CJK>
0x3F6F	0x5321	# <CJK>
0x3F70	0x7B50	# <CJK>
0x3F71	0x72C2	# <CJK>
0x3F72	0x6846	# <CJK>
0x3F73	0x77FF	# <CJK>
0x3F74	0x7736	# <CJK>
0x3F75	0x65F7	# <CJK>
0x3F76	0x51B5	# <CJK>
0x3F77	0x4E8F	# <CJK>
0x3F78	0x76D4	# <CJK>
0x3F79	0x5CBF	# <CJK>
0x3F7A	0x7AA5	# <CJK>
0x3F7B	0x8475	# <CJK>
0x3F7C	0x594E	# <CJK>
0x3F7D	0x9B41	# <CJK>
0x3F7E	0x5080	# <CJK>
0x4021	0x9988	# <CJK>
0x4022	0x6127	# <CJK>
0x4023	0x6E83	# <CJK>
0x4024	0x5764	# <CJK>
0x4025	0x6606	# <CJK>
0x4026	0x6346	# <CJK>
0x4027	0x56F0	# <CJK>
0x4028	0x62EC	# <CJK>
0x4029	0x6269	# <CJK>
0x402A	0x5ED3	# <CJK>
0x402B	0x9614	# <CJK>
0x402C	0x5783	# <CJK>
0x402D	0x62C9	# <CJK>
0x402E	0x5587	# <CJK>
0x402F	0x8721	# <CJK>
0x4030	0x814A	# <CJK>
0x4031	0x8FA3	# <CJK>
0x4032	0x5566	# <CJK>
0x4033	0x83B1	# <CJK>
0x4034	0x6765	# <CJK>
0x4035	0x8D56	# <CJK>
0x4036	0x84DD	# <CJK>
0x4037	0x5A6A	# <CJK>
0x4038	0x680F	# <CJK>
0x4039	0x62E6	# <CJK>
0x403A	0x7BEE	# <CJK>
0x403B	0x9611	# <CJK>
0x403C	0x5170	# <CJK>
0x403D	0x6F9C	# <CJK>
0x403E	0x8C30	# <CJK>
0x403F	0x63FD	# <CJK>
0x4040	0x89C8	# <CJK>
0x4041	0x61D2	# <CJK>
0x4042	0x7F06	# <CJK>
0x4043	0x70C2	# <CJK>
0x4044	0x6EE5	# <CJK>
0x4045	0x7405	# <CJK>
0x4046	0x6994	# <CJK>
0x4047	0x72FC	# <CJK>
0x4048	0x5ECA	# <CJK>
0x4049	0x90CE	# <CJK>
0x404A	0x6717	# <CJK>
0x404B	0x6D6A	# <CJK>
0x404C	0x635E	# <CJK>
0x404D	0x52B3	# <CJK>
0x404E	0x7262	# <CJK>
0x404F	0x8001	# <CJK>
0x4050	0x4F6C	# <CJK>
0x4051	0x59E5	# <CJK>
0x4052	0x916A	# <CJK>
0x4053	0x70D9	# <CJK>
0x4054	0x6D9D	# <CJK>
0x4055	0x52D2	# <CJK>
0x4056	0x4E50	# <CJK>
0x4057	0x96F7	# <CJK>
0x4058	0x956D	# <CJK>
0x4059	0x857E	# <CJK>
0x405A	0x78CA	# <CJK>
0x405B	0x7D2F	# <CJK>
0x405C	0x5121	# <CJK>
0x405D	0x5792	# <CJK>
0x405E	0x64C2	# <CJK>
0x405F	0x808B	# <CJK>
0x4060	0x7C7B	# <CJK>
0x4061	0x6CEA	# <CJK>
0x4062	0x68F1	# <CJK>
0x4063	0x695E	# <CJK>
0x4064	0x51B7	# <CJK>
0x4065	0x5398	# <CJK>
0x4066	0x68A8	# <CJK>
0x4067	0x7281	# <CJK>
0x4068	0x9ECE	# <CJK>
0x4069	0x7BF1	# <CJK>
0x406A	0x72F8	# <CJK>
0x406B	0x79BB	# <CJK>
0x406C	0x6F13	# <CJK>
0x406D	0x7406	# <CJK>
0x406E	0x674E	# <CJK>
0x406F	0x91CC	# <CJK>
0x4070	0x9CA4	# <CJK>
0x4071	0x793C	# <CJK>
0x4072	0x8389	# <CJK>
0x4073	0x8354	# <CJK>
0x4074	0x540F	# <CJK>
0x4075	0x6817	# <CJK>
0x4076	0x4E3D	# <CJK>
0x4077	0x5389	# <CJK>
0x4078	0x52B1	# <CJK>
0x4079	0x783E	# <CJK>
0x407A	0x5386	# <CJK>
0x407B	0x5229	# <CJK>
0x407C	0x5088	# <CJK>
0x407D	0x4F8B	# <CJK>
0x407E	0x4FD0	# <CJK>
0x4121	0x75E2	# <CJK>
0x4122	0x7ACB	# <CJK>
0x4123	0x7C92	# <CJK>
0x4124	0x6CA5	# <CJK>
0x4125	0x96B6	# <CJK>
0x4126	0x529B	# <CJK>
0x4127	0x7483	# <CJK>
0x4128	0x54E9	# <CJK>
0x4129	0x4FE9	# <CJK>
0x412A	0x8054	# <CJK>
0x412B	0x83B2	# <CJK>
0x412C	0x8FDE	# <CJK>
0x412D	0x9570	# <CJK>
0x412E	0x5EC9	# <CJK>
0x412F	0x601C	# <CJK>
0x4130	0x6D9F	# <CJK>
0x4131	0x5E18	# <CJK>
0x4132	0x655B	# <CJK>
0x4133	0x8138	# <CJK>
0x4134	0x94FE	# <CJK>
0x4135	0x604B	# <CJK>
0x4136	0x70BC	# <CJK>
0x4137	0x7EC3	# <CJK>
0x4138	0x7CAE	# <CJK>
0x4139	0x51C9	# <CJK>
0x413A	0x6881	# <CJK>
0x413B	0x7CB1	# <CJK>
0x413C	0x826F	# <CJK>
0x413D	0x4E24	# <CJK>
0x413E	0x8F86	# <CJK>
0x413F	0x91CF	# <CJK>
0x4140	0x667E	# <CJK>
0x4141	0x4EAE	# <CJK>
0x4142	0x8C05	# <CJK>
0x4143	0x64A9	# <CJK>
0x4144	0x804A	# <CJK>
0x4145	0x50DA	# <CJK>
0x4146	0x7597	# <CJK>
0x4147	0x71CE	# <CJK>
0x4148	0x5BE5	# <CJK>
0x4149	0x8FBD	# <CJK>
0x414A	0x6F66	# <CJK>
0x414B	0x4E86	# <CJK>
0x414C	0x6482	# <CJK>
0x414D	0x9563	# <CJK>
0x414E	0x5ED6	# <CJK>
0x414F	0x6599	# <CJK>
0x4150	0x5217	# <CJK>
0x4151	0x88C2	# <CJK>
0x4152	0x70C8	# <CJK>
0x4153	0x52A3	# <CJK>
0x4154	0x730E	# <CJK>
0x4155	0x7433	# <CJK>
0x4156	0x6797	# <CJK>
0x4157	0x78F7	# <CJK>
0x4158	0x9716	# <CJK>
0x4159	0x4E34	# <CJK>
0x415A	0x90BB	# <CJK>
0x415B	0x9CDE	# <CJK>
0x415C	0x6DCB	# <CJK>
0x415D	0x51DB	# <CJK>
0x415E	0x8D41	# <CJK>
0x415F	0x541D	# <CJK>
0x4160	0x62CE	# <CJK>
0x4161	0x73B2	# <CJK>
0x4162	0x83F1	# <CJK>
0x4163	0x96F6	# <CJK>
0x4164	0x9F84	# <CJK>
0x4165	0x94C3	# <CJK>
0x4166	0x4F36	# <CJK>
0x4167	0x7F9A	# <CJK>
0x4168	0x51CC	# <CJK>
0x4169	0x7075	# <CJK>
0x416A	0x9675	# <CJK>
0x416B	0x5CAD	# <CJK>
0x416C	0x9886	# <CJK>
0x416D	0x53E6	# <CJK>
0x416E	0x4EE4	# <CJK>
0x416F	0x6E9C	# <CJK>
0x4170	0x7409	# <CJK>
0x4171	0x69B4	# <CJK>
0x4172	0x786B	# <CJK>
0x4173	0x998F	# <CJK>
0x4174	0x7559	# <CJK>
0x4175	0x5218	# <CJK>
0x4176	0x7624	# <CJK>
0x4177	0x6D41	# <CJK>
0x4178	0x67F3	# <CJK>
0x4179	0x516D	# <CJK>
0x417A	0x9F99	# <CJK>
0x417B	0x804B	# <CJK>
0x417C	0x5499	# <CJK>
0x417D	0x7B3C	# <CJK>
0x417E	0x7ABF	# <CJK>
0x4221	0x9686	# <CJK>
0x4222	0x5784	# <CJK>
0x4223	0x62E2	# <CJK>
0x4224	0x9647	# <CJK>
0x4225	0x697C	# <CJK>
0x4226	0x5A04	# <CJK>
0x4227	0x6402	# <CJK>
0x4228	0x7BD3	# <CJK>
0x4229	0x6F0F	# <CJK>
0x422A	0x964B	# <CJK>
0x422B	0x82A6	# <CJK>
0x422C	0x5362	# <CJK>
0x422D	0x9885	# <CJK>
0x422E	0x5E90	# <CJK>
0x422F	0x7089	# <CJK>
0x4230	0x63B3	# <CJK>
0x4231	0x5364	# <CJK>
0x4232	0x864F	# <CJK>
0x4233	0x9C81	# <CJK>
0x4234	0x9E93	# <CJK>
0x4235	0x788C	# <CJK>
0x4236	0x9732	# <CJK>
0x4237	0x8DEF	# <CJK>
0x4238	0x8D42	# <CJK>
0x4239	0x9E7F	# <CJK>
0x423A	0x6F5E	# <CJK>
0x423B	0x7984	# <CJK>
0x423C	0x5F55	# <CJK>
0x423D	0x9646	# <CJK>
0x423E	0x622E	# <CJK>
0x423F	0x9A74	# <CJK>
0x4240	0x5415	# <CJK>
0x4241	0x94DD	# <CJK>
0x4242	0x4FA3	# <CJK>
0x4243	0x65C5	# <CJK>
0x4244	0x5C65	# <CJK>
0x4245	0x5C61	# <CJK>
0x4246	0x7F15	# <CJK>
0x4247	0x8651	# <CJK>
0x4248	0x6C2F	# <CJK>
0x4249	0x5F8B	# <CJK>
0x424A	0x7387	# <CJK>
0x424B	0x6EE4	# <CJK>
0x424C	0x7EFF	# <CJK>
0x424D	0x5CE6	# <CJK>
0x424E	0x631B	# <CJK>
0x424F	0x5B6A	# <CJK>
0x4250	0x6EE6	# <CJK>
0x4251	0x5375	# <CJK>
0x4252	0x4E71	# <CJK>
0x4253	0x63A0	# <CJK>
0x4254	0x7565	# <CJK>
0x4255	0x62A1	# <CJK>
0x4256	0x8F6E	# <CJK>
0x4257	0x4F26	# <CJK>
0x4258	0x4ED1	# <CJK>
0x4259	0x6CA6	# <CJK>
0x425A	0x7EB6	# <CJK>
0x425B	0x8BBA	# <CJK>
0x425C	0x841D	# <CJK>
0x425D	0x87BA	# <CJK>
0x425E	0x7F57	# <CJK>
0x425F	0x903B	# <CJK>
0x4260	0x9523	# <CJK>
0x4261	0x7BA9	# <CJK>
0x4262	0x9AA1	# <CJK>
0x4263	0x88F8	# <CJK>
0x4264	0x843D	# <CJK>
0x4265	0x6D1B	# <CJK>
0x4266	0x9A86	# <CJK>
0x4267	0x7EDC	# <CJK>
0x4268	0x5988	# <CJK>
0x4269	0x9EBB	# <CJK>
0x426A	0x739B	# <CJK>
0x426B	0x7801	# <CJK>
0x426C	0x8682	# <CJK>
0x426D	0x9A6C	# <CJK>
0x426E	0x9A82	# <CJK>
0x426F	0x561B	# <CJK>
0x4270	0x5417	# <CJK>
0x4271	0x57CB	# <CJK>
0x4272	0x4E70	# <CJK>
0x4273	0x9EA6	# <CJK>
0x4274	0x5356	# <CJK>
0x4275	0x8FC8	# <CJK>
0x4276	0x8109	# <CJK>
0x4277	0x7792	# <CJK>
0x4278	0x9992	# <CJK>
0x4279	0x86EE	# <CJK>
0x427A	0x6EE1	# <CJK>
0x427B	0x8513	# <CJK>
0x427C	0x66FC	# <CJK>
0x427D	0x6162	# <CJK>
0x427E	0x6F2B	# <CJK>
0x4321	0x8C29	# <CJK>
0x4322	0x8292	# <CJK>
0x4323	0x832B	# <CJK>
0x4324	0x76F2	# <CJK>
0x4325	0x6C13	# <CJK>
0x4326	0x5FD9	# <CJK>
0x4327	0x83BD	# <CJK>
0x4328	0x732B	# <CJK>
0x4329	0x8305	# <CJK>
0x432A	0x951A	# <CJK>
0x432B	0x6BDB	# <CJK>
0x432C	0x77DB	# <CJK>
0x432D	0x94C6	# <CJK>
0x432E	0x536F	# <CJK>
0x432F	0x8302	# <CJK>
0x4330	0x5192	# <CJK>
0x4331	0x5E3D	# <CJK>
0x4332	0x8C8C	# <CJK>
0x4333	0x8D38	# <CJK>
0x4334	0x4E48	# <CJK>
0x4335	0x73AB	# <CJK>
0x4336	0x679A	# <CJK>
0x4337	0x6885	# <CJK>
0x4338	0x9176	# <CJK>
0x4339	0x9709	# <CJK>
0x433A	0x7164	# <CJK>
0x433B	0x6CA1	# <CJK>
0x433C	0x7709	# <CJK>
0x433D	0x5A92	# <CJK>
0x433E	0x9541	# <CJK>
0x433F	0x6BCF	# <CJK>
0x4340	0x7F8E	# <CJK>
0x4341	0x6627	# <CJK>
0x4342	0x5BD0	# <CJK>
0x4343	0x59B9	# <CJK>
0x4344	0x5A9A	# <CJK>
0x4345	0x95E8	# <CJK>
0x4346	0x95F7	# <CJK>
0x4347	0x4EEC	# <CJK>
0x4348	0x840C	# <CJK>
0x4349	0x8499	# <CJK>
0x434A	0x6AAC	# <CJK>
0x434B	0x76DF	# <CJK>
0x434C	0x9530	# <CJK>
0x434D	0x731B	# <CJK>
0x434E	0x68A6	# <CJK>
0x434F	0x5B5F	# <CJK>
0x4350	0x772F	# <CJK>
0x4351	0x919A	# <CJK>
0x4352	0x9761	# <CJK>
0x4353	0x7CDC	# <CJK>
0x4354	0x8FF7	# <CJK>
0x4355	0x8C1C	# <CJK>
0x4356	0x5F25	# <CJK>
0x4357	0x7C73	# <CJK>
0x4358	0x79D8	# <CJK>
0x4359	0x89C5	# <CJK>
0x435A	0x6CCC	# <CJK>
0x435B	0x871C	# <CJK>
0x435C	0x5BC6	# <CJK>
0x435D	0x5E42	# <CJK>
0x435E	0x68C9	# <CJK>
0x435F	0x7720	# <CJK>
0x4360	0x7EF5	# <CJK>
0x4361	0x5195	# <CJK>
0x4362	0x514D	# <CJK>
0x4363	0x52C9	# <CJK>
0x4364	0x5A29	# <CJK>
0x4365	0x7F05	# <CJK>
0x4366	0x9762	# <CJK>
0x4367	0x82D7	# <CJK>
0x4368	0x63CF	# <CJK>
0x4369	0x7784	# <CJK>
0x436A	0x85D0	# <CJK>
0x436B	0x79D2	# <CJK>
0x436C	0x6E3A	# <CJK>
0x436D	0x5E99	# <CJK>
0x436E	0x5999	# <CJK>
0x436F	0x8511	# <CJK>
0x4370	0x706D	# <CJK>
0x4371	0x6C11	# <CJK>
0x4372	0x62BF	# <CJK>
0x4373	0x76BF	# <CJK>
0x4374	0x654F	# <CJK>
0x4375	0x60AF	# <CJK>
0x4376	0x95FD	# <CJK>
0x4377	0x660E	# <CJK>
0x4378	0x879F	# <CJK>
0x4379	0x9E23	# <CJK>
0x437A	0x94ED	# <CJK>
0x437B	0x540D	# <CJK>
0x437C	0x547D	# <CJK>
0x437D	0x8C2C	# <CJK>
0x437E	0x6478	# <CJK>
0x4421	0x6479	# <CJK>
0x4422	0x8611	# <CJK>
0x4423	0x6A21	# <CJK>
0x4424	0x819C	# <CJK>
0x4425	0x78E8	# <CJK>
0x4426	0x6469	# <CJK>
0x4427	0x9B54	# <CJK>
0x4428	0x62B9	# <CJK>
0x4429	0x672B	# <CJK>
0x442A	0x83AB	# <CJK>
0x442B	0x58A8	# <CJK>
0x442C	0x9ED8	# <CJK>
0x442D	0x6CAB	# <CJK>
0x442E	0x6F20	# <CJK>
0x442F	0x5BDE	# <CJK>
0x4430	0x964C	# <CJK>
0x4431	0x8C0B	# <CJK>
0x4432	0x725F	# <CJK>
0x4433	0x67D0	# <CJK>
0x4434	0x62C7	# <CJK>
0x4435	0x7261	# <CJK>
0x4436	0x4EA9	# <CJK>
0x4437	0x59C6	# <CJK>
0x4438	0x6BCD	# <CJK>
0x4439	0x5893	# <CJK>
0x443A	0x66AE	# <CJK>
0x443B	0x5E55	# <CJK>
0x443C	0x52DF	# <CJK>
0x443D	0x6155	# <CJK>
0x443E	0x6728	# <CJK>
0x443F	0x76EE	# <CJK>
0x4440	0x7766	# <CJK>
0x4441	0x7267	# <CJK>
0x4442	0x7A46	# <CJK>
0x4443	0x62FF	# <CJK>
0x4444	0x54EA	# <CJK>
0x4445	0x5450	# <CJK>
0x4446	0x94A0	# <CJK>
0x4447	0x90A3	# <CJK>
0x4448	0x5A1C	# <CJK>
0x4449	0x7EB3	# <CJK>
0x444A	0x6C16	# <CJK>
0x444B	0x4E43	# <CJK>
0x444C	0x5976	# <CJK>
0x444D	0x8010	# <CJK>
0x444E	0x5948	# <CJK>
0x444F	0x5357	# <CJK>
0x4450	0x7537	# <CJK>
0x4451	0x96BE	# <CJK>
0x4452	0x56CA	# <CJK>
0x4453	0x6320	# <CJK>
0x4454	0x8111	# <CJK>
0x4455	0x607C	# <CJK>
0x4456	0x95F9	# <CJK>
0x4457	0x6DD6	# <CJK>
0x4458	0x5462	# <CJK>
0x4459	0x9981	# <CJK>
0x445A	0x5185	# <CJK>
0x445B	0x5AE9	# <CJK>
0x445C	0x80FD	# <CJK>
0x445D	0x59AE	# <CJK>
0x445E	0x9713	# <CJK>
0x445F	0x502A	# <CJK>
0x4460	0x6CE5	# <CJK>
0x4461	0x5C3C	# <CJK>
0x4462	0x62DF	# <CJK>
0x4463	0x4F60	# <CJK>
0x4464	0x533F	# <CJK>
0x4465	0x817B	# <CJK>
0x4466	0x9006	# <CJK>
0x4467	0x6EBA	# <CJK>
0x4468	0x852B	# <CJK>
0x4469	0x62C8	# <CJK>
0x446A	0x5E74	# <CJK>
0x446B	0x78BE	# <CJK>
0x446C	0x64B5	# <CJK>
0x446D	0x637B	# <CJK>
0x446E	0x5FF5	# <CJK>
0x446F	0x5A18	# <CJK>
0x4470	0x917F	# <CJK>
0x4471	0x9E1F	# <CJK>
0x4472	0x5C3F	# <CJK>
0x4473	0x634F	# <CJK>
0x4474	0x8042	# <CJK>
0x4475	0x5B7D	# <CJK>
0x4476	0x556E	# <CJK>
0x4477	0x954A	# <CJK>
0x4478	0x954D	# <CJK>
0x4479	0x6D85	# <CJK>
0x447A	0x60A8	# <CJK>
0x447B	0x67E0	# <CJK>
0x447C	0x72DE	# <CJK>
0x447D	0x51DD	# <CJK>
0x447E	0x5B81	# <CJK>
0x4521	0x62E7	# <CJK>
0x4522	0x6CDE	# <CJK>
0x4523	0x725B	# <CJK>
0x4524	0x626D	# <CJK>
0x4525	0x94AE	# <CJK>
0x4526	0x7EBD	# <CJK>
0x4527	0x8113	# <CJK>
0x4528	0x6D53	# <CJK>
0x4529	0x519C	# <CJK>
0x452A	0x5F04	# <CJK>
0x452B	0x5974	# <CJK>
0x452C	0x52AA	# <CJK>
0x452D	0x6012	# <CJK>
0x452E	0x5973	# <CJK>
0x452F	0x6696	# <CJK>
0x4530	0x8650	# <CJK>
0x4531	0x759F	# <CJK>
0x4532	0x632A	# <CJK>
0x4533	0x61E6	# <CJK>
0x4534	0x7CEF	# <CJK>
0x4535	0x8BFA	# <CJK>
0x4536	0x54E6	# <CJK>
0x4537	0x6B27	# <CJK>
0x4538	0x9E25	# <CJK>
0x4539	0x6BB4	# <CJK>
0x453A	0x85D5	# <CJK>
0x453B	0x5455	# <CJK>
0x453C	0x5076	# <CJK>
0x453D	0x6CA4	# <CJK>
0x453E	0x556A	# <CJK>
0x453F	0x8DB4	# <CJK>
0x4540	0x722C	# <CJK>
0x4541	0x5E15	# <CJK>
0x4542	0x6015	# <CJK>
0x4543	0x7436	# <CJK>
0x4544	0x62CD	# <CJK>
0x4545	0x6392	# <CJK>
0x4546	0x724C	# <CJK>
0x4547	0x5F98	# <CJK>
0x4548	0x6E43	# <CJK>
0x4549	0x6D3E	# <CJK>
0x454A	0x6500	# <CJK>
0x454B	0x6F58	# <CJK>
0x454C	0x76D8	# <CJK>
0x454D	0x78D0	# <CJK>
0x454E	0x76FC	# <CJK>
0x454F	0x7554	# <CJK>
0x4550	0x5224	# <CJK>
0x4551	0x53DB	# <CJK>
0x4552	0x4E53	# <CJK>
0x4553	0x5E9E	# <CJK>
0x4554	0x65C1	# <CJK>
0x4555	0x802A	# <CJK>
0x4556	0x80D6	# <CJK>
0x4557	0x629B	# <CJK>
0x4558	0x5486	# <CJK>
0x4559	0x5228	# <CJK>
0x455A	0x70AE	# <CJK>
0x455B	0x888D	# <CJK>
0x455C	0x8DD1	# <CJK>
0x455D	0x6CE1	# <CJK>
0x455E	0x5478	# <CJK>
0x455F	0x80DA	# <CJK>
0x4560	0x57F9	# <CJK>
0x4561	0x88F4	# <CJK>
0x4562	0x8D54	# <CJK>
0x4563	0x966A	# <CJK>
0x4564	0x914D	# <CJK>
0x4565	0x4F69	# <CJK>
0x4566	0x6C9B	# <CJK>
0x4567	0x55B7	# <CJK>
0x4568	0x76C6	# <CJK>
0x4569	0x7830	# <CJK>
0x456A	0x62A8	# <CJK>
0x456B	0x70F9	# <CJK>
0x456C	0x6F8E	# <CJK>
0x456D	0x5F6D	# <CJK>
0x456E	0x84EC	# <CJK>
0x456F	0x68DA	# <CJK>
0x4570	0x787C	# <CJK>
0x4571	0x7BF7	# <CJK>
0x4572	0x81A8	# <CJK>
0x4573	0x670B	# <CJK>
0x4574	0x9E4F	# <CJK>
0x4575	0x6367	# <CJK>
0x4576	0x78B0	# <CJK>
0x4577	0x576F	# <CJK>
0x4578	0x7812	# <CJK>
0x4579	0x9739	# <CJK>
0x457A	0x6279	# <CJK>
0x457B	0x62AB	# <CJK>
0x457C	0x5288	# <CJK>
0x457D	0x7435	# <CJK>
0x457E	0x6BD7	# <CJK>
0x4621	0x5564	# <CJK>
0x4622	0x813E	# <CJK>
0x4623	0x75B2	# <CJK>
0x4624	0x76AE	# <CJK>
0x4625	0x5339	# <CJK>
0x4626	0x75DE	# <CJK>
0x4627	0x50FB	# <CJK>
0x4628	0x5C41	# <CJK>
0x4629	0x8B6C	# <CJK>
0x462A	0x7BC7	# <CJK>
0x462B	0x504F	# <CJK>
0x462C	0x7247	# <CJK>
0x462D	0x9A97	# <CJK>
0x462E	0x98D8	# <CJK>
0x462F	0x6F02	# <CJK>
0x4630	0x74E2	# <CJK>
0x4631	0x7968	# <CJK>
0x4632	0x6487	# <CJK>
0x4633	0x77A5	# <CJK>
0x4634	0x62FC	# <CJK>
0x4635	0x9891	# <CJK>
0x4636	0x8D2B	# <CJK>
0x4637	0x54C1	# <CJK>
0x4638	0x8058	# <CJK>
0x4639	0x4E52	# <CJK>
0x463A	0x576A	# <CJK>
0x463B	0x82F9	# <CJK>
0x463C	0x840D	# <CJK>
0x463D	0x5E73	# <CJK>
0x463E	0x51ED	# <CJK>
0x463F	0x74F6	# <CJK>
0x4640	0x8BC4	# <CJK>
0x4641	0x5C4F	# <CJK>
0x4642	0x5761	# <CJK>
0x4643	0x6CFC	# <CJK>
0x4644	0x9887	# <CJK>
0x4645	0x5A46	# <CJK>
0x4646	0x7834	# <CJK>
0x4647	0x9B44	# <CJK>
0x4648	0x8FEB	# <CJK>
0x4649	0x7C95	# <CJK>
0x464A	0x5256	# <CJK>
0x464B	0x6251	# <CJK>
0x464C	0x94FA	# <CJK>
0x464D	0x4EC6	# <CJK>
0x464E	0x8386	# <CJK>
0x464F	0x8461	# <CJK>
0x4650	0x83E9	# <CJK>
0x4651	0x84B2	# <CJK>
0x4652	0x57D4	# <CJK>
0x4653	0x6734	# <CJK>
0x4654	0x5703	# <CJK>
0x4655	0x666E	# <CJK>
0x4656	0x6D66	# <CJK>
0x4657	0x8C31	# <CJK>
0x4658	0x66DD	# <CJK>
0x4659	0x7011	# <CJK>
0x465A	0x671F	# <CJK>
0x465B	0x6B3A	# <CJK>
0x465C	0x6816	# <CJK>
0x465D	0x621A	# <CJK>
0x465E	0x59BB	# <CJK>
0x465F	0x4E03	# <CJK>
0x4660	0x51C4	# <CJK>
0x4661	0x6F06	# <CJK>
0x4662	0x67D2	# <CJK>
0x4663	0x6C8F	# <CJK>
0x4664	0x5176	# <CJK>
0x4665	0x68CB	# <CJK>
0x4666	0x5947	# <CJK>
0x4667	0x6B67	# <CJK>
0x4668	0x7566	# <CJK>
0x4669	0x5D0E	# <CJK>
0x466A	0x8110	# <CJK>
0x466B	0x9F50	# <CJK>
0x466C	0x65D7	# <CJK>
0x466D	0x7948	# <CJK>
0x466E	0x7941	# <CJK>
0x466F	0x9A91	# <CJK>
0x4670	0x8D77	# <CJK>
0x4671	0x5C82	# <CJK>
0x4672	0x4E5E	# <CJK>
0x4673	0x4F01	# <CJK>
0x4674	0x542F	# <CJK>
0x4675	0x5951	# <CJK>
0x4676	0x780C	# <CJK>
0x4677	0x5668	# <CJK>
0x4678	0x6C14	# <CJK>
0x4679	0x8FC4	# <CJK>
0x467A	0x5F03	# <CJK>
0x467B	0x6C7D	# <CJK>
0x467C	0x6CE3	# <CJK>
0x467D	0x8BAB	# <CJK>
0x467E	0x6390	# <CJK>
0x4721	0x6070	# <CJK>
0x4722	0x6D3D	# <CJK>
0x4723	0x7275	# <CJK>
0x4724	0x6266	# <CJK>
0x4725	0x948E	# <CJK>
0x4726	0x94C5	# <CJK>
0x4727	0x5343	# <CJK>
0x4728	0x8FC1	# <CJK>
0x4729	0x7B7E	# <CJK>
0x472A	0x4EDF	# <CJK>
0x472B	0x8C26	# <CJK>
0x472C	0x4E7E	# <CJK>
0x472D	0x9ED4	# <CJK>
0x472E	0x94B1	# <CJK>
0x472F	0x94B3	# <CJK>
0x4730	0x524D	# <CJK>
0x4731	0x6F5C	# <CJK>
0x4732	0x9063	# <CJK>
0x4733	0x6D45	# <CJK>
0x4734	0x8C34	# <CJK>
0x4735	0x5811	# <CJK>
0x4736	0x5D4C	# <CJK>
0x4737	0x6B20	# <CJK>
0x4738	0x6B49	# <CJK>
0x4739	0x67AA	# <CJK>
0x473A	0x545B	# <CJK>
0x473B	0x8154	# <CJK>
0x473C	0x7F8C	# <CJK>
0x473D	0x5899	# <CJK>
0x473E	0x8537	# <CJK>
0x473F	0x5F3A	# <CJK>
0x4740	0x62A2	# <CJK>
0x4741	0x6A47	# <CJK>
0x4742	0x9539	# <CJK>
0x4743	0x6572	# <CJK>
0x4744	0x6084	# <CJK>
0x4745	0x6865	# <CJK>
0x4746	0x77A7	# <CJK>
0x4747	0x4E54	# <CJK>
0x4748	0x4FA8	# <CJK>
0x4749	0x5DE7	# <CJK>
0x474A	0x9798	# <CJK>
0x474B	0x64AC	# <CJK>
0x474C	0x7FD8	# <CJK>
0x474D	0x5CED	# <CJK>
0x474E	0x4FCF	# <CJK>
0x474F	0x7A8D	# <CJK>
0x4750	0x5207	# <CJK>
0x4751	0x8304	# <CJK>
0x4752	0x4E14	# <CJK>
0x4753	0x602F	# <CJK>
0x4754	0x7A83	# <CJK>
0x4755	0x94A6	# <CJK>
0x4756	0x4FB5	# <CJK>
0x4757	0x4EB2	# <CJK>
0x4758	0x79E6	# <CJK>
0x4759	0x7434	# <CJK>
0x475A	0x52E4	# <CJK>
0x475B	0x82B9	# <CJK>
0x475C	0x64D2	# <CJK>
0x475D	0x79BD	# <CJK>
0x475E	0x5BDD	# <CJK>
0x475F	0x6C81	# <CJK>
0x4760	0x9752	# <CJK>
0x4761	0x8F7B	# <CJK>
0x4762	0x6C22	# <CJK>
0x4763	0x503E	# <CJK>
0x4764	0x537F	# <CJK>
0x4765	0x6E05	# <CJK>
0x4766	0x64CE	# <CJK>
0x4767	0x6674	# <CJK>
0x4768	0x6C30	# <CJK>
0x4769	0x60C5	# <CJK>
0x476A	0x9877	# <CJK>
0x476B	0x8BF7	# <CJK>
0x476C	0x5E86	# <CJK>
0x476D	0x743C	# <CJK>
0x476E	0x7A77	# <CJK>
0x476F	0x79CB	# <CJK>
0x4770	0x4E18	# <CJK>
0x4771	0x90B1	# <CJK>
0x4772	0x7403	# <CJK>
0x4773	0x6C42	# <CJK>
0x4774	0x56DA	# <CJK>
0x4775	0x914B	# <CJK>
0x4776	0x6CC5	# <CJK>
0x4777	0x8D8B	# <CJK>
0x4778	0x533A	# <CJK>
0x4779	0x86C6	# <CJK>
0x477A	0x66F2	# <CJK>
0x477B	0x8EAF	# <CJK>
0x477C	0x5C48	# <CJK>
0x477D	0x9A71	# <CJK>
0x477E	0x6E20	# <CJK>
0x4821	0x53D6	# <CJK>
0x4822	0x5A36	# <CJK>
0x4823	0x9F8B	# <CJK>
0x4824	0x8DA3	# <CJK>
0x4825	0x53BB	# <CJK>
0x4826	0x5708	# <CJK>
0x4827	0x98A7	# <CJK>
0x4828	0x6743	# <CJK>
0x4829	0x919B	# <CJK>
0x482A	0x6CC9	# <CJK>
0x482B	0x5168	# <CJK>
0x482C	0x75CA	# <CJK>
0x482D	0x62F3	# <CJK>
0x482E	0x72AC	# <CJK>
0x482F	0x5238	# <CJK>
0x4830	0x529D	# <CJK>
0x4831	0x7F3A	# <CJK>
0x4832	0x7094	# <CJK>
0x4833	0x7638	# <CJK>
0x4834	0x5374	# <CJK>
0x4835	0x9E4A	# <CJK>
0x4836	0x69B7	# <CJK>
0x4837	0x786E	# <CJK>
0x4838	0x96C0	# <CJK>
0x4839	0x88D9	# <CJK>
0x483A	0x7FA4	# <CJK>
0x483B	0x7136	# <CJK>
0x483C	0x71C3	# <CJK>
0x483D	0x5189	# <CJK>
0x483E	0x67D3	# <CJK>
0x483F	0x74E4	# <CJK>
0x4840	0x58E4	# <CJK>
0x4841	0x6518	# <CJK>
0x4842	0x56B7	# <CJK>
0x4843	0x8BA9	# <CJK>
0x4844	0x9976	# <CJK>
0x4845	0x6270	# <CJK>
0x4846	0x7ED5	# <CJK>
0x4847	0x60F9	# <CJK>
0x4848	0x70ED	# <CJK>
0x4849	0x58EC	# <CJK>
0x484A	0x4EC1	# <CJK>
0x484B	0x4EBA	# <CJK>
0x484C	0x5FCD	# <CJK>
0x484D	0x97E7	# <CJK>
0x484E	0x4EFB	# <CJK>
0x484F	0x8BA4	# <CJK>
0x4850	0x5203	# <CJK>
0x4851	0x598A	# <CJK>
0x4852	0x7EAB	# <CJK>
0x4853	0x6254	# <CJK>
0x4854	0x4ECD	# <CJK>
0x4855	0x65E5	# <CJK>
0x4856	0x620E	# <CJK>
0x4857	0x8338	# <CJK>
0x4858	0x84C9	# <CJK>
0x4859	0x8363	# <CJK>
0x485A	0x878D	# <CJK>
0x485B	0x7194	# <CJK>
0x485C	0x6EB6	# <CJK>
0x485D	0x5BB9	# <CJK>
0x485E	0x7ED2	# <CJK>
0x485F	0x5197	# <CJK>
0x4860	0x63C9	# <CJK>
0x4861	0x67D4	# <CJK>
0x4862	0x8089	# <CJK>
0x4863	0x8339	# <CJK>
0x4864	0x8815	# <CJK>
0x4865	0x5112	# <CJK>
0x4866	0x5B7A	# <CJK>
0x4867	0x5982	# <CJK>
0x4868	0x8FB1	# <CJK>
0x4869	0x4E73	# <CJK>
0x486A	0x6C5D	# <CJK>
0x486B	0x5165	# <CJK>
0x486C	0x8925	# <CJK>
0x486D	0x8F6F	# <CJK>
0x486E	0x962E	# <CJK>
0x486F	0x854A	# <CJK>
0x4870	0x745E	# <CJK>
0x4871	0x9510	# <CJK>
0x4872	0x95F0	# <CJK>
0x4873	0x6DA6	# <CJK>
0x4874	0x82E5	# <CJK>
0x4875	0x5F31	# <CJK>
0x4876	0x6492	# <CJK>
0x4877	0x6D12	# <CJK>
0x4878	0x8428	# <CJK>
0x4879	0x816E	# <CJK>
0x487A	0x9CC3	# <CJK>
0x487B	0x585E	# <CJK>
0x487C	0x8D5B	# <CJK>
0x487D	0x4E09	# <CJK>
0x487E	0x53C1	# <CJK>
0x4921	0x4F1E	# <CJK>
0x4922	0x6563	# <CJK>
0x4923	0x6851	# <CJK>
0x4924	0x55D3	# <CJK>
0x4925	0x4E27	# <CJK>
0x4926	0x6414	# <CJK>
0x4927	0x9A9A	# <CJK>
0x4928	0x626B	# <CJK>
0x4929	0x5AC2	# <CJK>
0x492A	0x745F	# <CJK>
0x492B	0x8272	# <CJK>
0x492C	0x6DA9	# <CJK>
0x492D	0x68EE	# <CJK>
0x492E	0x50E7	# <CJK>
0x492F	0x838E	# <CJK>
0x4930	0x7802	# <CJK>
0x4931	0x6740	# <CJK>
0x4932	0x5239	# <CJK>
0x4933	0x6C99	# <CJK>
0x4934	0x7EB1	# <CJK>
0x4935	0x50BB	# <CJK>
0x4936	0x5565	# <CJK>
0x4937	0x715E	# <CJK>
0x4938	0x7B5B	# <CJK>
0x4939	0x6652	# <CJK>
0x493A	0x73CA	# <CJK>
0x493B	0x82EB	# <CJK>
0x493C	0x6749	# <CJK>
0x493D	0x5C71	# <CJK>
0x493E	0x5220	# <CJK>
0x493F	0x717D	# <CJK>
0x4940	0x886B	# <CJK>
0x4941	0x95EA	# <CJK>
0x4942	0x9655	# <CJK>
0x4943	0x64C5	# <CJK>
0x4944	0x8D61	# <CJK>
0x4945	0x81B3	# <CJK>
0x4946	0x5584	# <CJK>
0x4947	0x6C55	# <CJK>
0x4948	0x6247	# <CJK>
0x4949	0x7F2E	# <CJK>
0x494A	0x5892	# <CJK>
0x494B	0x4F24	# <CJK>
0x494C	0x5546	# <CJK>
0x494D	0x8D4F	# <CJK>
0x494E	0x664C	# <CJK>
0x494F	0x4E0A	# <CJK>
0x4950	0x5C1A	# <CJK>
0x4951	0x88F3	# <CJK>
0x4952	0x68A2	# <CJK>
0x4953	0x634E	# <CJK>
0x4954	0x7A0D	# <CJK>
0x4955	0x70E7	# <CJK>
0x4956	0x828D	# <CJK>
0x4957	0x52FA	# <CJK>
0x4958	0x97F6	# <CJK>
0x4959	0x5C11	# <CJK>
0x495A	0x54E8	# <CJK>
0x495B	0x90B5	# <CJK>
0x495C	0x7ECD	# <CJK>
0x495D	0x5962	# <CJK>
0x495E	0x8D4A	# <CJK>
0x495F	0x86C7	# <CJK>
0x4960	0x820C	# <CJK>
0x4961	0x820D	# <CJK>
0x4962	0x8D66	# <CJK>
0x4963	0x6444	# <CJK>
0x4964	0x5C04	# <CJK>
0x4965	0x6151	# <CJK>
0x4966	0x6D89	# <CJK>
0x4967	0x793E	# <CJK>
0x4968	0x8BBE	# <CJK>
0x4969	0x7837	# <CJK>
0x496A	0x7533	# <CJK>
0x496B	0x547B	# <CJK>
0x496C	0x4F38	# <CJK>
0x496D	0x8EAB	# <CJK>
0x496E	0x6DF1	# <CJK>
0x496F	0x5A20	# <CJK>
0x4970	0x7EC5	# <CJK>
0x4971	0x795E	# <CJK>
0x4972	0x6C88	# <CJK>
0x4973	0x5BA1	# <CJK>
0x4974	0x5A76	# <CJK>
0x4975	0x751A	# <CJK>
0x4976	0x80BE	# <CJK>
0x4977	0x614E	# <CJK>
0x4978	0x6E17	# <CJK>
0x4979	0x58F0	# <CJK>
0x497A	0x751F	# <CJK>
0x497B	0x7525	# <CJK>
0x497C	0x7272	# <CJK>
0x497D	0x5347	# <CJK>
0x497E	0x7EF3	# <CJK>
0x4A21	0x7701	# <CJK>
0x4A22	0x76DB	# <CJK>
0x4A23	0x5269	# <CJK>
0x4A24	0x80DC	# <CJK>
0x4A25	0x5723	# <CJK>
0x4A26	0x5E08	# <CJK>
0x4A27	0x5931	# <CJK>
0x4A28	0x72EE	# <CJK>
0x4A29	0x65BD	# <CJK>
0x4A2A	0x6E7F	# <CJK>
0x4A2B	0x8BD7	# <CJK>
0x4A2C	0x5C38	# <CJK>
0x4A2D	0x8671	# <CJK>
0x4A2E	0x5341	# <CJK>
0x4A2F	0x77F3	# <CJK>
0x4A30	0x62FE	# <CJK>
0x4A31	0x65F6	# <CJK>
0x4A32	0x4EC0	# <CJK>
0x4A33	0x98DF	# <CJK>
0x4A34	0x8680	# <CJK>
0x4A35	0x5B9E	# <CJK>
0x4A36	0x8BC6	# <CJK>
0x4A37	0x53F2	# <CJK>
0x4A38	0x77E2	# <CJK>
0x4A39	0x4F7F	# <CJK>
0x4A3A	0x5C4E	# <CJK>
0x4A3B	0x9A76	# <CJK>
0x4A3C	0x59CB	# <CJK>
0x4A3D	0x5F0F	# <CJK>
0x4A3E	0x793A	# <CJK>
0x4A3F	0x58EB	# <CJK>
0x4A40	0x4E16	# <CJK>
0x4A41	0x67FF	# <CJK>
0x4A42	0x4E8B	# <CJK>
0x4A43	0x62ED	# <CJK>
0x4A44	0x8A93	# <CJK>
0x4A45	0x901D	# <CJK>
0x4A46	0x52BF	# <CJK>
0x4A47	0x662F	# <CJK>
0x4A48	0x55DC	# <CJK>
0x4A49	0x566C	# <CJK>
0x4A4A	0x9002	# <CJK>
0x4A4B	0x4ED5	# <CJK>
0x4A4C	0x4F8D	# <CJK>
0x4A4D	0x91CA	# <CJK>
0x4A4E	0x9970	# <CJK>
0x4A4F	0x6C0F	# <CJK>
0x4A50	0x5E02	# <CJK>
0x4A51	0x6043	# <CJK>
0x4A52	0x5BA4	# <CJK>
0x4A53	0x89C6	# <CJK>
0x4A54	0x8BD5	# <CJK>
0x4A55	0x6536	# <CJK>
0x4A56	0x624B	# <CJK>
0x4A57	0x9996	# <CJK>
0x4A58	0x5B88	# <CJK>
0x4A59	0x5BFF	# <CJK>
0x4A5A	0x6388	# <CJK>
0x4A5B	0x552E	# <CJK>
0x4A5C	0x53D7	# <CJK>
0x4A5D	0x7626	# <CJK>
0x4A5E	0x517D	# <CJK>
0x4A5F	0x852C	# <CJK>
0x4A60	0x67A2	# <CJK>
0x4A61	0x68B3	# <CJK>
0x4A62	0x6B8A	# <CJK>
0x4A63	0x6292	# <CJK>
0x4A64	0x8F93	# <CJK>
0x4A65	0x53D4	# <CJK>
0x4A66	0x8212	# <CJK>
0x4A67	0x6DD1	# <CJK>
0x4A68	0x758F	# <CJK>
0x4A69	0x4E66	# <CJK>
0x4A6A	0x8D4E	# <CJK>
0x4A6B	0x5B70	# <CJK>
0x4A6C	0x719F	# <CJK>
0x4A6D	0x85AF	# <CJK>
0x4A6E	0x6691	# <CJK>
0x4A6F	0x66D9	# <CJK>
0x4A70	0x7F72	# <CJK>
0x4A71	0x8700	# <CJK>
0x4A72	0x9ECD	# <CJK>
0x4A73	0x9F20	# <CJK>
0x4A74	0x5C5E	# <CJK>
0x4A75	0x672F	# <CJK>
0x4A76	0x8FF0	# <CJK>
0x4A77	0x6811	# <CJK>
0x4A78	0x675F	# <CJK>
0x4A79	0x620D	# <CJK>
0x4A7A	0x7AD6	# <CJK>
0x4A7B	0x5885	# <CJK>
0x4A7C	0x5EB6	# <CJK>
0x4A7D	0x6570	# <CJK>
0x4A7E	0x6F31	# <CJK>
0x4B21	0x6055	# <CJK>
0x4B22	0x5237	# <CJK>
0x4B23	0x800D	# <CJK>
0x4B24	0x6454	# <CJK>
0x4B25	0x8870	# <CJK>
0x4B26	0x7529	# <CJK>
0x4B27	0x5E05	# <CJK>
0x4B28	0x6813	# <CJK>
0x4B29	0x62F4	# <CJK>
0x4B2A	0x971C	# <CJK>
0x4B2B	0x53CC	# <CJK>
0x4B2C	0x723D	# <CJK>
0x4B2D	0x8C01	# <CJK>
0x4B2E	0x6C34	# <CJK>
0x4B2F	0x7761	# <CJK>
0x4B30	0x7A0E	# <CJK>
0x4B31	0x542E	# <CJK>
0x4B32	0x77AC	# <CJK>
0x4B33	0x987A	# <CJK>
0x4B34	0x821C	# <CJK>
0x4B35	0x8BF4	# <CJK>
0x4B36	0x7855	# <CJK>
0x4B37	0x6714	# <CJK>
0x4B38	0x70C1	# <CJK>
0x4B39	0x65AF	# <CJK>
0x4B3A	0x6495	# <CJK>
0x4B3B	0x5636	# <CJK>
0x4B3C	0x601D	# <CJK>
0x4B3D	0x79C1	# <CJK>
0x4B3E	0x53F8	# <CJK>
0x4B3F	0x4E1D	# <CJK>
0x4B40	0x6B7B	# <CJK>
0x4B41	0x8086	# <CJK>
0x4B42	0x5BFA	# <CJK>
0x4B43	0x55E3	# <CJK>
0x4B44	0x56DB	# <CJK>
0x4B45	0x4F3A	# <CJK>
0x4B46	0x4F3C	# <CJK>
0x4B47	0x9972	# <CJK>
0x4B48	0x5DF3	# <CJK>
0x4B49	0x677E	# <CJK>
0x4B4A	0x8038	# <CJK>
0x4B4B	0x6002	# <CJK>
0x4B4C	0x9882	# <CJK>
0x4B4D	0x9001	# <CJK>
0x4B4E	0x5B8B	# <CJK>
0x4B4F	0x8BBC	# <CJK>
0x4B50	0x8BF5	# <CJK>
0x4B51	0x641C	# <CJK>
0x4B52	0x8258	# <CJK>
0x4B53	0x64DE	# <CJK>
0x4B54	0x55FD	# <CJK>
0x4B55	0x82CF	# <CJK>
0x4B56	0x9165	# <CJK>
0x4B57	0x4FD7	# <CJK>
0x4B58	0x7D20	# <CJK>
0x4B59	0x901F	# <CJK>
0x4B5A	0x7C9F	# <CJK>
0x4B5B	0x50F3	# <CJK>
0x4B5C	0x5851	# <CJK>
0x4B5D	0x6EAF	# <CJK>
0x4B5E	0x5BBF	# <CJK>
0x4B5F	0x8BC9	# <CJK>
0x4B60	0x8083	# <CJK>
0x4B61	0x9178	# <CJK>
0x4B62	0x849C	# <CJK>
0x4B63	0x7B97	# <CJK>
0x4B64	0x867D	# <CJK>
0x4B65	0x968B	# <CJK>
0x4B66	0x968F	# <CJK>
0x4B67	0x7EE5	# <CJK>
0x4B68	0x9AD3	# <CJK>
0x4B69	0x788E	# <CJK>
0x4B6A	0x5C81	# <CJK>
0x4B6B	0x7A57	# <CJK>
0x4B6C	0x9042	# <CJK>
0x4B6D	0x96A7	# <CJK>
0x4B6E	0x795F	# <CJK>
0x4B6F	0x5B59	# <CJK>
0x4B70	0x635F	# <CJK>
0x4B71	0x7B0B	# <CJK>
0x4B72	0x84D1	# <CJK>
0x4B73	0x68AD	# <CJK>
0x4B74	0x5506	# <CJK>
0x4B75	0x7F29	# <CJK>
0x4B76	0x7410	# <CJK>
0x4B77	0x7D22	# <CJK>
0x4B78	0x9501	# <CJK>
0x4B79	0x6240	# <CJK>
0x4B7A	0x584C	# <CJK>
0x4B7B	0x4ED6	# <CJK>
0x4B7C	0x5B83	# <CJK>
0x4B7D	0x5979	# <CJK>
0x4B7E	0x5854	# <CJK>
0x4C21	0x736D	# <CJK>
0x4C22	0x631E	# <CJK>
0x4C23	0x8E4B	# <CJK>
0x4C24	0x8E0F	# <CJK>
0x4C25	0x80CE	# <CJK>
0x4C26	0x82D4	# <CJK>
0x4C27	0x62AC	# <CJK>
0x4C28	0x53F0	# <CJK>
0x4C29	0x6CF0	# <CJK>
0x4C2A	0x915E	# <CJK>
0x4C2B	0x592A	# <CJK>
0x4C2C	0x6001	# <CJK>
0x4C2D	0x6C70	# <CJK>
0x4C2E	0x574D	# <CJK>
0x4C2F	0x644A	# <CJK>
0x4C30	0x8D2A	# <CJK>
0x4C31	0x762B	# <CJK>
0x4C32	0x6EE9	# <CJK>
0x4C33	0x575B	# <CJK>
0x4C34	0x6A80	# <CJK>
0x4C35	0x75F0	# <CJK>
0x4C36	0x6F6D	# <CJK>
0x4C37	0x8C2D	# <CJK>
0x4C38	0x8C08	# <CJK>
0x4C39	0x5766	# <CJK>
0x4C3A	0x6BEF	# <CJK>
0x4C3B	0x8892	# <CJK>
0x4C3C	0x78B3	# <CJK>
0x4C3D	0x63A2	# <CJK>
0x4C3E	0x53F9	# <CJK>
0x4C3F	0x70AD	# <CJK>
0x4C40	0x6C64	# <CJK>
0x4C41	0x5858	# <CJK>
0x4C42	0x642A	# <CJK>
0x4C43	0x5802	# <CJK>
0x4C44	0x68E0	# <CJK>
0x4C45	0x819B	# <CJK>
0x4C46	0x5510	# <CJK>
0x4C47	0x7CD6	# <CJK>
0x4C48	0x5018	# <CJK>
0x4C49	0x8EBA	# <CJK>
0x4C4A	0x6DCC	# <CJK>
0x4C4B	0x8D9F	# <CJK>
0x4C4C	0x70EB	# <CJK>
0x4C4D	0x638F	# <CJK>
0x4C4E	0x6D9B	# <CJK>
0x4C4F	0x6ED4	# <CJK>
0x4C50	0x7EE6	# <CJK>
0x4C51	0x8404	# <CJK>
0x4C52	0x6843	# <CJK>
0x4C53	0x9003	# <CJK>
0x4C54	0x6DD8	# <CJK>
0x4C55	0x9676	# <CJK>
0x4C56	0x8BA8	# <CJK>
0x4C57	0x5957	# <CJK>
0x4C58	0x7279	# <CJK>
0x4C59	0x85E4	# <CJK>
0x4C5A	0x817E	# <CJK>
0x4C5B	0x75BC	# <CJK>
0x4C5C	0x8A8A	# <CJK>
0x4C5D	0x68AF	# <CJK>
0x4C5E	0x5254	# <CJK>
0x4C5F	0x8E22	# <CJK>
0x4C60	0x9511	# <CJK>
0x4C61	0x63D0	# <CJK>
0x4C62	0x9898	# <CJK>
0x4C63	0x8E44	# <CJK>
0x4C64	0x557C	# <CJK>
0x4C65	0x4F53	# <CJK>
0x4C66	0x66FF	# <CJK>
0x4C67	0x568F	# <CJK>
0x4C68	0x60D5	# <CJK>
0x4C69	0x6D95	# <CJK>
0x4C6A	0x5243	# <CJK>
0x4C6B	0x5C49	# <CJK>
0x4C6C	0x5929	# <CJK>
0x4C6D	0x6DFB	# <CJK>
0x4C6E	0x586B	# <CJK>
0x4C6F	0x7530	# <CJK>
0x4C70	0x751C	# <CJK>
0x4C71	0x606C	# <CJK>
0x4C72	0x8214	# <CJK>
0x4C73	0x8146	# <CJK>
0x4C74	0x6311	# <CJK>
0x4C75	0x6761	# <CJK>
0x4C76	0x8FE2	# <CJK>
0x4C77	0x773A	# <CJK>
0x4C78	0x8DF3	# <CJK>
0x4C79	0x8D34	# <CJK>
0x4C7A	0x94C1	# <CJK>
0x4C7B	0x5E16	# <CJK>
0x4C7C	0x5385	# <CJK>
0x4C7D	0x542C	# <CJK>
0x4C7E	0x70C3	# <CJK>
0x4D21	0x6C40	# <CJK>
0x4D22	0x5EF7	# <CJK>
0x4D23	0x505C	# <CJK>
0x4D24	0x4EAD	# <CJK>
0x4D25	0x5EAD	# <CJK>
0x4D26	0x633A	# <CJK>
0x4D27	0x8247	# <CJK>
0x4D28	0x901A	# <CJK>
0x4D29	0x6850	# <CJK>
0x4D2A	0x916E	# <CJK>
0x4D2B	0x77B3	# <CJK>
0x4D2C	0x540C	# <CJK>
0x4D2D	0x94DC	# <CJK>
0x4D2E	0x5F64	# <CJK>
0x4D2F	0x7AE5	# <CJK>
0x4D30	0x6876	# <CJK>
0x4D31	0x6345	# <CJK>
0x4D32	0x7B52	# <CJK>
0x4D33	0x7EDF	# <CJK>
0x4D34	0x75DB	# <CJK>
0x4D35	0x5077	# <CJK>
0x4D36	0x6295	# <CJK>
0x4D37	0x5934	# <CJK>
0x4D38	0x900F	# <CJK>
0x4D39	0x51F8	# <CJK>
0x4D3A	0x79C3	# <CJK>
0x4D3B	0x7A81	# <CJK>
0x4D3C	0x56FE	# <CJK>
0x4D3D	0x5F92	# <CJK>
0x4D3E	0x9014	# <CJK>
0x4D3F	0x6D82	# <CJK>
0x4D40	0x5C60	# <CJK>
0x4D41	0x571F	# <CJK>
0x4D42	0x5410	# <CJK>
0x4D43	0x5154	# <CJK>
0x4D44	0x6E4D	# <CJK>
0x4D45	0x56E2	# <CJK>
0x4D46	0x63A8	# <CJK>
0x4D47	0x9893	# <CJK>
0x4D48	0x817F	# <CJK>
0x4D49	0x8715	# <CJK>
0x4D4A	0x892A	# <CJK>
0x4D4B	0x9000	# <CJK>
0x4D4C	0x541E	# <CJK>
0x4D4D	0x5C6F	# <CJK>
0x4D4E	0x81C0	# <CJK>
0x4D4F	0x62D6	# <CJK>
0x4D50	0x6258	# <CJK>
0x4D51	0x8131	# <CJK>
0x4D52	0x9E35	# <CJK>
0x4D53	0x9640	# <CJK>
0x4D54	0x9A6E	# <CJK>
0x4D55	0x9A7C	# <CJK>
0x4D56	0x692D	# <CJK>
0x4D57	0x59A5	# <CJK>
0x4D58	0x62D3	# <CJK>
0x4D59	0x553E	# <CJK>
0x4D5A	0x6316	# <CJK>
0x4D5B	0x54C7	# <CJK>
0x4D5C	0x86D9	# <CJK>
0x4D5D	0x6D3C	# <CJK>
0x4D5E	0x5A03	# <CJK>
0x4D5F	0x74E6	# <CJK>
0x4D60	0x889C	# <CJK>
0x4D61	0x6B6A	# <CJK>
0x4D62	0x5916	# <CJK>
0x4D63	0x8C4C	# <CJK>
0x4D64	0x5F2F	# <CJK>
0x4D65	0x6E7E	# <CJK>
0x4D66	0x73A9	# <CJK>
0x4D67	0x987D	# <CJK>
0x4D68	0x4E38	# <CJK>
0x4D69	0x70F7	# <CJK>
0x4D6A	0x5B8C	# <CJK>
0x4D6B	0x7897	# <CJK>
0x4D6C	0x633D	# <CJK>
0x4D6D	0x665A	# <CJK>
0x4D6E	0x7696	# <CJK>
0x4D6F	0x60CB	# <CJK>
0x4D70	0x5B9B	# <CJK>
0x4D71	0x5A49	# <CJK>
0x4D72	0x4E07	# <CJK>
0x4D73	0x8155	# <CJK>
0x4D74	0x6C6A	# <CJK>
0x4D75	0x738B	# <CJK>
0x4D76	0x4EA1	# <CJK>
0x4D77	0x6789	# <CJK>
0x4D78	0x7F51	# <CJK>
0x4D79	0x5F80	# <CJK>
0x4D7A	0x65FA	# <CJK>
0x4D7B	0x671B	# <CJK>
0x4D7C	0x5FD8	# <CJK>
0x4D7D	0x5984	# <CJK>
0x4D7E	0x5A01	# <CJK>
0x4E21	0x5DCD	# <CJK>
0x4E22	0x5FAE	# <CJK>
0x4E23	0x5371	# <CJK>
0x4E24	0x97E6	# <CJK>
0x4E25	0x8FDD	# <CJK>
0x4E26	0x6845	# <CJK>
0x4E27	0x56F4	# <CJK>
0x4E28	0x552F	# <CJK>
0x4E29	0x60DF	# <CJK>
0x4E2A	0x4E3A	# <CJK>
0x4E2B	0x6F4D	# <CJK>
0x4E2C	0x7EF4	# <CJK>
0x4E2D	0x82C7	# <CJK>
0x4E2E	0x840E	# <CJK>
0x4E2F	0x59D4	# <CJK>
0x4E30	0x4F1F	# <CJK>
0x4E31	0x4F2A	# <CJK>
0x4E32	0x5C3E	# <CJK>
0x4E33	0x7EAC	# <CJK>
0x4E34	0x672A	# <CJK>
0x4E35	0x851A	# <CJK>
0x4E36	0x5473	# <CJK>
0x4E37	0x754F	# <CJK>
0x4E38	0x80C3	# <CJK>
0x4E39	0x5582	# <CJK>
0x4E3A	0x9B4F	# <CJK>
0x4E3B	0x4F4D	# <CJK>
0x4E3C	0x6E2D	# <CJK>
0x4E3D	0x8C13	# <CJK>
0x4E3E	0x5C09	# <CJK>
0x4E3F	0x6170	# <CJK>
0x4E40	0x536B	# <CJK>
0x4E41	0x761F	# <CJK>
0x4E42	0x6E29	# <CJK>
0x4E43	0x868A	# <CJK>
0x4E44	0x6587	# <CJK>
0x4E45	0x95FB	# <CJK>
0x4E46	0x7EB9	# <CJK>
0x4E47	0x543B	# <CJK>
0x4E48	0x7A33	# <CJK>
0x4E49	0x7D0A	# <CJK>
0x4E4A	0x95EE	# <CJK>
0x4E4B	0x55E1	# <CJK>
0x4E4C	0x7FC1	# <CJK>
0x4E4D	0x74EE	# <CJK>
0x4E4E	0x631D	# <CJK>
0x4E4F	0x8717	# <CJK>
0x4E50	0x6DA1	# <CJK>
0x4E51	0x7A9D	# <CJK>
0x4E52	0x6211	# <CJK>
0x4E53	0x65A1	# <CJK>
0x4E54	0x5367	# <CJK>
0x4E55	0x63E1	# <CJK>
0x4E56	0x6C83	# <CJK>
0x4E57	0x5DEB	# <CJK>
0x4E58	0x545C	# <CJK>
0x4E59	0x94A8	# <CJK>
0x4E5A	0x4E4C	# <CJK>
0x4E5B	0x6C61	# <CJK>
0x4E5C	0x8BEC	# <CJK>
0x4E5D	0x5C4B	# <CJK>
0x4E5E	0x65E0	# <CJK>
0x4E5F	0x829C	# <CJK>
0x4E60	0x68A7	# <CJK>
0x4E61	0x543E	# <CJK>
0x4E62	0x5434	# <CJK>
0x4E63	0x6BCB	# <CJK>
0x4E64	0x6B66	# <CJK>
0x4E65	0x4E94	# <CJK>
0x4E66	0x6342	# <CJK>
0x4E67	0x5348	# <CJK>
0x4E68	0x821E	# <CJK>
0x4E69	0x4F0D	# <CJK>
0x4E6A	0x4FAE	# <CJK>
0x4E6B	0x575E	# <CJK>
0x4E6C	0x620A	# <CJK>
0x4E6D	0x96FE	# <CJK>
0x4E6E	0x6664	# <CJK>
0x4E6F	0x7269	# <CJK>
0x4E70	0x52FF	# <CJK>
0x4E71	0x52A1	# <CJK>
0x4E72	0x609F	# <CJK>
0x4E73	0x8BEF	# <CJK>
0x4E74	0x6614	# <CJK>
0x4E75	0x7199	# <CJK>
0x4E76	0x6790	# <CJK>
0x4E77	0x897F	# <CJK>
0x4E78	0x7852	# <CJK>
0x4E79	0x77FD	# <CJK>
0x4E7A	0x6670	# <CJK>
0x4E7B	0x563B	# <CJK>
0x4E7C	0x5438	# <CJK>
0x4E7D	0x9521	# <CJK>
0x4E7E	0x727A	# <CJK>
0x4F21	0x7A00	# <CJK>
0x4F22	0x606F	# <CJK>
0x4F23	0x5E0C	# <CJK>
0x4F24	0x6089	# <CJK>
0x4F25	0x819D	# <CJK>
0x4F26	0x5915	# <CJK>
0x4F27	0x60DC	# <CJK>
0x4F28	0x7184	# <CJK>
0x4F29	0x70EF	# <CJK>
0x4F2A	0x6EAA	# <CJK>
0x4F2B	0x6C50	# <CJK>
0x4F2C	0x7280	# <CJK>
0x4F2D	0x6A84	# <CJK>
0x4F2E	0x88AD	# <CJK>
0x4F2F	0x5E2D	# <CJK>
0x4F30	0x4E60	# <CJK>
0x4F31	0x5AB3	# <CJK>
0x4F32	0x559C	# <CJK>
0x4F33	0x94E3	# <CJK>
0x4F34	0x6D17	# <CJK>
0x4F35	0x7CFB	# <CJK>
0x4F36	0x9699	# <CJK>
0x4F37	0x620F	# <CJK>
0x4F38	0x7EC6	# <CJK>
0x4F39	0x778E	# <CJK>
0x4F3A	0x867E	# <CJK>
0x4F3B	0x5323	# <CJK>
0x4F3C	0x971E	# <CJK>
0x4F3D	0x8F96	# <CJK>
0x4F3E	0x6687	# <CJK>
0x4F3F	0x5CE1	# <CJK>
0x4F40	0x4FA0	# <CJK>
0x4F41	0x72ED	# <CJK>
0x4F42	0x4E0B	# <CJK>
0x4F43	0x53A6	# <CJK>
0x4F44	0x590F	# <CJK>
0x4F45	0x5413	# <CJK>
0x4F46	0x6380	# <CJK>
0x4F47	0x9528	# <CJK>
0x4F48	0x5148	# <CJK>
0x4F49	0x4ED9	# <CJK>
0x4F4A	0x9C9C	# <CJK>
0x4F4B	0x7EA4	# <CJK>
0x4F4C	0x54B8	# <CJK>
0x4F4D	0x8D24	# <CJK>
0x4F4E	0x8854	# <CJK>
0x4F4F	0x8237	# <CJK>
0x4F50	0x95F2	# <CJK>
0x4F51	0x6D8E	# <CJK>
0x4F52	0x5F26	# <CJK>
0x4F53	0x5ACC	# <CJK>
0x4F54	0x663E	# <CJK>
0x4F55	0x9669	# <CJK>
0x4F56	0x73B0	# <CJK>
0x4F57	0x732E	# <CJK>
0x4F58	0x53BF	# <CJK>
0x4F59	0x817A	# <CJK>
0x4F5A	0x9985	# <CJK>
0x4F5B	0x7FA1	# <CJK>
0x4F5C	0x5BAA	# <CJK>
0x4F5D	0x9677	# <CJK>
0x4F5E	0x9650	# <CJK>
0x4F5F	0x7EBF	# <CJK>
0x4F60	0x76F8	# <CJK>
0x4F61	0x53A2	# <CJK>
0x4F62	0x9576	# <CJK>
0x4F63	0x9999	# <CJK>
0x4F64	0x7BB1	# <CJK>
0x4F65	0x8944	# <CJK>
0x4F66	0x6E58	# <CJK>
0x4F67	0x4E61	# <CJK>
0x4F68	0x7FD4	# <CJK>
0x4F69	0x7965	# <CJK>
0x4F6A	0x8BE6	# <CJK>
0x4F6B	0x60F3	# <CJK>
0x4F6C	0x54CD	# <CJK>
0x4F6D	0x4EAB	# <CJK>
0x4F6E	0x9879	# <CJK>
0x4F6F	0x5DF7	# <CJK>
0x4F70	0x6A61	# <CJK>
0x4F71	0x50CF	# <CJK>
0x4F72	0x5411	# <CJK>
0x4F73	0x8C61	# <CJK>
0x4F74	0x8427	# <CJK>
0x4F75	0x785D	# <CJK>
0x4F76	0x9704	# <CJK>
0x4F77	0x524A	# <CJK>
0x4F78	0x54EE	# <CJK>
0x4F79	0x56A3	# <CJK>
0x4F7A	0x9500	# <CJK>
0x4F7B	0x6D88	# <CJK>
0x4F7C	0x5BB5	# <CJK>
0x4F7D	0x6DC6	# <CJK>
0x4F7E	0x6653	# <CJK>
0x5021	0x5C0F	# <CJK>
0x5022	0x5B5D	# <CJK>
0x5023	0x6821	# <CJK>
0x5024	0x8096	# <CJK>
0x5025	0x5578	# <CJK>
0x5026	0x7B11	# <CJK>
0x5027	0x6548	# <CJK>
0x5028	0x6954	# <CJK>
0x5029	0x4E9B	# <CJK>
0x502A	0x6B47	# <CJK>
0x502B	0x874E	# <CJK>
0x502C	0x978B	# <CJK>
0x502D	0x534F	# <CJK>
0x502E	0x631F	# <CJK>
0x502F	0x643A	# <CJK>
0x5030	0x90AA	# <CJK>
0x5031	0x659C	# <CJK>
0x5032	0x80C1	# <CJK>
0x5033	0x8C10	# <CJK>
0x5034	0x5199	# <CJK>
0x5035	0x68B0	# <CJK>
0x5036	0x5378	# <CJK>
0x5037	0x87F9	# <CJK>
0x5038	0x61C8	# <CJK>
0x5039	0x6CC4	# <CJK>
0x503A	0x6CFB	# <CJK>
0x503B	0x8C22	# <CJK>
0x503C	0x5C51	# <CJK>
0x503D	0x85AA	# <CJK>
0x503E	0x82AF	# <CJK>
0x503F	0x950C	# <CJK>
0x5040	0x6B23	# <CJK>
0x5041	0x8F9B	# <CJK>
0x5042	0x65B0	# <CJK>
0x5043	0x5FFB	# <CJK>
0x5044	0x5FC3	# <CJK>
0x5045	0x4FE1	# <CJK>
0x5046	0x8845	# <CJK>
0x5047	0x661F	# <CJK>
0x5048	0x8165	# <CJK>
0x5049	0x7329	# <CJK>
0x504A	0x60FA	# <CJK>
0x504B	0x5174	# <CJK>
0x504C	0x5211	# <CJK>
0x504D	0x578B	# <CJK>
0x504E	0x5F62	# <CJK>
0x504F	0x90A2	# <CJK>
0x5050	0x884C	# <CJK>
0x5051	0x9192	# <CJK>
0x5052	0x5E78	# <CJK>
0x5053	0x674F	# <CJK>
0x5054	0x6027	# <CJK>
0x5055	0x59D3	# <CJK>
0x5056	0x5144	# <CJK>
0x5057	0x51F6	# <CJK>
0x5058	0x80F8	# <CJK>
0x5059	0x5308	# <CJK>
0x505A	0x6C79	# <CJK>
0x505B	0x96C4	# <CJK>
0x505C	0x718A	# <CJK>
0x505D	0x4F11	# <CJK>
0x505E	0x4FEE	# <CJK>
0x505F	0x7F9E	# <CJK>
0x5060	0x673D	# <CJK>
0x5061	0x55C5	# <CJK>
0x5062	0x9508	# <CJK>
0x5063	0x79C0	# <CJK>
0x5064	0x8896	# <CJK>
0x5065	0x7EE3	# <CJK>
0x5066	0x589F	# <CJK>
0x5067	0x620C	# <CJK>
0x5068	0x9700	# <CJK>
0x5069	0x865A	# <CJK>
0x506A	0x5618	# <CJK>
0x506B	0x987B	# <CJK>
0x506C	0x5F90	# <CJK>
0x506D	0x8BB8	# <CJK>
0x506E	0x84C4	# <CJK>
0x506F	0x9157	# <CJK>
0x5070	0x53D9	# <CJK>
0x5071	0x65ED	# <CJK>
0x5072	0x5E8F	# <CJK>
0x5073	0x755C	# <CJK>
0x5074	0x6064	# <CJK>
0x5075	0x7D6E	# <CJK>
0x5076	0x5A7F	# <CJK>
0x5077	0x7EEA	# <CJK>
0x5078	0x7EED	# <CJK>
0x5079	0x8F69	# <CJK>
0x507A	0x55A7	# <CJK>
0x507B	0x5BA3	# <CJK>
0x507C	0x60AC	# <CJK>
0x507D	0x65CB	# <CJK>
0x507E	0x7384	# <CJK>
0x5121	0x9009	# <CJK>
0x5122	0x7663	# <CJK>
0x5123	0x7729	# <CJK>
0x5124	0x7EDA	# <CJK>
0x5125	0x9774	# <CJK>
0x5126	0x859B	# <CJK>
0x5127	0x5B66	# <CJK>
0x5128	0x7A74	# <CJK>
0x5129	0x96EA	# <CJK>
0x512A	0x8840	# <CJK>
0x512B	0x52CB	# <CJK>
0x512C	0x718F	# <CJK>
0x512D	0x5FAA	# <CJK>
0x512E	0x65EC	# <CJK>
0x512F	0x8BE2	# <CJK>
0x5130	0x5BFB	# <CJK>
0x5131	0x9A6F	# <CJK>
0x5132	0x5DE1	# <CJK>
0x5133	0x6B89	# <CJK>
0x5134	0x6C5B	# <CJK>
0x5135	0x8BAD	# <CJK>
0x5136	0x8BAF	# <CJK>
0x5137	0x900A	# <CJK>
0x5138	0x8FC5	# <CJK>
0x5139	0x538B	# <CJK>
0x513A	0x62BC	# <CJK>
0x513B	0x9E26	# <CJK>
0x513C	0x9E2D	# <CJK>
0x513D	0x5440	# <CJK>
0x513E	0x4E2B	# <CJK>
0x513F	0x82BD	# <CJK>
0x5140	0x7259	# <CJK>
0x5141	0x869C	# <CJK>
0x5142	0x5D16	# <CJK>
0x5143	0x8859	# <CJK>
0x5144	0x6DAF	# <CJK>
0x5145	0x96C5	# <CJK>
0x5146	0x54D1	# <CJK>
0x5147	0x4E9A	# <CJK>
0x5148	0x8BB6	# <CJK>
0x5149	0x7109	# <CJK>
0x514A	0x54BD	# <CJK>
0x514B	0x9609	# <CJK>
0x514C	0x70DF	# <CJK>
0x514D	0x6DF9	# <CJK>
0x514E	0x76D0	# <CJK>
0x514F	0x4E25	# <CJK>
0x5150	0x7814	# <CJK>
0x5151	0x8712	# <CJK>
0x5152	0x5CA9	# <CJK>
0x5153	0x5EF6	# <CJK>
0x5154	0x8A00	# <CJK>
0x5155	0x989C	# <CJK>
0x5156	0x960E	# <CJK>
0x5157	0x708E	# <CJK>
0x5158	0x6CBF	# <CJK>
0x5159	0x5944	# <CJK>
0x515A	0x63A9	# <CJK>
0x515B	0x773C	# <CJK>
0x515C	0x884D	# <CJK>
0x515D	0x6F14	# <CJK>
0x515E	0x8273	# <CJK>
0x515F	0x5830	# <CJK>
0x5160	0x71D5	# <CJK>
0x5161	0x538C	# <CJK>
0x5162	0x781A	# <CJK>
0x5163	0x96C1	# <CJK>
0x5164	0x5501	# <CJK>
0x5165	0x5F66	# <CJK>
0x5166	0x7130	# <CJK>
0x5167	0x5BB4	# <CJK>
0x5168	0x8C1A	# <CJK>
0x5169	0x9A8C	# <CJK>
0x516A	0x6B83	# <CJK>
0x516B	0x592E	# <CJK>
0x516C	0x9E2F	# <CJK>
0x516D	0x79E7	# <CJK>
0x516E	0x6768	# <CJK>
0x516F	0x626C	# <CJK>
0x5170	0x4F6F	# <CJK>
0x5171	0x75A1	# <CJK>
0x5172	0x7F8A	# <CJK>
0x5173	0x6D0B	# <CJK>
0x5174	0x9633	# <CJK>
0x5175	0x6C27	# <CJK>
0x5176	0x4EF0	# <CJK>
0x5177	0x75D2	# <CJK>
0x5178	0x517B	# <CJK>
0x5179	0x6837	# <CJK>
0x517A	0x6F3E	# <CJK>
0x517B	0x9080	# <CJK>
0x517C	0x8170	# <CJK>
0x517D	0x5996	# <CJK>
0x517E	0x7476	# <CJK>
0x5221	0x6447	# <CJK>
0x5222	0x5C27	# <CJK>
0x5223	0x9065	# <CJK>
0x5224	0x7A91	# <CJK>
0x5225	0x8C23	# <CJK>
0x5226	0x59DA	# <CJK>
0x5227	0x54AC	# <CJK>
0x5228	0x8200	# <CJK>
0x5229	0x836F	# <CJK>
0x522A	0x8981	# <CJK>
0x522B	0x8000	# <CJK>
0x522C	0x6930	# <CJK>
0x522D	0x564E	# <CJK>
0x522E	0x8036	# <CJK>
0x522F	0x7237	# <CJK>
0x5230	0x91CE	# <CJK>
0x5231	0x51B6	# <CJK>
0x5232	0x4E5F	# <CJK>
0x5233	0x9875	# <CJK>
0x5234	0x6396	# <CJK>
0x5235	0x4E1A	# <CJK>
0x5236	0x53F6	# <CJK>
0x5237	0x66F3	# <CJK>
0x5238	0x814B	# <CJK>
0x5239	0x591C	# <CJK>
0x523A	0x6DB2	# <CJK>
0x523B	0x4E00	# <CJK>
0x523C	0x58F9	# <CJK>
0x523D	0x533B	# <CJK>
0x523E	0x63D6	# <CJK>
0x523F	0x94F1	# <CJK>
0x5240	0x4F9D	# <CJK>
0x5241	0x4F0A	# <CJK>
0x5242	0x8863	# <CJK>
0x5243	0x9890	# <CJK>
0x5244	0x5937	# <CJK>
0x5245	0x9057	# <CJK>
0x5246	0x79FB	# <CJK>
0x5247	0x4EEA	# <CJK>
0x5248	0x80F0	# <CJK>
0x5249	0x7591	# <CJK>
0x524A	0x6C82	# <CJK>
0x524B	0x5B9C	# <CJK>
0x524C	0x59E8	# <CJK>
0x524D	0x5F5D	# <CJK>
0x524E	0x6905	# <CJK>
0x524F	0x8681	# <CJK>
0x5250	0x501A	# <CJK>
0x5251	0x5DF2	# <CJK>
0x5252	0x4E59	# <CJK>
0x5253	0x77E3	# <CJK>
0x5254	0x4EE5	# <CJK>
0x5255	0x827A	# <CJK>
0x5256	0x6291	# <CJK>
0x5257	0x6613	# <CJK>
0x5258	0x9091	# <CJK>
0x5259	0x5C79	# <CJK>
0x525A	0x4EBF	# <CJK>
0x525B	0x5F79	# <CJK>
0x525C	0x81C6	# <CJK>
0x525D	0x9038	# <CJK>
0x525E	0x8084	# <CJK>
0x525F	0x75AB	# <CJK>
0x5260	0x4EA6	# <CJK>
0x5261	0x88D4	# <CJK>
0x5262	0x610F	# <CJK>
0x5263	0x6BC5	# <CJK>
0x5264	0x5FC6	# <CJK>
0x5265	0x4E49	# <CJK>
0x5266	0x76CA	# <CJK>
0x5267	0x6EA2	# <CJK>
0x5268	0x8BE3	# <CJK>
0x5269	0x8BAE	# <CJK>
0x526A	0x8C0A	# <CJK>
0x526B	0x8BD1	# <CJK>
0x526C	0x5F02	# <CJK>
0x526D	0x7FFC	# <CJK>
0x526E	0x7FCC	# <CJK>
0x526F	0x7ECE	# <CJK>
0x5270	0x8335	# <CJK>
0x5271	0x836B	# <CJK>
0x5272	0x56E0	# <CJK>
0x5273	0x6BB7	# <CJK>
0x5274	0x97F3	# <CJK>
0x5275	0x9634	# <CJK>
0x5276	0x59FB	# <CJK>
0x5277	0x541F	# <CJK>
0x5278	0x94F6	# <CJK>
0x5279	0x6DEB	# <CJK>
0x527A	0x5BC5	# <CJK>
0x527B	0x996E	# <CJK>
0x527C	0x5C39	# <CJK>
0x527D	0x5F15	# <CJK>
0x527E	0x9690	# <CJK>
0x5321	0x5370	# <CJK>
0x5322	0x82F1	# <CJK>
0x5323	0x6A31	# <CJK>
0x5324	0x5A74	# <CJK>
0x5325	0x9E70	# <CJK>
0x5326	0x5E94	# <CJK>
0x5327	0x7F28	# <CJK>
0x5328	0x83B9	# <CJK>
0x5329	0x8424	# <CJK>
0x532A	0x8425	# <CJK>
0x532B	0x8367	# <CJK>
0x532C	0x8747	# <CJK>
0x532D	0x8FCE	# <CJK>
0x532E	0x8D62	# <CJK>
0x532F	0x76C8	# <CJK>
0x5330	0x5F71	# <CJK>
0x5331	0x9896	# <CJK>
0x5332	0x786C	# <CJK>
0x5333	0x6620	# <CJK>
0x5334	0x54DF	# <CJK>
0x5335	0x62E5	# <CJK>
0x5336	0x4F63	# <CJK>
0x5337	0x81C3	# <CJK>
0x5338	0x75C8	# <CJK>
0x5339	0x5EB8	# <CJK>
0x533A	0x96CD	# <CJK>
0x533B	0x8E0A	# <CJK>
0x533C	0x86F9	# <CJK>
0x533D	0x548F	# <CJK>
0x533E	0x6CF3	# <CJK>
0x533F	0x6D8C	# <CJK>
0x5340	0x6C38	# <CJK>
0x5341	0x607F	# <CJK>
0x5342	0x52C7	# <CJK>
0x5343	0x7528	# <CJK>
0x5344	0x5E7D	# <CJK>
0x5345	0x4F18	# <CJK>
0x5346	0x60A0	# <CJK>
0x5347	0x5FE7	# <CJK>
0x5348	0x5C24	# <CJK>
0x5349	0x7531	# <CJK>
0x534A	0x90AE	# <CJK>
0x534B	0x94C0	# <CJK>
0x534C	0x72B9	# <CJK>
0x534D	0x6CB9	# <CJK>
0x534E	0x6E38	# <CJK>
0x534F	0x9149	# <CJK>
0x5350	0x6709	# <CJK>
0x5351	0x53CB	# <CJK>
0x5352	0x53F3	# <CJK>
0x5353	0x4F51	# <CJK>
0x5354	0x91C9	# <CJK>
0x5355	0x8BF1	# <CJK>
0x5356	0x53C8	# <CJK>
0x5357	0x5E7C	# <CJK>
0x5358	0x8FC2	# <CJK>
0x5359	0x6DE4	# <CJK>
0x535A	0x4E8E	# <CJK>
0x535B	0x76C2	# <CJK>
0x535C	0x6986	# <CJK>
0x535D	0x865E	# <CJK>
0x535E	0x611A	# <CJK>
0x535F	0x8206	# <CJK>
0x5360	0x4F59	# <CJK>
0x5361	0x4FDE	# <CJK>
0x5362	0x903E	# <CJK>
0x5363	0x9C7C	# <CJK>
0x5364	0x6109	# <CJK>
0x5365	0x6E1D	# <CJK>
0x5366	0x6E14	# <CJK>
0x5367	0x9685	# <CJK>
0x5368	0x4E88	# <CJK>
0x5369	0x5A31	# <CJK>
0x536A	0x96E8	# <CJK>
0x536B	0x4E0E	# <CJK>
0x536C	0x5C7F	# <CJK>
0x536D	0x79B9	# <CJK>
0x536E	0x5B87	# <CJK>
0x536F	0x8BED	# <CJK>
0x5370	0x7FBD	# <CJK>
0x5371	0x7389	# <CJK>
0x5372	0x57DF	# <CJK>
0x5373	0x828B	# <CJK>
0x5374	0x90C1	# <CJK>
0x5375	0x5401	# <CJK>
0x5376	0x9047	# <CJK>
0x5377	0x55BB	# <CJK>
0x5378	0x5CEA	# <CJK>
0x5379	0x5FA1	# <CJK>
0x537A	0x6108	# <CJK>
0x537B	0x6B32	# <CJK>
0x537C	0x72F1	# <CJK>
0x537D	0x80B2	# <CJK>
0x537E	0x8A89	# <CJK>
0x5421	0x6D74	# <CJK>
0x5422	0x5BD3	# <CJK>
0x5423	0x88D5	# <CJK>
0x5424	0x9884	# <CJK>
0x5425	0x8C6B	# <CJK>
0x5426	0x9A6D	# <CJK>
0x5427	0x9E33	# <CJK>
0x5428	0x6E0A	# <CJK>
0x5429	0x51A4	# <CJK>
0x542A	0x5143	# <CJK>
0x542B	0x57A3	# <CJK>
0x542C	0x8881	# <CJK>
0x542D	0x539F	# <CJK>
0x542E	0x63F4	# <CJK>
0x542F	0x8F95	# <CJK>
0x5430	0x56ED	# <CJK>
0x5431	0x5458	# <CJK>
0x5432	0x5706	# <CJK>
0x5433	0x733F	# <CJK>
0x5434	0x6E90	# <CJK>
0x5435	0x7F18	# <CJK>
0x5436	0x8FDC	# <CJK>
0x5437	0x82D1	# <CJK>
0x5438	0x613F	# <CJK>
0x5439	0x6028	# <CJK>
0x543A	0x9662	# <CJK>
0x543B	0x66F0	# <CJK>
0x543C	0x7EA6	# <CJK>
0x543D	0x8D8A	# <CJK>
0x543E	0x8DC3	# <CJK>
0x543F	0x94A5	# <CJK>
0x5440	0x5CB3	# <CJK>
0x5441	0x7CA4	# <CJK>
0x5442	0x6708	# <CJK>
0x5443	0x60A6	# <CJK>
0x5444	0x9605	# <CJK>
0x5445	0x8018	# <CJK>
0x5446	0x4E91	# <CJK>
0x5447	0x90E7	# <CJK>
0x5448	0x5300	# <CJK>
0x5449	0x9668	# <CJK>
0x544A	0x5141	# <CJK>
0x544B	0x8FD0	# <CJK>
0x544C	0x8574	# <CJK>
0x544D	0x915D	# <CJK>
0x544E	0x6655	# <CJK>
0x544F	0x97F5	# <CJK>
0x5450	0x5B55	# <CJK>
0x5451	0x531D	# <CJK>
0x5452	0x7838	# <CJK>
0x5453	0x6742	# <CJK>
0x5454	0x683D	# <CJK>
0x5455	0x54C9	# <CJK>
0x5456	0x707E	# <CJK>
0x5457	0x5BB0	# <CJK>
0x5458	0x8F7D	# <CJK>
0x5459	0x518D	# <CJK>
0x545A	0x5728	# <CJK>
0x545B	0x54B1	# <CJK>
0x545C	0x6512	# <CJK>
0x545D	0x6682	# <CJK>
0x545E	0x8D5E	# <CJK>
0x545F	0x8D43	# <CJK>
0x5460	0x810F	# <CJK>
0x5461	0x846C	# <CJK>
0x5462	0x906D	# <CJK>
0x5463	0x7CDF	# <CJK>
0x5464	0x51FF	# <CJK>
0x5465	0x85FB	# <CJK>
0x5466	0x67A3	# <CJK>
0x5467	0x65E9	# <CJK>
0x5468	0x6FA1	# <CJK>
0x5469	0x86A4	# <CJK>
0x546A	0x8E81	# <CJK>
0x546B	0x566A	# <CJK>
0x546C	0x9020	# <CJK>
0x546D	0x7682	# <CJK>
0x546E	0x7076	# <CJK>
0x546F	0x71E5	# <CJK>
0x5470	0x8D23	# <CJK>
0x5471	0x62E9	# <CJK>
0x5472	0x5219	# <CJK>
0x5473	0x6CFD	# <CJK>
0x5474	0x8D3C	# <CJK>
0x5475	0x600E	# <CJK>
0x5476	0x589E	# <CJK>
0x5477	0x618E	# <CJK>
0x5478	0x66FE	# <CJK>
0x5479	0x8D60	# <CJK>
0x547A	0x624E	# <CJK>
0x547B	0x55B3	# <CJK>
0x547C	0x6E23	# <CJK>
0x547D	0x672D	# <CJK>
0x547E	0x8F67	# <CJK>
0x5521	0x94E1	# <CJK>
0x5522	0x95F8	# <CJK>
0x5523	0x7728	# <CJK>
0x5524	0x6805	# <CJK>
0x5525	0x69A8	# <CJK>
0x5526	0x548B	# <CJK>
0x5527	0x4E4D	# <CJK>
0x5528	0x70B8	# <CJK>
0x5529	0x8BC8	# <CJK>
0x552A	0x6458	# <CJK>
0x552B	0x658B	# <CJK>
0x552C	0x5B85	# <CJK>
0x552D	0x7A84	# <CJK>
0x552E	0x503A	# <CJK>
0x552F	0x5BE8	# <CJK>
0x5530	0x77BB	# <CJK>
0x5531	0x6BE1	# <CJK>
0x5532	0x8A79	# <CJK>
0x5533	0x7C98	# <CJK>
0x5534	0x6CBE	# <CJK>
0x5535	0x76CF	# <CJK>
0x5536	0x65A9	# <CJK>
0x5537	0x8F97	# <CJK>
0x5538	0x5D2D	# <CJK>
0x5539	0x5C55	# <CJK>
0x553A	0x8638	# <CJK>
0x553B	0x6808	# <CJK>
0x553C	0x5360	# <CJK>
0x553D	0x6218	# <CJK>
0x553E	0x7AD9	# <CJK>
0x553F	0x6E5B	# <CJK>
0x5540	0x7EFD	# <CJK>
0x5541	0x6A1F	# <CJK>
0x5542	0x7AE0	# <CJK>
0x5543	0x5F70	# <CJK>
0x5544	0x6F33	# <CJK>
0x5545	0x5F20	# <CJK>
0x5546	0x638C	# <CJK>
0x5547	0x6DA8	# <CJK>
0x5548	0x6756	# <CJK>
0x5549	0x4E08	# <CJK>
0x554A	0x5E10	# <CJK>
0x554B	0x8D26	# <CJK>
0x554C	0x4ED7	# <CJK>
0x554D	0x80C0	# <CJK>
0x554E	0x7634	# <CJK>
0x554F	0x969C	# <CJK>
0x5550	0x62DB	# <CJK>
0x5551	0x662D	# <CJK>
0x5552	0x627E	# <CJK>
0x5553	0x6CBC	# <CJK>
0x5554	0x8D75	# <CJK>
0x5555	0x7167	# <CJK>
0x5556	0x7F69	# <CJK>
0x5557	0x5146	# <CJK>
0x5558	0x8087	# <CJK>
0x5559	0x53EC	# <CJK>
0x555A	0x906E	# <CJK>
0x555B	0x6298	# <CJK>
0x555C	0x54F2	# <CJK>
0x555D	0x86F0	# <CJK>
0x555E	0x8F99	# <CJK>
0x555F	0x8005	# <CJK>
0x5560	0x9517	# <CJK>
0x5561	0x8517	# <CJK>
0x5562	0x8FD9	# <CJK>
0x5563	0x6D59	# <CJK>
0x5564	0x73CD	# <CJK>
0x5565	0x659F	# <CJK>
0x5566	0x771F	# <CJK>
0x5567	0x7504	# <CJK>
0x5568	0x7827	# <CJK>
0x5569	0x81FB	# <CJK>
0x556A	0x8D1E	# <CJK>
0x556B	0x9488	# <CJK>
0x556C	0x4FA6	# <CJK>
0x556D	0x6795	# <CJK>
0x556E	0x75B9	# <CJK>
0x556F	0x8BCA	# <CJK>
0x5570	0x9707	# <CJK>
0x5571	0x632F	# <CJK>
0x5572	0x9547	# <CJK>
0x5573	0x9635	# <CJK>
0x5574	0x84B8	# <CJK>
0x5575	0x6323	# <CJK>
0x5576	0x7741	# <CJK>
0x5577	0x5F81	# <CJK>
0x5578	0x72F0	# <CJK>
0x5579	0x4E89	# <CJK>
0x557A	0x6014	# <CJK>
0x557B	0x6574	# <CJK>
0x557C	0x62EF	# <CJK>
0x557D	0x6B63	# <CJK>
0x557E	0x653F	# <CJK>
0x5621	0x5E27	# <CJK>
0x5622	0x75C7	# <CJK>
0x5623	0x90D1	# <CJK>
0x5624	0x8BC1	# <CJK>
0x5625	0x829D	# <CJK>
0x5626	0x679D	# <CJK>
0x5627	0x652F	# <CJK>
0x5628	0x5431	# <CJK>
0x5629	0x8718	# <CJK>
0x562A	0x77E5	# <CJK>
0x562B	0x80A2	# <CJK>
0x562C	0x8102	# <CJK>
0x562D	0x6C41	# <CJK>
0x562E	0x4E4B	# <CJK>
0x562F	0x7EC7	# <CJK>
0x5630	0x804C	# <CJK>
0x5631	0x76F4	# <CJK>
0x5632	0x690D	# <CJK>
0x5633	0x6B96	# <CJK>
0x5634	0x6267	# <CJK>
0x5635	0x503C	# <CJK>
0x5636	0x4F84	# <CJK>
0x5637	0x5740	# <CJK>
0x5638	0x6307	# <CJK>
0x5639	0x6B62	# <CJK>
0x563A	0x8DBE	# <CJK>
0x563B	0x53EA	# <CJK>
0x563C	0x65E8	# <CJK>
0x563D	0x7EB8	# <CJK>
0x563E	0x5FD7	# <CJK>
0x563F	0x631A	# <CJK>
0x5640	0x63B7	# <CJK>
0x5641	0x81F3	# <CJK>
0x5642	0x81F4	# <CJK>
0x5643	0x7F6E	# <CJK>
0x5644	0x5E1C	# <CJK>
0x5645	0x5CD9	# <CJK>
0x5646	0x5236	# <CJK>
0x5647	0x667A	# <CJK>
0x5648	0x79E9	# <CJK>
0x5649	0x7A1A	# <CJK>
0x564A	0x8D28	# <CJK>
0x564B	0x7099	# <CJK>
0x564C	0x75D4	# <CJK>
0x564D	0x6EDE	# <CJK>
0x564E	0x6CBB	# <CJK>
0x564F	0x7A92	# <CJK>
0x5650	0x4E2D	# <CJK>
0x5651	0x76C5	# <CJK>
0x5652	0x5FE0	# <CJK>
0x5653	0x949F	# <CJK>
0x5654	0x8877	# <CJK>
0x5655	0x7EC8	# <CJK>
0x5656	0x79CD	# <CJK>
0x5657	0x80BF	# <CJK>
0x5658	0x91CD	# <CJK>
0x5659	0x4EF2	# <CJK>
0x565A	0x4F17	# <CJK>
0x565B	0x821F	# <CJK>
0x565C	0x5468	# <CJK>
0x565D	0x5DDE	# <CJK>
0x565E	0x6D32	# <CJK>
0x565F	0x8BCC	# <CJK>
0x5660	0x7CA5	# <CJK>
0x5661	0x8F74	# <CJK>
0x5662	0x8098	# <CJK>
0x5663	0x5E1A	# <CJK>
0x5664	0x5492	# <CJK>
0x5665	0x76B1	# <CJK>
0x5666	0x5B99	# <CJK>
0x5667	0x663C	# <CJK>
0x5668	0x9AA4	# <CJK>
0x5669	0x73E0	# <CJK>
0x566A	0x682A	# <CJK>
0x566B	0x86DB	# <CJK>
0x566C	0x6731	# <CJK>
0x566D	0x732A	# <CJK>
0x566E	0x8BF8	# <CJK>
0x566F	0x8BDB	# <CJK>
0x5670	0x9010	# <CJK>
0x5671	0x7AF9	# <CJK>
0x5672	0x70DB	# <CJK>
0x5673	0x716E	# <CJK>
0x5674	0x62C4	# <CJK>
0x5675	0x77A9	# <CJK>
0x5676	0x5631	# <CJK>
0x5677	0x4E3B	# <CJK>
0x5678	0x8457	# <CJK>
0x5679	0x67F1	# <CJK>
0x567A	0x52A9	# <CJK>
0x567B	0x86C0	# <CJK>
0x567C	0x8D2E	# <CJK>
0x567D	0x94F8	# <CJK>
0x567E	0x7B51	# <CJK>
0x5721	0x4F4F	# <CJK>
0x5722	0x6CE8	# <CJK>
0x5723	0x795D	# <CJK>
0x5724	0x9A7B	# <CJK>
0x5725	0x6293	# <CJK>
0x5726	0x722A	# <CJK>
0x5727	0x62FD	# <CJK>
0x5728	0x4E13	# <CJK>
0x5729	0x7816	# <CJK>
0x572A	0x8F6C	# <CJK>
0x572B	0x64B0	# <CJK>
0x572C	0x8D5A	# <CJK>
0x572D	0x7BC6	# <CJK>
0x572E	0x6869	# <CJK>
0x572F	0x5E84	# <CJK>
0x5730	0x88C5	# <CJK>
0x5731	0x5986	# <CJK>
0x5732	0x649E	# <CJK>
0x5733	0x58EE	# <CJK>
0x5734	0x72B6	# <CJK>
0x5735	0x690E	# <CJK>
0x5736	0x9525	# <CJK>
0x5737	0x8FFD	# <CJK>
0x5738	0x8D58	# <CJK>
0x5739	0x5760	# <CJK>
0x573A	0x7F00	# <CJK>
0x573B	0x8C06	# <CJK>
0x573C	0x51C6	# <CJK>
0x573D	0x6349	# <CJK>
0x573E	0x62D9	# <CJK>
0x573F	0x5353	# <CJK>
0x5740	0x684C	# <CJK>
0x5741	0x7422	# <CJK>
0x5742	0x8301	# <CJK>
0x5743	0x914C	# <CJK>
0x5744	0x5544	# <CJK>
0x5745	0x7740	# <CJK>
0x5746	0x707C	# <CJK>
0x5747	0x6D4A	# <CJK>
0x5748	0x5179	# <CJK>
0x5749	0x54A8	# <CJK>
0x574A	0x8D44	# <CJK>
0x574B	0x59FF	# <CJK>
0x574C	0x6ECB	# <CJK>
0x574D	0x6DC4	# <CJK>
0x574E	0x5B5C	# <CJK>
0x574F	0x7D2B	# <CJK>
0x5750	0x4ED4	# <CJK>
0x5751	0x7C7D	# <CJK>
0x5752	0x6ED3	# <CJK>
0x5753	0x5B50	# <CJK>
0x5754	0x81EA	# <CJK>
0x5755	0x6E0D	# <CJK>
0x5756	0x5B57	# <CJK>
0x5757	0x9B03	# <CJK>
0x5758	0x68D5	# <CJK>
0x5759	0x8E2A	# <CJK>
0x575A	0x5B97	# <CJK>
0x575B	0x7EFC	# <CJK>
0x575C	0x603B	# <CJK>
0x575D	0x7EB5	# <CJK>
0x575E	0x90B9	# <CJK>
0x575F	0x8D70	# <CJK>
0x5760	0x594F	# <CJK>
0x5761	0x63CD	# <CJK>
0x5762	0x79DF	# <CJK>
0x5763	0x8DB3	# <CJK>
0x5764	0x5352	# <CJK>
0x5765	0x65CF	# <CJK>
0x5766	0x7956	# <CJK>
0x5767	0x8BC5	# <CJK>
0x5768	0x963B	# <CJK>
0x5769	0x7EC4	# <CJK>
0x576A	0x94BB	# <CJK>
0x576B	0x7E82	# <CJK>
0x576C	0x5634	# <CJK>
0x576D	0x9189	# <CJK>
0x576E	0x6700	# <CJK>
0x576F	0x7F6A	# <CJK>
0x5770	0x5C0A	# <CJK>
0x5771	0x9075	# <CJK>
0x5772	0x6628	# <CJK>
0x5773	0x5DE6	# <CJK>
0x5774	0x4F50	# <CJK>
0x5775	0x67DE	# <CJK>
0x5776	0x505A	# <CJK>
0x5777	0x4F5C	# <CJK>
0x5778	0x5750	# <CJK>
0x5779	0x5EA7	# <CJK>
0x5821	0x4E8D	# <CJK>
0x5822	0x4E0C	# <CJK>
0x5823	0x5140	# <CJK>
0x5824	0x4E10	# <CJK>
0x5825	0x5EFF	# <CJK>
0x5826	0x5345	# <CJK>
0x5827	0x4E15	# <CJK>
0x5828	0x4E98	# <CJK>
0x5829	0x4E1E	# <CJK>
0x582A	0x9B32	# <CJK>
0x582B	0x5B6C	# <CJK>
0x582C	0x5669	# <CJK>
0x582D	0x4E28	# <CJK>
0x582E	0x79BA	# <CJK>
0x582F	0x4E3F	# <CJK>
0x5830	0x5315	# <CJK>
0x5831	0x4E47	# <CJK>
0x5832	0x592D	# <CJK>
0x5833	0x723B	# <CJK>
0x5834	0x536E	# <CJK>
0x5835	0x6C10	# <CJK>
0x5836	0x56DF	# <CJK>
0x5837	0x80E4	# <CJK>
0x5838	0x9997	# <CJK>
0x5839	0x6BD3	# <CJK>
0x583A	0x777E	# <CJK>
0x583B	0x9F17	# <CJK>
0x583C	0x4E36	# <CJK>
0x583D	0x4E9F	# <CJK>
0x583E	0x9F10	# <CJK>
0x583F	0x4E5C	# <CJK>
0x5840	0x4E69	# <CJK>
0x5841	0x4E93	# <CJK>
0x5842	0x8288	# <CJK>
0x5843	0x5B5B	# <CJK>
0x5844	0x556C	# <CJK>
0x5845	0x560F	# <CJK>
0x5846	0x4EC4	# <CJK>
0x5847	0x538D	# <CJK>
0x5848	0x539D	# <CJK>
0x5849	0x53A3	# <CJK>
0x584A	0x53A5	# <CJK>
0x584B	0x53AE	# <CJK>
0x584C	0x9765	# <CJK>
0x584D	0x8D5D	# <CJK>
0x584E	0x531A	# <CJK>
0x584F	0x53F5	# <CJK>
0x5850	0x5326	# <CJK>
0x5851	0x532E	# <CJK>
0x5852	0x533E	# <CJK>
0x5853	0x8D5C	# <CJK>
0x5854	0x5366	# <CJK>
0x5855	0x5363	# <CJK>
0x5856	0x5202	# <CJK>
0x5857	0x5208	# <CJK>
0x5858	0x520E	# <CJK>
0x5859	0x522D	# <CJK>
0x585A	0x5233	# <CJK>
0x585B	0x523F	# <CJK>
0x585C	0x5240	# <CJK>
0x585D	0x524C	# <CJK>
0x585E	0x525E	# <CJK>
0x585F	0x5261	# <CJK>
0x5860	0x525C	# <CJK>
0x5861	0x84AF	# <CJK>
0x5862	0x527D	# <CJK>
0x5863	0x5282	# <CJK>
0x5864	0x5281	# <CJK>
0x5865	0x5290	# <CJK>
0x5866	0x5293	# <CJK>
0x5867	0x5182	# <CJK>
0x5868	0x7F54	# <CJK>
0x5869	0x4EBB	# <CJK>
0x586A	0x4EC3	# <CJK>
0x586B	0x4EC9	# <CJK>
0x586C	0x4EC2	# <CJK>
0x586D	0x4EE8	# <CJK>
0x586E	0x4EE1	# <CJK>
0x586F	0x4EEB	# <CJK>
0x5870	0x4EDE	# <CJK>
0x5871	0x4F1B	# <CJK>
0x5872	0x4EF3	# <CJK>
0x5873	0x4F22	# <CJK>
0x5874	0x4F64	# <CJK>
0x5875	0x4EF5	# <CJK>
0x5876	0x4F25	# <CJK>
0x5877	0x4F27	# <CJK>
0x5878	0x4F09	# <CJK>
0x5879	0x4F2B	# <CJK>
0x587A	0x4F5E	# <CJK>
0x587B	0x4F67	# <CJK>
0x587C	0x6538	# <CJK>
0x587D	0x4F5A	# <CJK>
0x587E	0x4F5D	# <CJK>
0x5921	0x4F5F	# <CJK>
0x5922	0x4F57	# <CJK>
0x5923	0x4F32	# <CJK>
0x5924	0x4F3D	# <CJK>
0x5925	0x4F76	# <CJK>
0x5926	0x4F74	# <CJK>
0x5927	0x4F91	# <CJK>
0x5928	0x4F89	# <CJK>
0x5929	0x4F83	# <CJK>
0x592A	0x4F8F	# <CJK>
0x592B	0x4F7E	# <CJK>
0x592C	0x4F7B	# <CJK>
0x592D	0x4FAA	# <CJK>
0x592E	0x4F7C	# <CJK>
0x592F	0x4FAC	# <CJK>
0x5930	0x4F94	# <CJK>
0x5931	0x4FE6	# <CJK>
0x5932	0x4FE8	# <CJK>
0x5933	0x4FEA	# <CJK>
0x5934	0x4FC5	# <CJK>
0x5935	0x4FDA	# <CJK>
0x5936	0x4FE3	# <CJK>
0x5937	0x4FDC	# <CJK>
0x5938	0x4FD1	# <CJK>
0x5939	0x4FDF	# <CJK>
0x593A	0x4FF8	# <CJK>
0x593B	0x5029	# <CJK>
0x593C	0x504C	# <CJK>
0x593D	0x4FF3	# <CJK>
0x593E	0x502C	# <CJK>
0x593F	0x500F	# <CJK>
0x5940	0x502E	# <CJK>
0x5941	0x502D	# <CJK>
0x5942	0x4FFE	# <CJK>
0x5943	0x501C	# <CJK>
0x5944	0x500C	# <CJK>
0x5945	0x5025	# <CJK>
0x5946	0x5028	# <CJK>
0x5947	0x507E	# <CJK>
0x5948	0x5043	# <CJK>
0x5949	0x5055	# <CJK>
0x594A	0x5048	# <CJK>
0x594B	0x504E	# <CJK>
0x594C	0x506C	# <CJK>
0x594D	0x507B	# <CJK>
0x594E	0x50A5	# <CJK>
0x594F	0x50A7	# <CJK>
0x5950	0x50A9	# <CJK>
0x5951	0x50BA	# <CJK>
0x5952	0x50D6	# <CJK>
0x5953	0x5106	# <CJK>
0x5954	0x50ED	# <CJK>
0x5955	0x50EC	# <CJK>
0x5956	0x50E6	# <CJK>
0x5957	0x50EE	# <CJK>
0x5958	0x5107	# <CJK>
0x5959	0x510B	# <CJK>
0x595A	0x4EDD	# <CJK>
0x595B	0x6C3D	# <CJK>
0x595C	0x4F58	# <CJK>
0x595D	0x4F65	# <CJK>
0x595E	0x4FCE	# <CJK>
0x595F	0x9FA0	# <CJK>
0x5960	0x6C46	# <CJK>
0x5961	0x7C74	# <CJK>
0x5962	0x516E	# <CJK>
0x5963	0x5DFD	# <CJK>
0x5964	0x9EC9	# <CJK>
0x5965	0x9998	# <CJK>
0x5966	0x5181	# <CJK>
0x5967	0x5914	# <CJK>
0x5968	0x52F9	# <CJK>
0x5969	0x530D	# <CJK>
0x596A	0x8A07	# <CJK>
0x596B	0x5310	# <CJK>
0x596C	0x51EB	# <CJK>
0x596D	0x5919	# <CJK>
0x596E	0x5155	# <CJK>
0x596F	0x4EA0	# <CJK>
0x5970	0x5156	# <CJK>
0x5971	0x4EB3	# <CJK>
0x5972	0x886E	# <CJK>
0x5973	0x88A4	# <CJK>
0x5974	0x4EB5	# <CJK>
0x5975	0x8114	# <CJK>
0x5976	0x88D2	# <CJK>
0x5977	0x7980	# <CJK>
0x5978	0x5B34	# <CJK>
0x5979	0x8803	# <CJK>
0x597A	0x7FB8	# <CJK>
0x597B	0x51AB	# <CJK>
0x597C	0x51B1	# <CJK>
0x597D	0x51BD	# <CJK>
0x597E	0x51BC	# <CJK>
0x5A21	0x51C7	# <CJK>
0x5A22	0x5196	# <CJK>
0x5A23	0x51A2	# <CJK>
0x5A24	0x51A5	# <CJK>
0x5A25	0x8BA0	# <CJK>
0x5A26	0x8BA6	# <CJK>
0x5A27	0x8BA7	# <CJK>
0x5A28	0x8BAA	# <CJK>
0x5A29	0x8BB4	# <CJK>
0x5A2A	0x8BB5	# <CJK>
0x5A2B	0x8BB7	# <CJK>
0x5A2C	0x8BC2	# <CJK>
0x5A2D	0x8BC3	# <CJK>
0x5A2E	0x8BCB	# <CJK>
0x5A2F	0x8BCF	# <CJK>
0x5A30	0x8BCE	# <CJK>
0x5A31	0x8BD2	# <CJK>
0x5A32	0x8BD3	# <CJK>
0x5A33	0x8BD4	# <CJK>
0x5A34	0x8BD6	# <CJK>
0x5A35	0x8BD8	# <CJK>
0x5A36	0x8BD9	# <CJK>
0x5A37	0x8BDC	# <CJK>
0x5A38	0x8BDF	# <CJK>
0x5A39	0x8BE0	# <CJK>
0x5A3A	0x8BE4	# <CJK>
0x5A3B	0x8BE8	# <CJK>
0x5A3C	0x8BE9	# <CJK>
0x5A3D	0x8BEE	# <CJK>
0x5A3E	0x8BF0	# <CJK>
0x5A3F	0x8BF3	# <CJK>
0x5A40	0x8BF6	# <CJK>
0x5A41	0x8BF9	# <CJK>
0x5A42	0x8BFC	# <CJK>
0x5A43	0x8BFF	# <CJK>
0x5A44	0x8C00	# <CJK>
0x5A45	0x8C02	# <CJK>
0x5A46	0x8C04	# <CJK>
0x5A47	0x8C07	# <CJK>
0x5A48	0x8C0C	# <CJK>
0x5A49	0x8C0F	# <CJK>
0x5A4A	0x8C11	# <CJK>
0x5A4B	0x8C12	# <CJK>
0x5A4C	0x8C14	# <CJK>
0x5A4D	0x8C15	# <CJK>
0x5A4E	0x8C16	# <CJK>
0x5A4F	0x8C19	# <CJK>
0x5A50	0x8C1B	# <CJK>
0x5A51	0x8C18	# <CJK>
0x5A52	0x8C1D	# <CJK>
0x5A53	0x8C1F	# <CJK>
0x5A54	0x8C20	# <CJK>
0x5A55	0x8C21	# <CJK>
0x5A56	0x8C25	# <CJK>
0x5A57	0x8C27	# <CJK>
0x5A58	0x8C2A	# <CJK>
0x5A59	0x8C2B	# <CJK>
0x5A5A	0x8C2E	# <CJK>
0x5A5B	0x8C2F	# <CJK>
0x5A5C	0x8C32	# <CJK>
0x5A5D	0x8C33	# <CJK>
0x5A5E	0x8C35	# <CJK>
0x5A5F	0x8C36	# <CJK>
0x5A60	0x5369	# <CJK>
0x5A61	0x537A	# <CJK>
0x5A62	0x961D	# <CJK>
0x5A63	0x9622	# <CJK>
0x5A64	0x9621	# <CJK>
0x5A65	0x9631	# <CJK>
0x5A66	0x962A	# <CJK>
0x5A67	0x963D	# <CJK>
0x5A68	0x963C	# <CJK>
0x5A69	0x9642	# <CJK>
0x5A6A	0x9649	# <CJK>
0x5A6B	0x9654	# <CJK>
0x5A6C	0x965F	# <CJK>
0x5A6D	0x9667	# <CJK>
0x5A6E	0x966C	# <CJK>
0x5A6F	0x9672	# <CJK>
0x5A70	0x9674	# <CJK>
0x5A71	0x9688	# <CJK>
0x5A72	0x968D	# <CJK>
0x5A73	0x9697	# <CJK>
0x5A74	0x96B0	# <CJK>
0x5A75	0x9097	# <CJK>
0x5A76	0x909B	# <CJK>
0x5A77	0x909D	# <CJK>
0x5A78	0x9099	# <CJK>
0x5A79	0x90AC	# <CJK>
0x5A7A	0x90A1	# <CJK>
0x5A7B	0x90B4	# <CJK>
0x5A7C	0x90B3	# <CJK>
0x5A7D	0x90B6	# <CJK>
0x5A7E	0x90BA	# <CJK>
0x5B21	0x90B8	# <CJK>
0x5B22	0x90B0	# <CJK>
0x5B23	0x90CF	# <CJK>
0x5B24	0x90C5	# <CJK>
0x5B25	0x90BE	# <CJK>
0x5B26	0x90D0	# <CJK>
0x5B27	0x90C4	# <CJK>
0x5B28	0x90C7	# <CJK>
0x5B29	0x90D3	# <CJK>
0x5B2A	0x90E6	# <CJK>
0x5B2B	0x90E2	# <CJK>
0x5B2C	0x90DC	# <CJK>
0x5B2D	0x90D7	# <CJK>
0x5B2E	0x90DB	# <CJK>
0x5B2F	0x90EB	# <CJK>
0x5B30	0x90EF	# <CJK>
0x5B31	0x90FE	# <CJK>
0x5B32	0x9104	# <CJK>
0x5B33	0x9122	# <CJK>
0x5B34	0x911E	# <CJK>
0x5B35	0x9123	# <CJK>
0x5B36	0x9131	# <CJK>
0x5B37	0x912F	# <CJK>
0x5B38	0x9139	# <CJK>
0x5B39	0x9143	# <CJK>
0x5B3A	0x9146	# <CJK>
0x5B3B	0x520D	# <CJK>
0x5B3C	0x5942	# <CJK>
0x5B3D	0x52A2	# <CJK>
0x5B3E	0x52AC	# <CJK>
0x5B3F	0x52AD	# <CJK>
0x5B40	0x52BE	# <CJK>
0x5B41	0x54FF	# <CJK>
0x5B42	0x52D0	# <CJK>
0x5B43	0x52D6	# <CJK>
0x5B44	0x52F0	# <CJK>
0x5B45	0x53DF	# <CJK>
0x5B46	0x71EE	# <CJK>
0x5B47	0x77CD	# <CJK>
0x5B48	0x5EF4	# <CJK>
0x5B49	0x51F5	# <CJK>
0x5B4A	0x51FC	# <CJK>
0x5B4B	0x9B2F	# <CJK>
0x5B4C	0x53B6	# <CJK>
0x5B4D	0x5F01	# <CJK>
0x5B4E	0x755A	# <CJK>
0x5B4F	0x5DEF	# <CJK>
0x5B50	0x574C	# <CJK>
0x5B51	0x57A9	# <CJK>
0x5B52	0x57A1	# <CJK>
0x5B53	0x587E	# <CJK>
0x5B54	0x58BC	# <CJK>
0x5B55	0x58C5	# <CJK>
0x5B56	0x58D1	# <CJK>
0x5B57	0x5729	# <CJK>
0x5B58	0x572C	# <CJK>
0x5B59	0x572A	# <CJK>
0x5B5A	0x5733	# <CJK>
0x5B5B	0x5739	# <CJK>
0x5B5C	0x572E	# <CJK>
0x5B5D	0x572F	# <CJK>
0x5B5E	0x575C	# <CJK>
0x5B5F	0x573B	# <CJK>
0x5B60	0x5742	# <CJK>
0x5B61	0x5769	# <CJK>
0x5B62	0x5785	# <CJK>
0x5B63	0x576B	# <CJK>
0x5B64	0x5786	# <CJK>
0x5B65	0x577C	# <CJK>
0x5B66	0x577B	# <CJK>
0x5B67	0x5768	# <CJK>
0x5B68	0x576D	# <CJK>
0x5B69	0x5776	# <CJK>
0x5B6A	0x5773	# <CJK>
0x5B6B	0x57AD	# <CJK>
0x5B6C	0x57A4	# <CJK>
0x5B6D	0x578C	# <CJK>
0x5B6E	0x57B2	# <CJK>
0x5B6F	0x57CF	# <CJK>
0x5B70	0x57A7	# <CJK>
0x5B71	0x57B4	# <CJK>
0x5B72	0x5793	# <CJK>
0x5B73	0x57A0	# <CJK>
0x5B74	0x57D5	# <CJK>
0x5B75	0x57D8	# <CJK>
0x5B76	0x57DA	# <CJK>
0x5B77	0x57D9	# <CJK>
0x5B78	0x57D2	# <CJK>
0x5B79	0x57B8	# <CJK>
0x5B7A	0x57F4	# <CJK>
0x5B7B	0x57EF	# <CJK>
0x5B7C	0x57F8	# <CJK>
0x5B7D	0x57E4	# <CJK>
0x5B7E	0x57DD	# <CJK>
0x5C21	0x580B	# <CJK>
0x5C22	0x580D	# <CJK>
0x5C23	0x57FD	# <CJK>
0x5C24	0x57ED	# <CJK>
0x5C25	0x5800	# <CJK>
0x5C26	0x581E	# <CJK>
0x5C27	0x5819	# <CJK>
0x5C28	0x5844	# <CJK>
0x5C29	0x5820	# <CJK>
0x5C2A	0x5865	# <CJK>
0x5C2B	0x586C	# <CJK>
0x5C2C	0x5881	# <CJK>
0x5C2D	0x5889	# <CJK>
0x5C2E	0x589A	# <CJK>
0x5C2F	0x5880	# <CJK>
0x5C30	0x99A8	# <CJK>
0x5C31	0x9F19	# <CJK>
0x5C32	0x61FF	# <CJK>
0x5C33	0x8279	# <CJK>
0x5C34	0x827D	# <CJK>
0x5C35	0x827F	# <CJK>
0x5C36	0x828F	# <CJK>
0x5C37	0x828A	# <CJK>
0x5C38	0x82A8	# <CJK>
0x5C39	0x8284	# <CJK>
0x5C3A	0x828E	# <CJK>
0x5C3B	0x8291	# <CJK>
0x5C3C	0x8297	# <CJK>
0x5C3D	0x8299	# <CJK>
0x5C3E	0x82AB	# <CJK>
0x5C3F	0x82B8	# <CJK>
0x5C40	0x82BE	# <CJK>
0x5C41	0x82B0	# <CJK>
0x5C42	0x82C8	# <CJK>
0x5C43	0x82CA	# <CJK>
0x5C44	0x82E3	# <CJK>
0x5C45	0x8298	# <CJK>
0x5C46	0x82B7	# <CJK>
0x5C47	0x82AE	# <CJK>
0x5C48	0x82CB	# <CJK>
0x5C49	0x82CC	# <CJK>
0x5C4A	0x82C1	# <CJK>
0x5C4B	0x82A9	# <CJK>
0x5C4C	0x82B4	# <CJK>
0x5C4D	0x82A1	# <CJK>
0x5C4E	0x82AA	# <CJK>
0x5C4F	0x829F	# <CJK>
0x5C50	0x82C4	# <CJK>
0x5C51	0x82CE	# <CJK>
0x5C52	0x82A4	# <CJK>
0x5C53	0x82E1	# <CJK>
0x5C54	0x8309	# <CJK>
0x5C55	0x82F7	# <CJK>
0x5C56	0x82E4	# <CJK>
0x5C57	0x830F	# <CJK>
0x5C58	0x8307	# <CJK>
0x5C59	0x82DC	# <CJK>
0x5C5A	0x82F4	# <CJK>
0x5C5B	0x82D2	# <CJK>
0x5C5C	0x82D8	# <CJK>
0x5C5D	0x830C	# <CJK>
0x5C5E	0x82FB	# <CJK>
0x5C5F	0x82D3	# <CJK>
0x5C60	0x8311	# <CJK>
0x5C61	0x831A	# <CJK>
0x5C62	0x8306	# <CJK>
0x5C63	0x8314	# <CJK>
0x5C64	0x8315	# <CJK>
0x5C65	0x82E0	# <CJK>
0x5C66	0x82D5	# <CJK>
0x5C67	0x831C	# <CJK>
0x5C68	0x8351	# <CJK>
0x5C69	0x835B	# <CJK>
0x5C6A	0x835C	# <CJK>
0x5C6B	0x8308	# <CJK>
0x5C6C	0x8392	# <CJK>
0x5C6D	0x833C	# <CJK>
0x5C6E	0x8334	# <CJK>
0x5C6F	0x8331	# <CJK>
0x5C70	0x839B	# <CJK>
0x5C71	0x835E	# <CJK>
0x5C72	0x832F	# <CJK>
0x5C73	0x834F	# <CJK>
0x5C74	0x8347	# <CJK>
0x5C75	0x8343	# <CJK>
0x5C76	0x835F	# <CJK>
0x5C77	0x8340	# <CJK>
0x5C78	0x8317	# <CJK>
0x5C79	0x8360	# <CJK>
0x5C7A	0x832D	# <CJK>
0x5C7B	0x833A	# <CJK>
0x5C7C	0x8333	# <CJK>
0x5C7D	0x8366	# <CJK>
0x5C7E	0x8365	# <CJK>
0x5D21	0x8368	# <CJK>
0x5D22	0x831B	# <CJK>
0x5D23	0x8369	# <CJK>
0x5D24	0x836C	# <CJK>
0x5D25	0x836A	# <CJK>
0x5D26	0x836D	# <CJK>
0x5D27	0x836E	# <CJK>
0x5D28	0x83B0	# <CJK>
0x5D29	0x8378	# <CJK>
0x5D2A	0x83B3	# <CJK>
0x5D2B	0x83B4	# <CJK>
0x5D2C	0x83A0	# <CJK>
0x5D2D	0x83AA	# <CJK>
0x5D2E	0x8393	# <CJK>
0x5D2F	0x839C	# <CJK>
0x5D30	0x8385	# <CJK>
0x5D31	0x837C	# <CJK>
0x5D32	0x83B6	# <CJK>
0x5D33	0x83A9	# <CJK>
0x5D34	0x837D	# <CJK>
0x5D35	0x83B8	# <CJK>
0x5D36	0x837B	# <CJK>
0x5D37	0x8398	# <CJK>
0x5D38	0x839E	# <CJK>
0x5D39	0x83A8	# <CJK>
0x5D3A	0x83BA	# <CJK>
0x5D3B	0x83BC	# <CJK>
0x5D3C	0x83C1	# <CJK>
0x5D3D	0x8401	# <CJK>
0x5D3E	0x83E5	# <CJK>
0x5D3F	0x83D8	# <CJK>
0x5D40	0x5807	# <CJK>
0x5D41	0x8418	# <CJK>
0x5D42	0x840B	# <CJK>
0x5D43	0x83DD	# <CJK>
0x5D44	0x83FD	# <CJK>
0x5D45	0x83D6	# <CJK>
0x5D46	0x841C	# <CJK>
0x5D47	0x8438	# <CJK>
0x5D48	0x8411	# <CJK>
0x5D49	0x8406	# <CJK>
0x5D4A	0x83D4	# <CJK>
0x5D4B	0x83DF	# <CJK>
0x5D4C	0x840F	# <CJK>
0x5D4D	0x8403	# <CJK>
0x5D4E	0x83F8	# <CJK>
0x5D4F	0x83F9	# <CJK>
0x5D50	0x83EA	# <CJK>
0x5D51	0x83C5	# <CJK>
0x5D52	0x83C0	# <CJK>
0x5D53	0x8426	# <CJK>
0x5D54	0x83F0	# <CJK>
0x5D55	0x83E1	# <CJK>
0x5D56	0x845C	# <CJK>
0x5D57	0x8451	# <CJK>
0x5D58	0x845A	# <CJK>
0x5D59	0x8459	# <CJK>
0x5D5A	0x8473	# <CJK>
0x5D5B	0x8487	# <CJK>
0x5D5C	0x8488	# <CJK>
0x5D5D	0x847A	# <CJK>
0x5D5E	0x8489	# <CJK>
0x5D5F	0x8478	# <CJK>
0x5D60	0x843C	# <CJK>
0x5D61	0x8446	# <CJK>
0x5D62	0x8469	# <CJK>
0x5D63	0x8476	# <CJK>
0x5D64	0x848C	# <CJK>
0x5D65	0x848E	# <CJK>
0x5D66	0x8431	# <CJK>
0x5D67	0x846D	# <CJK>
0x5D68	0x84C1	# <CJK>
0x5D69	0x84CD	# <CJK>
0x5D6A	0x84D0	# <CJK>
0x5D6B	0x84E6	# <CJK>
0x5D6C	0x84BD	# <CJK>
0x5D6D	0x84D3	# <CJK>
0x5D6E	0x84CA	# <CJK>
0x5D6F	0x84BF	# <CJK>
0x5D70	0x84BA	# <CJK>
0x5D71	0x84E0	# <CJK>
0x5D72	0x84A1	# <CJK>
0x5D73	0x84B9	# <CJK>
0x5D74	0x84B4	# <CJK>
0x5D75	0x8497	# <CJK>
0x5D76	0x84E5	# <CJK>
0x5D77	0x84E3	# <CJK>
0x5D78	0x850C	# <CJK>
0x5D79	0x750D	# <CJK>
0x5D7A	0x8538	# <CJK>
0x5D7B	0x84F0	# <CJK>
0x5D7C	0x8539	# <CJK>
0x5D7D	0x851F	# <CJK>
0x5D7E	0x853A	# <CJK>
0x5E21	0x8556	# <CJK>
0x5E22	0x853B	# <CJK>
0x5E23	0x84FF	# <CJK>
0x5E24	0x84FC	# <CJK>
0x5E25	0x8559	# <CJK>
0x5E26	0x8548	# <CJK>
0x5E27	0x8568	# <CJK>
0x5E28	0x8564	# <CJK>
0x5E29	0x855E	# <CJK>
0x5E2A	0x857A	# <CJK>
0x5E2B	0x77A2	# <CJK>
0x5E2C	0x8543	# <CJK>
0x5E2D	0x8572	# <CJK>
0x5E2E	0x857B	# <CJK>
0x5E2F	0x85A4	# <CJK>
0x5E30	0x85A8	# <CJK>
0x5E31	0x8587	# <CJK>
0x5E32	0x858F	# <CJK>
0x5E33	0x8579	# <CJK>
0x5E34	0x85AE	# <CJK>
0x5E35	0x859C	# <CJK>
0x5E36	0x8585	# <CJK>
0x5E37	0x85B9	# <CJK>
0x5E38	0x85B7	# <CJK>
0x5E39	0x85B0	# <CJK>
0x5E3A	0x85D3	# <CJK>
0x5E3B	0x85C1	# <CJK>
0x5E3C	0x85DC	# <CJK>
0x5E3D	0x85FF	# <CJK>
0x5E3E	0x8627	# <CJK>
0x5E3F	0x8605	# <CJK>
0x5E40	0x8629	# <CJK>
0x5E41	0x8616	# <CJK>
0x5E42	0x863C	# <CJK>
0x5E43	0x5EFE	# <CJK>
0x5E44	0x5F08	# <CJK>
0x5E45	0x593C	# <CJK>
0x5E46	0x5941	# <CJK>
0x5E47	0x8037	# <CJK>
0x5E48	0x5955	# <CJK>
0x5E49	0x595A	# <CJK>
0x5E4A	0x5958	# <CJK>
0x5E4B	0x530F	# <CJK>
0x5E4C	0x5C22	# <CJK>
0x5E4D	0x5C25	# <CJK>
0x5E4E	0x5C2C	# <CJK>
0x5E4F	0x5C34	# <CJK>
0x5E50	0x624C	# <CJK>
0x5E51	0x626A	# <CJK>
0x5E52	0x629F	# <CJK>
0x5E53	0x62BB	# <CJK>
0x5E54	0x62CA	# <CJK>
0x5E55	0x62DA	# <CJK>
0x5E56	0x62D7	# <CJK>
0x5E57	0x62EE	# <CJK>
0x5E58	0x6322	# <CJK>
0x5E59	0x62F6	# <CJK>
0x5E5A	0x6339	# <CJK>
0x5E5B	0x634B	# <CJK>
0x5E5C	0x6343	# <CJK>
0x5E5D	0x63AD	# <CJK>
0x5E5E	0x63F6	# <CJK>
0x5E5F	0x6371	# <CJK>
0x5E60	0x637A	# <CJK>
0x5E61	0x638E	# <CJK>
0x5E62	0x63B4	# <CJK>
0x5E63	0x636D	# <CJK>
0x5E64	0x63AC	# <CJK>
0x5E65	0x638A	# <CJK>
0x5E66	0x6369	# <CJK>
0x5E67	0x63AE	# <CJK>
0x5E68	0x63BC	# <CJK>
0x5E69	0x63F2	# <CJK>
0x5E6A	0x63F8	# <CJK>
0x5E6B	0x63E0	# <CJK>
0x5E6C	0x63FF	# <CJK>
0x5E6D	0x63C4	# <CJK>
0x5E6E	0x63DE	# <CJK>
0x5E6F	0x63CE	# <CJK>
0x5E70	0x6452	# <CJK>
0x5E71	0x63C6	# <CJK>
0x5E72	0x63BE	# <CJK>
0x5E73	0x6445	# <CJK>
0x5E74	0x6441	# <CJK>
0x5E75	0x640B	# <CJK>
0x5E76	0x641B	# <CJK>
0x5E77	0x6420	# <CJK>
0x5E78	0x640C	# <CJK>
0x5E79	0x6426	# <CJK>
0x5E7A	0x6421	# <CJK>
0x5E7B	0x645E	# <CJK>
0x5E7C	0x6484	# <CJK>
0x5E7D	0x646D	# <CJK>
0x5E7E	0x6496	# <CJK>
0x5F21	0x647A	# <CJK>
0x5F22	0x64B7	# <CJK>
0x5F23	0x64B8	# <CJK>
0x5F24	0x6499	# <CJK>
0x5F25	0x64BA	# <CJK>
0x5F26	0x64C0	# <CJK>
0x5F27	0x64D0	# <CJK>
0x5F28	0x64D7	# <CJK>
0x5F29	0x64E4	# <CJK>
0x5F2A	0x64E2	# <CJK>
0x5F2B	0x6509	# <CJK>
0x5F2C	0x6525	# <CJK>
0x5F2D	0x652E	# <CJK>
0x5F2E	0x5F0B	# <CJK>
0x5F2F	0x5FD2	# <CJK>
0x5F30	0x7519	# <CJK>
0x5F31	0x5F11	# <CJK>
0x5F32	0x535F	# <CJK>
0x5F33	0x53F1	# <CJK>
0x5F34	0x53FD	# <CJK>
0x5F35	0x53E9	# <CJK>
0x5F36	0x53E8	# <CJK>
0x5F37	0x53FB	# <CJK>
0x5F38	0x5412	# <CJK>
0x5F39	0x5416	# <CJK>
0x5F3A	0x5406	# <CJK>
0x5F3B	0x544B	# <CJK>
0x5F3C	0x5452	# <CJK>
0x5F3D	0x5453	# <CJK>
0x5F3E	0x5454	# <CJK>
0x5F3F	0x5456	# <CJK>
0x5F40	0x5443	# <CJK>
0x5F41	0x5421	# <CJK>
0x5F42	0x5457	# <CJK>
0x5F43	0x5459	# <CJK>
0x5F44	0x5423	# <CJK>
0x5F45	0x5432	# <CJK>
0x5F46	0x5482	# <CJK>
0x5F47	0x5494	# <CJK>
0x5F48	0x5477	# <CJK>
0x5F49	0x5471	# <CJK>
0x5F4A	0x5464	# <CJK>
0x5F4B	0x549A	# <CJK>
0x5F4C	0x549B	# <CJK>
0x5F4D	0x5484	# <CJK>
0x5F4E	0x5476	# <CJK>
0x5F4F	0x5466	# <CJK>
0x5F50	0x549D	# <CJK>
0x5F51	0x54D0	# <CJK>
0x5F52	0x54AD	# <CJK>
0x5F53	0x54C2	# <CJK>
0x5F54	0x54B4	# <CJK>
0x5F55	0x54D2	# <CJK>
0x5F56	0x54A7	# <CJK>
0x5F57	0x54A6	# <CJK>
0x5F58	0x54D3	# <CJK>
0x5F59	0x54D4	# <CJK>
0x5F5A	0x5472	# <CJK>
0x5F5B	0x54A3	# <CJK>
0x5F5C	0x54D5	# <CJK>
0x5F5D	0x54BB	# <CJK>
0x5F5E	0x54BF	# <CJK>
0x5F5F	0x54CC	# <CJK>
0x5F60	0x54D9	# <CJK>
0x5F61	0x54DA	# <CJK>
0x5F62	0x54DC	# <CJK>
0x5F63	0x54A9	# <CJK>
0x5F64	0x54AA	# <CJK>
0x5F65	0x54A4	# <CJK>
0x5F66	0x54DD	# <CJK>
0x5F67	0x54CF	# <CJK>
0x5F68	0x54DE	# <CJK>
0x5F69	0x551B	# <CJK>
0x5F6A	0x54E7	# <CJK>
0x5F6B	0x5520	# <CJK>
0x5F6C	0x54FD	# <CJK>
0x5F6D	0x5514	# <CJK>
0x5F6E	0x54F3	# <CJK>
0x5F6F	0x5522	# <CJK>
0x5F70	0x5523	# <CJK>
0x5F71	0x550F	# <CJK>
0x5F72	0x5511	# <CJK>
0x5F73	0x5527	# <CJK>
0x5F74	0x552A	# <CJK>
0x5F75	0x5567	# <CJK>
0x5F76	0x558F	# <CJK>
0x5F77	0x55B5	# <CJK>
0x5F78	0x5549	# <CJK>
0x5F79	0x556D	# <CJK>
0x5F7A	0x5541	# <CJK>
0x5F7B	0x5555	# <CJK>
0x5F7C	0x553F	# <CJK>
0x5F7D	0x5550	# <CJK>
0x5F7E	0x553C	# <CJK>
0x6021	0x5537	# <CJK>
0x6022	0x5556	# <CJK>
0x6023	0x5575	# <CJK>
0x6024	0x5576	# <CJK>
0x6025	0x5577	# <CJK>
0x6026	0x5533	# <CJK>
0x6027	0x5530	# <CJK>
0x6028	0x555C	# <CJK>
0x6029	0x558B	# <CJK>
0x602A	0x55D2	# <CJK>
0x602B	0x5583	# <CJK>
0x602C	0x55B1	# <CJK>
0x602D	0x55B9	# <CJK>
0x602E	0x5588	# <CJK>
0x602F	0x5581	# <CJK>
0x6030	0x559F	# <CJK>
0x6031	0x557E	# <CJK>
0x6032	0x55D6	# <CJK>
0x6033	0x5591	# <CJK>
0x6034	0x557B	# <CJK>
0x6035	0x55DF	# <CJK>
0x6036	0x55BD	# <CJK>
0x6037	0x55BE	# <CJK>
0x6038	0x5594	# <CJK>
0x6039	0x5599	# <CJK>
0x603A	0x55EA	# <CJK>
0x603B	0x55F7	# <CJK>
0x603C	0x55C9	# <CJK>
0x603D	0x561F	# <CJK>
0x603E	0x55D1	# <CJK>
0x603F	0x55EB	# <CJK>
0x6040	0x55EC	# <CJK>
0x6041	0x55D4	# <CJK>
0x6042	0x55E6	# <CJK>
0x6043	0x55DD	# <CJK>
0x6044	0x55C4	# <CJK>
0x6045	0x55EF	# <CJK>
0x6046	0x55E5	# <CJK>
0x6047	0x55F2	# <CJK>
0x6048	0x55F3	# <CJK>
0x6049	0x55CC	# <CJK>
0x604A	0x55CD	# <CJK>
0x604B	0x55E8	# <CJK>
0x604C	0x55F5	# <CJK>
0x604D	0x55E4	# <CJK>
0x604E	0x8F94	# <CJK>
0x604F	0x561E	# <CJK>
0x6050	0x5608	# <CJK>
0x6051	0x560C	# <CJK>
0x6052	0x5601	# <CJK>
0x6053	0x5624	# <CJK>
0x6054	0x5623	# <CJK>
0x6055	0x55FE	# <CJK>
0x6056	0x5600	# <CJK>
0x6057	0x5627	# <CJK>
0x6058	0x562D	# <CJK>
0x6059	0x5658	# <CJK>
0x605A	0x5639	# <CJK>
0x605B	0x5657	# <CJK>
0x605C	0x562C	# <CJK>
0x605D	0x564D	# <CJK>
0x605E	0x5662	# <CJK>
0x605F	0x5659	# <CJK>
0x6060	0x565C	# <CJK>
0x6061	0x564C	# <CJK>
0x6062	0x5654	# <CJK>
0x6063	0x5686	# <CJK>
0x6064	0x5664	# <CJK>
0x6065	0x5671	# <CJK>
0x6066	0x566B	# <CJK>
0x6067	0x567B	# <CJK>
0x6068	0x567C	# <CJK>
0x6069	0x5685	# <CJK>
0x606A	0x5693	# <CJK>
0x606B	0x56AF	# <CJK>
0x606C	0x56D4	# <CJK>
0x606D	0x56D7	# <CJK>
0x606E	0x56DD	# <CJK>
0x606F	0x56E1	# <CJK>
0x6070	0x56F5	# <CJK>
0x6071	0x56EB	# <CJK>
0x6072	0x56F9	# <CJK>
0x6073	0x56FF	# <CJK>
0x6074	0x5704	# <CJK>
0x6075	0x570A	# <CJK>
0x6076	0x5709	# <CJK>
0x6077	0x571C	# <CJK>
0x6078	0x5E0F	# <CJK>
0x6079	0x5E19	# <CJK>
0x607A	0x5E14	# <CJK>
0x607B	0x5E11	# <CJK>
0x607C	0x5E31	# <CJK>
0x607D	0x5E3B	# <CJK>
0x607E	0x5E3C	# <CJK>
0x6121	0x5E37	# <CJK>
0x6122	0x5E44	# <CJK>
0x6123	0x5E54	# <CJK>
0x6124	0x5E5B	# <CJK>
0x6125	0x5E5E	# <CJK>
0x6126	0x5E61	# <CJK>
0x6127	0x5C8C	# <CJK>
0x6128	0x5C7A	# <CJK>
0x6129	0x5C8D	# <CJK>
0x612A	0x5C90	# <CJK>
0x612B	0x5C96	# <CJK>
0x612C	0x5C88	# <CJK>
0x612D	0x5C98	# <CJK>
0x612E	0x5C99	# <CJK>
0x612F	0x5C91	# <CJK>
0x6130	0x5C9A	# <CJK>
0x6131	0x5C9C	# <CJK>
0x6132	0x5CB5	# <CJK>
0x6133	0x5CA2	# <CJK>
0x6134	0x5CBD	# <CJK>
0x6135	0x5CAC	# <CJK>
0x6136	0x5CAB	# <CJK>
0x6137	0x5CB1	# <CJK>
0x6138	0x5CA3	# <CJK>
0x6139	0x5CC1	# <CJK>
0x613A	0x5CB7	# <CJK>
0x613B	0x5CC4	# <CJK>
0x613C	0x5CD2	# <CJK>
0x613D	0x5CE4	# <CJK>
0x613E	0x5CCB	# <CJK>
0x613F	0x5CE5	# <CJK>
0x6140	0x5D02	# <CJK>
0x6141	0x5D03	# <CJK>
0x6142	0x5D27	# <CJK>
0x6143	0x5D26	# <CJK>
0x6144	0x5D2E	# <CJK>
0x6145	0x5D24	# <CJK>
0x6146	0x5D1E	# <CJK>
0x6147	0x5D06	# <CJK>
0x6148	0x5D1B	# <CJK>
0x6149	0x5D58	# <CJK>
0x614A	0x5D3E	# <CJK>
0x614B	0x5D34	# <CJK>
0x614C	0x5D3D	# <CJK>
0x614D	0x5D6C	# <CJK>
0x614E	0x5D5B	# <CJK>
0x614F	0x5D6F	# <CJK>
0x6150	0x5D5D	# <CJK>
0x6151	0x5D6B	# <CJK>
0x6152	0x5D4B	# <CJK>
0x6153	0x5D4A	# <CJK>
0x6154	0x5D69	# <CJK>
0x6155	0x5D74	# <CJK>
0x6156	0x5D82	# <CJK>
0x6157	0x5D99	# <CJK>
0x6158	0x5D9D	# <CJK>
0x6159	0x8C73	# <CJK>
0x615A	0x5DB7	# <CJK>
0x615B	0x5DC5	# <CJK>
0x615C	0x5F73	# <CJK>
0x615D	0x5F77	# <CJK>
0x615E	0x5F82	# <CJK>
0x615F	0x5F87	# <CJK>
0x6160	0x5F89	# <CJK>
0x6161	0x5F8C	# <CJK>
0x6162	0x5F95	# <CJK>
0x6163	0x5F99	# <CJK>
0x6164	0x5F9C	# <CJK>
0x6165	0x5FA8	# <CJK>
0x6166	0x5FAD	# <CJK>
0x6167	0x5FB5	# <CJK>
0x6168	0x5FBC	# <CJK>
0x6169	0x8862	# <CJK>
0x616A	0x5F61	# <CJK>
0x616B	0x72AD	# <CJK>
0x616C	0x72B0	# <CJK>
0x616D	0x72B4	# <CJK>
0x616E	0x72B7	# <CJK>
0x616F	0x72B8	# <CJK>
0x6170	0x72C3	# <CJK>
0x6171	0x72C1	# <CJK>
0x6172	0x72CE	# <CJK>
0x6173	0x72CD	# <CJK>
0x6174	0x72D2	# <CJK>
0x6175	0x72E8	# <CJK>
0x6176	0x72EF	# <CJK>
0x6177	0x72E9	# <CJK>
0x6178	0x72F2	# <CJK>
0x6179	0x72F4	# <CJK>
0x617A	0x72F7	# <CJK>
0x617B	0x7301	# <CJK>
0x617C	0x72F3	# <CJK>
0x617D	0x7303	# <CJK>
0x617E	0x72FA	# <CJK>
0x6221	0x72FB	# <CJK>
0x6222	0x7317	# <CJK>
0x6223	0x7313	# <CJK>
0x6224	0x7321	# <CJK>
0x6225	0x730A	# <CJK>
0x6226	0x731E	# <CJK>
0x6227	0x731D	# <CJK>
0x6228	0x7315	# <CJK>
0x6229	0x7322	# <CJK>
0x622A	0x7339	# <CJK>
0x622B	0x7325	# <CJK>
0x622C	0x732C	# <CJK>
0x622D	0x7338	# <CJK>
0x622E	0x7331	# <CJK>
0x622F	0x7350	# <CJK>
0x6230	0x734D	# <CJK>
0x6231	0x7357	# <CJK>
0x6232	0x7360	# <CJK>
0x6233	0x736C	# <CJK>
0x6234	0x736F	# <CJK>
0x6235	0x737E	# <CJK>
0x6236	0x821B	# <CJK>
0x6237	0x5925	# <CJK>
0x6238	0x98E7	# <CJK>
0x6239	0x5924	# <CJK>
0x623A	0x5902	# <CJK>
0x623B	0x9963	# <CJK>
0x623C	0x9967	# <CJK>
0x623D	0x9968	# <CJK>
0x623E	0x9969	# <CJK>
0x623F	0x996A	# <CJK>
0x6240	0x996B	# <CJK>
0x6241	0x996C	# <CJK>
0x6242	0x9974	# <CJK>
0x6243	0x9977	# <CJK>
0x6244	0x997D	# <CJK>
0x6245	0x9980	# <CJK>
0x6246	0x9984	# <CJK>
0x6247	0x9987	# <CJK>
0x6248	0x998A	# <CJK>
0x6249	0x998D	# <CJK>
0x624A	0x9990	# <CJK>
0x624B	0x9991	# <CJK>
0x624C	0x9993	# <CJK>
0x624D	0x9994	# <CJK>
0x624E	0x9995	# <CJK>
0x624F	0x5E80	# <CJK>
0x6250	0x5E91	# <CJK>
0x6251	0x5E8B	# <CJK>
0x6252	0x5E96	# <CJK>
0x6253	0x5EA5	# <CJK>
0x6254	0x5EA0	# <CJK>
0x6255	0x5EB9	# <CJK>
0x6256	0x5EB5	# <CJK>
0x6257	0x5EBE	# <CJK>
0x6258	0x5EB3	# <CJK>
0x6259	0x8D53	# <CJK>
0x625A	0x5ED2	# <CJK>
0x625B	0x5ED1	# <CJK>
0x625C	0x5EDB	# <CJK>
0x625D	0x5EE8	# <CJK>
0x625E	0x5EEA	# <CJK>
0x625F	0x81BA	# <CJK>
0x6260	0x5FC4	# <CJK>
0x6261	0x5FC9	# <CJK>
0x6262	0x5FD6	# <CJK>
0x6263	0x5FCF	# <CJK>
0x6264	0x6003	# <CJK>
0x6265	0x5FEE	# <CJK>
0x6266	0x6004	# <CJK>
0x6267	0x5FE1	# <CJK>
0x6268	0x5FE4	# <CJK>
0x6269	0x5FFE	# <CJK>
0x626A	0x6005	# <CJK>
0x626B	0x6006	# <CJK>
0x626C	0x5FEA	# <CJK>
0x626D	0x5FED	# <CJK>
0x626E	0x5FF8	# <CJK>
0x626F	0x6019	# <CJK>
0x6270	0x6035	# <CJK>
0x6271	0x6026	# <CJK>
0x6272	0x601B	# <CJK>
0x6273	0x600F	# <CJK>
0x6274	0x600D	# <CJK>
0x6275	0x6029	# <CJK>
0x6276	0x602B	# <CJK>
0x6277	0x600A	# <CJK>
0x6278	0x603F	# <CJK>
0x6279	0x6021	# <CJK>
0x627A	0x6078	# <CJK>
0x627B	0x6079	# <CJK>
0x627C	0x607B	# <CJK>
0x627D	0x607A	# <CJK>
0x627E	0x6042	# <CJK>
0x6321	0x606A	# <CJK>
0x6322	0x607D	# <CJK>
0x6323	0x6096	# <CJK>
0x6324	0x609A	# <CJK>
0x6325	0x60AD	# <CJK>
0x6326	0x609D	# <CJK>
0x6327	0x6083	# <CJK>
0x6328	0x6092	# <CJK>
0x6329	0x608C	# <CJK>
0x632A	0x609B	# <CJK>
0x632B	0x60EC	# <CJK>
0x632C	0x60BB	# <CJK>
0x632D	0x60B1	# <CJK>
0x632E	0x60DD	# <CJK>
0x632F	0x60D8	# <CJK>
0x6330	0x60C6	# <CJK>
0x6331	0x60DA	# <CJK>
0x6332	0x60B4	# <CJK>
0x6333	0x6120	# <CJK>
0x6334	0x6126	# <CJK>
0x6335	0x6115	# <CJK>
0x6336	0x6123	# <CJK>
0x6337	0x60F4	# <CJK>
0x6338	0x6100	# <CJK>
0x6339	0x610E	# <CJK>
0x633A	0x612B	# <CJK>
0x633B	0x614A	# <CJK>
0x633C	0x6175	# <CJK>
0x633D	0x61AC	# <CJK>
0x633E	0x6194	# <CJK>
0x633F	0x61A7	# <CJK>
0x6340	0x61B7	# <CJK>
0x6341	0x61D4	# <CJK>
0x6342	0x61F5	# <CJK>
0x6343	0x5FDD	# <CJK>
0x6344	0x96B3	# <CJK>
0x6345	0x95E9	# <CJK>
0x6346	0x95EB	# <CJK>
0x6347	0x95F1	# <CJK>
0x6348	0x95F3	# <CJK>
0x6349	0x95F5	# <CJK>
0x634A	0x95F6	# <CJK>
0x634B	0x95FC	# <CJK>
0x634C	0x95FE	# <CJK>
0x634D	0x9603	# <CJK>
0x634E	0x9604	# <CJK>
0x634F	0x9606	# <CJK>
0x6350	0x9608	# <CJK>
0x6351	0x960A	# <CJK>
0x6352	0x960B	# <CJK>
0x6353	0x960C	# <CJK>
0x6354	0x960D	# <CJK>
0x6355	0x960F	# <CJK>
0x6356	0x9612	# <CJK>
0x6357	0x9615	# <CJK>
0x6358	0x9616	# <CJK>
0x6359	0x9617	# <CJK>
0x635A	0x9619	# <CJK>
0x635B	0x961A	# <CJK>
0x635C	0x4E2C	# <CJK>
0x635D	0x723F	# <CJK>
0x635E	0x6215	# <CJK>
0x635F	0x6C35	# <CJK>
0x6360	0x6C54	# <CJK>
0x6361	0x6C5C	# <CJK>
0x6362	0x6C4A	# <CJK>
0x6363	0x6CA3	# <CJK>
0x6364	0x6C85	# <CJK>
0x6365	0x6C90	# <CJK>
0x6366	0x6C94	# <CJK>
0x6367	0x6C8C	# <CJK>
0x6368	0x6C68	# <CJK>
0x6369	0x6C69	# <CJK>
0x636A	0x6C74	# <CJK>
0x636B	0x6C76	# <CJK>
0x636C	0x6C86	# <CJK>
0x636D	0x6CA9	# <CJK>
0x636E	0x6CD0	# <CJK>
0x636F	0x6CD4	# <CJK>
0x6370	0x6CAD	# <CJK>
0x6371	0x6CF7	# <CJK>
0x6372	0x6CF8	# <CJK>
0x6373	0x6CF1	# <CJK>
0x6374	0x6CD7	# <CJK>
0x6375	0x6CB2	# <CJK>
0x6376	0x6CE0	# <CJK>
0x6377	0x6CD6	# <CJK>
0x6378	0x6CFA	# <CJK>
0x6379	0x6CEB	# <CJK>
0x637A	0x6CEE	# <CJK>
0x637B	0x6CB1	# <CJK>
0x637C	0x6CD3	# <CJK>
0x637D	0x6CEF	# <CJK>
0x637E	0x6CFE	# <CJK>
0x6421	0x6D39	# <CJK>
0x6422	0x6D27	# <CJK>
0x6423	0x6D0C	# <CJK>
0x6424	0x6D43	# <CJK>
0x6425	0x6D48	# <CJK>
0x6426	0x6D07	# <CJK>
0x6427	0x6D04	# <CJK>
0x6428	0x6D19	# <CJK>
0x6429	0x6D0E	# <CJK>
0x642A	0x6D2B	# <CJK>
0x642B	0x6D4D	# <CJK>
0x642C	0x6D2E	# <CJK>
0x642D	0x6D35	# <CJK>
0x642E	0x6D1A	# <CJK>
0x642F	0x6D4F	# <CJK>
0x6430	0x6D52	# <CJK>
0x6431	0x6D54	# <CJK>
0x6432	0x6D33	# <CJK>
0x6433	0x6D91	# <CJK>
0x6434	0x6D6F	# <CJK>
0x6435	0x6D9E	# <CJK>
0x6436	0x6DA0	# <CJK>
0x6437	0x6D5E	# <CJK>
0x6438	0x6D93	# <CJK>
0x6439	0x6D94	# <CJK>
0x643A	0x6D5C	# <CJK>
0x643B	0x6D60	# <CJK>
0x643C	0x6D7C	# <CJK>
0x643D	0x6D63	# <CJK>
0x643E	0x6E1A	# <CJK>
0x643F	0x6DC7	# <CJK>
0x6440	0x6DC5	# <CJK>
0x6441	0x6DDE	# <CJK>
0x6442	0x6E0E	# <CJK>
0x6443	0x6DBF	# <CJK>
0x6444	0x6DE0	# <CJK>
0x6445	0x6E11	# <CJK>
0x6446	0x6DE6	# <CJK>
0x6447	0x6DDD	# <CJK>
0x6448	0x6DD9	# <CJK>
0x6449	0x6E16	# <CJK>
0x644A	0x6DAB	# <CJK>
0x644B	0x6E0C	# <CJK>
0x644C	0x6DAE	# <CJK>
0x644D	0x6E2B	# <CJK>
0x644E	0x6E6E	# <CJK>
0x644F	0x6E4E	# <CJK>
0x6450	0x6E6B	# <CJK>
0x6451	0x6EB2	# <CJK>
0x6452	0x6E5F	# <CJK>
0x6453	0x6E86	# <CJK>
0x6454	0x6E53	# <CJK>
0x6455	0x6E54	# <CJK>
0x6456	0x6E32	# <CJK>
0x6457	0x6E25	# <CJK>
0x6458	0x6E44	# <CJK>
0x6459	0x6EDF	# <CJK>
0x645A	0x6EB1	# <CJK>
0x645B	0x6E98	# <CJK>
0x645C	0x6EE0	# <CJK>
0x645D	0x6F2D	# <CJK>
0x645E	0x6EE2	# <CJK>
0x645F	0x6EA5	# <CJK>
0x6460	0x6EA7	# <CJK>
0x6461	0x6EBD	# <CJK>
0x6462	0x6EBB	# <CJK>
0x6463	0x6EB7	# <CJK>
0x6464	0x6ED7	# <CJK>
0x6465	0x6EB4	# <CJK>
0x6466	0x6ECF	# <CJK>
0x6467	0x6E8F	# <CJK>
0x6468	0x6EC2	# <CJK>
0x6469	0x6E9F	# <CJK>
0x646A	0x6F62	# <CJK>
0x646B	0x6F46	# <CJK>
0x646C	0x6F47	# <CJK>
0x646D	0x6F24	# <CJK>
0x646E	0x6F15	# <CJK>
0x646F	0x6EF9	# <CJK>
0x6470	0x6F2F	# <CJK>
0x6471	0x6F36	# <CJK>
0x6472	0x6F4B	# <CJK>
0x6473	0x6F74	# <CJK>
0x6474	0x6F2A	# <CJK>
0x6475	0x6F09	# <CJK>
0x6476	0x6F29	# <CJK>
0x6477	0x6F89	# <CJK>
0x6478	0x6F8D	# <CJK>
0x6479	0x6F8C	# <CJK>
0x647A	0x6F78	# <CJK>
0x647B	0x6F72	# <CJK>
0x647C	0x6F7C	# <CJK>
0x647D	0x6F7A	# <CJK>
0x647E	0x6FD1	# <CJK>
0x6521	0x6FC9	# <CJK>
0x6522	0x6FA7	# <CJK>
0x6523	0x6FB9	# <CJK>
0x6524	0x6FB6	# <CJK>
0x6525	0x6FC2	# <CJK>
0x6526	0x6FE1	# <CJK>
0x6527	0x6FEE	# <CJK>
0x6528	0x6FDE	# <CJK>
0x6529	0x6FE0	# <CJK>
0x652A	0x6FEF	# <CJK>
0x652B	0x701A	# <CJK>
0x652C	0x7023	# <CJK>
0x652D	0x701B	# <CJK>
0x652E	0x7039	# <CJK>
0x652F	0x7035	# <CJK>
0x6530	0x704F	# <CJK>
0x6531	0x705E	# <CJK>
0x6532	0x5B80	# <CJK>
0x6533	0x5B84	# <CJK>
0x6534	0x5B95	# <CJK>
0x6535	0x5B93	# <CJK>
0x6536	0x5BA5	# <CJK>
0x6537	0x5BB8	# <CJK>
0x6538	0x752F	# <CJK>
0x6539	0x9A9E	# <CJK>
0x653A	0x6434	# <CJK>
0x653B	0x5BE4	# <CJK>
0x653C	0x5BEE	# <CJK>
0x653D	0x8930	# <CJK>
0x653E	0x5BF0	# <CJK>
0x653F	0x8E47	# <CJK>
0x6540	0x8B07	# <CJK>
0x6541	0x8FB6	# <CJK>
0x6542	0x8FD3	# <CJK>
0x6543	0x8FD5	# <CJK>
0x6544	0x8FE5	# <CJK>
0x6545	0x8FEE	# <CJK>
0x6546	0x8FE4	# <CJK>
0x6547	0x8FE9	# <CJK>
0x6548	0x8FE6	# <CJK>
0x6549	0x8FF3	# <CJK>
0x654A	0x8FE8	# <CJK>
0x654B	0x9005	# <CJK>
0x654C	0x9004	# <CJK>
0x654D	0x900B	# <CJK>
0x654E	0x9026	# <CJK>
0x654F	0x9011	# <CJK>
0x6550	0x900D	# <CJK>
0x6551	0x9016	# <CJK>
0x6552	0x9021	# <CJK>
0x6553	0x9035	# <CJK>
0x6554	0x9036	# <CJK>
0x6555	0x902D	# <CJK>
0x6556	0x902F	# <CJK>
0x6557	0x9044	# <CJK>
0x6558	0x9051	# <CJK>
0x6559	0x9052	# <CJK>
0x655A	0x9050	# <CJK>
0x655B	0x9068	# <CJK>
0x655C	0x9058	# <CJK>
0x655D	0x9062	# <CJK>
0x655E	0x905B	# <CJK>
0x655F	0x66B9	# <CJK>
0x6560	0x9074	# <CJK>
0x6561	0x907D	# <CJK>
0x6562	0x9082	# <CJK>
0x6563	0x9088	# <CJK>
0x6564	0x9083	# <CJK>
0x6565	0x908B	# <CJK>
0x6566	0x5F50	# <CJK>
0x6567	0x5F57	# <CJK>
0x6568	0x5F56	# <CJK>
0x6569	0x5F58	# <CJK>
0x656A	0x5C3B	# <CJK>
0x656B	0x54AB	# <CJK>
0x656C	0x5C50	# <CJK>
0x656D	0x5C59	# <CJK>
0x656E	0x5B71	# <CJK>
0x656F	0x5C63	# <CJK>
0x6570	0x5C66	# <CJK>
0x6571	0x7FBC	# <CJK>
0x6572	0x5F2A	# <CJK>
0x6573	0x5F29	# <CJK>
0x6574	0x5F2D	# <CJK>
0x6575	0x8274	# <CJK>
0x6576	0x5F3C	# <CJK>
0x6577	0x9B3B	# <CJK>
0x6578	0x5C6E	# <CJK>
0x6579	0x5981	# <CJK>
0x657A	0x5983	# <CJK>
0x657B	0x598D	# <CJK>
0x657C	0x59A9	# <CJK>
0x657D	0x59AA	# <CJK>
0x657E	0x59A3	# <CJK>
0x6621	0x5997	# <CJK>
0x6622	0x59CA	# <CJK>
0x6623	0x59AB	# <CJK>
0x6624	0x599E	# <CJK>
0x6625	0x59A4	# <CJK>
0x6626	0x59D2	# <CJK>
0x6627	0x59B2	# <CJK>
0x6628	0x59AF	# <CJK>
0x6629	0x59D7	# <CJK>
0x662A	0x59BE	# <CJK>
0x662B	0x5A05	# <CJK>
0x662C	0x5A06	# <CJK>
0x662D	0x59DD	# <CJK>
0x662E	0x5A08	# <CJK>
0x662F	0x59E3	# <CJK>
0x6630	0x59D8	# <CJK>
0x6631	0x59F9	# <CJK>
0x6632	0x5A0C	# <CJK>
0x6633	0x5A09	# <CJK>
0x6634	0x5A32	# <CJK>
0x6635	0x5A34	# <CJK>
0x6636	0x5A11	# <CJK>
0x6637	0x5A23	# <CJK>
0x6638	0x5A13	# <CJK>
0x6639	0x5A40	# <CJK>
0x663A	0x5A67	# <CJK>
0x663B	0x5A4A	# <CJK>
0x663C	0x5A55	# <CJK>
0x663D	0x5A3C	# <CJK>
0x663E	0x5A62	# <CJK>
0x663F	0x5A75	# <CJK>
0x6640	0x80EC	# <CJK>
0x6641	0x5AAA	# <CJK>
0x6642	0x5A9B	# <CJK>
0x6643	0x5A77	# <CJK>
0x6644	0x5A7A	# <CJK>
0x6645	0x5ABE	# <CJK>
0x6646	0x5AEB	# <CJK>
0x6647	0x5AB2	# <CJK>
0x6648	0x5AD2	# <CJK>
0x6649	0x5AD4	# <CJK>
0x664A	0x5AB8	# <CJK>
0x664B	0x5AE0	# <CJK>
0x664C	0x5AE3	# <CJK>
0x664D	0x5AF1	# <CJK>
0x664E	0x5AD6	# <CJK>
0x664F	0x5AE6	# <CJK>
0x6650	0x5AD8	# <CJK>
0x6651	0x5ADC	# <CJK>
0x6652	0x5B09	# <CJK>
0x6653	0x5B17	# <CJK>
0x6654	0x5B16	# <CJK>
0x6655	0x5B32	# <CJK>
0x6656	0x5B37	# <CJK>
0x6657	0x5B40	# <CJK>
0x6658	0x5C15	# <CJK>
0x6659	0x5C1C	# <CJK>
0x665A	0x5B5A	# <CJK>
0x665B	0x5B65	# <CJK>
0x665C	0x5B73	# <CJK>
0x665D	0x5B51	# <CJK>
0x665E	0x5B53	# <CJK>
0x665F	0x5B62	# <CJK>
0x6660	0x9A75	# <CJK>
0x6661	0x9A77	# <CJK>
0x6662	0x9A78	# <CJK>
0x6663	0x9A7A	# <CJK>
0x6664	0x9A7F	# <CJK>
0x6665	0x9A7D	# <CJK>
0x6666	0x9A80	# <CJK>
0x6667	0x9A81	# <CJK>
0x6668	0x9A85	# <CJK>
0x6669	0x9A88	# <CJK>
0x666A	0x9A8A	# <CJK>
0x666B	0x9A90	# <CJK>
0x666C	0x9A92	# <CJK>
0x666D	0x9A93	# <CJK>
0x666E	0x9A96	# <CJK>
0x666F	0x9A98	# <CJK>
0x6670	0x9A9B	# <CJK>
0x6671	0x9A9C	# <CJK>
0x6672	0x9A9D	# <CJK>
0x6673	0x9A9F	# <CJK>
0x6674	0x9AA0	# <CJK>
0x6675	0x9AA2	# <CJK>
0x6676	0x9AA3	# <CJK>
0x6677	0x9AA5	# <CJK>
0x6678	0x9AA7	# <CJK>
0x6679	0x7E9F	# <CJK>
0x667A	0x7EA1	# <CJK>
0x667B	0x7EA3	# <CJK>
0x667C	0x7EA5	# <CJK>
0x667D	0x7EA8	# <CJK>
0x667E	0x7EA9	# <CJK>
0x6721	0x7EAD	# <CJK>
0x6722	0x7EB0	# <CJK>
0x6723	0x7EBE	# <CJK>
0x6724	0x7EC0	# <CJK>
0x6725	0x7EC1	# <CJK>
0x6726	0x7EC2	# <CJK>
0x6727	0x7EC9	# <CJK>
0x6728	0x7ECB	# <CJK>
0x6729	0x7ECC	# <CJK>
0x672A	0x7ED0	# <CJK>
0x672B	0x7ED4	# <CJK>
0x672C	0x7ED7	# <CJK>
0x672D	0x7EDB	# <CJK>
0x672E	0x7EE0	# <CJK>
0x672F	0x7EE1	# <CJK>
0x6730	0x7EE8	# <CJK>
0x6731	0x7EEB	# <CJK>
0x6732	0x7EEE	# <CJK>
0x6733	0x7EEF	# <CJK>
0x6734	0x7EF1	# <CJK>
0x6735	0x7EF2	# <CJK>
0x6736	0x7F0D	# <CJK>
0x6737	0x7EF6	# <CJK>
0x6738	0x7EFA	# <CJK>
0x6739	0x7EFB	# <CJK>
0x673A	0x7EFE	# <CJK>
0x673B	0x7F01	# <CJK>
0x673C	0x7F02	# <CJK>
0x673D	0x7F03	# <CJK>
0x673E	0x7F07	# <CJK>
0x673F	0x7F08	# <CJK>
0x6740	0x7F0B	# <CJK>
0x6741	0x7F0C	# <CJK>
0x6742	0x7F0F	# <CJK>
0x6743	0x7F11	# <CJK>
0x6744	0x7F12	# <CJK>
0x6745	0x7F17	# <CJK>
0x6746	0x7F19	# <CJK>
0x6747	0x7F1C	# <CJK>
0x6748	0x7F1B	# <CJK>
0x6749	0x7F1F	# <CJK>
0x674A	0x7F21	# <CJK>
0x674B	0x7F22	# <CJK>
0x674C	0x7F23	# <CJK>
0x674D	0x7F24	# <CJK>
0x674E	0x7F25	# <CJK>
0x674F	0x7F26	# <CJK>
0x6750	0x7F27	# <CJK>
0x6751	0x7F2A	# <CJK>
0x6752	0x7F2B	# <CJK>
0x6753	0x7F2C	# <CJK>
0x6754	0x7F2D	# <CJK>
0x6755	0x7F2F	# <CJK>
0x6756	0x7F30	# <CJK>
0x6757	0x7F31	# <CJK>
0x6758	0x7F32	# <CJK>
0x6759	0x7F33	# <CJK>
0x675A	0x7F35	# <CJK>
0x675B	0x5E7A	# <CJK>
0x675C	0x757F	# <CJK>
0x675D	0x5DDB	# <CJK>
0x675E	0x753E	# <CJK>
0x675F	0x9095	# <CJK>
0x6760	0x738E	# <CJK>
0x6761	0x7391	# <CJK>
0x6762	0x73AE	# <CJK>
0x6763	0x73A2	# <CJK>
0x6764	0x739F	# <CJK>
0x6765	0x73CF	# <CJK>
0x6766	0x73C2	# <CJK>
0x6767	0x73D1	# <CJK>
0x6768	0x73B7	# <CJK>
0x6769	0x73B3	# <CJK>
0x676A	0x73C0	# <CJK>
0x676B	0x73C9	# <CJK>
0x676C	0x73C8	# <CJK>
0x676D	0x73E5	# <CJK>
0x676E	0x73D9	# <CJK>
0x676F	0x987C	# <CJK>
0x6770	0x740A	# <CJK>
0x6771	0x73E9	# <CJK>
0x6772	0x73E7	# <CJK>
0x6773	0x73DE	# <CJK>
0x6774	0x73BA	# <CJK>
0x6775	0x73F2	# <CJK>
0x6776	0x740F	# <CJK>
0x6777	0x742A	# <CJK>
0x6778	0x745B	# <CJK>
0x6779	0x7426	# <CJK>
0x677A	0x7425	# <CJK>
0x677B	0x7428	# <CJK>
0x677C	0x7430	# <CJK>
0x677D	0x742E	# <CJK>
0x677E	0x742C	# <CJK>
0x6821	0x741B	# <CJK>
0x6822	0x741A	# <CJK>
0x6823	0x7441	# <CJK>
0x6824	0x745C	# <CJK>
0x6825	0x7457	# <CJK>
0x6826	0x7455	# <CJK>
0x6827	0x7459	# <CJK>
0x6828	0x7477	# <CJK>
0x6829	0x746D	# <CJK>
0x682A	0x747E	# <CJK>
0x682B	0x749C	# <CJK>
0x682C	0x748E	# <CJK>
0x682D	0x7480	# <CJK>
0x682E	0x7481	# <CJK>
0x682F	0x7487	# <CJK>
0x6830	0x748B	# <CJK>
0x6831	0x749E	# <CJK>
0x6832	0x74A8	# <CJK>
0x6833	0x74A9	# <CJK>
0x6834	0x7490	# <CJK>
0x6835	0x74A7	# <CJK>
0x6836	0x74D2	# <CJK>
0x6837	0x74BA	# <CJK>
0x6838	0x97EA	# <CJK>
0x6839	0x97EB	# <CJK>
0x683A	0x97EC	# <CJK>
0x683B	0x674C	# <CJK>
0x683C	0x6753	# <CJK>
0x683D	0x675E	# <CJK>
0x683E	0x6748	# <CJK>
0x683F	0x6769	# <CJK>
0x6840	0x67A5	# <CJK>
0x6841	0x6787	# <CJK>
0x6842	0x676A	# <CJK>
0x6843	0x6773	# <CJK>
0x6844	0x6798	# <CJK>
0x6845	0x67A7	# <CJK>
0x6846	0x6775	# <CJK>
0x6847	0x67A8	# <CJK>
0x6848	0x679E	# <CJK>
0x6849	0x67AD	# <CJK>
0x684A	0x678B	# <CJK>
0x684B	0x6777	# <CJK>
0x684C	0x677C	# <CJK>
0x684D	0x67F0	# <CJK>
0x684E	0x6809	# <CJK>
0x684F	0x67D8	# <CJK>
0x6850	0x680A	# <CJK>
0x6851	0x67E9	# <CJK>
0x6852	0x67B0	# <CJK>
0x6853	0x680C	# <CJK>
0x6854	0x67D9	# <CJK>
0x6855	0x67B5	# <CJK>
0x6856	0x67DA	# <CJK>
0x6857	0x67B3	# <CJK>
0x6858	0x67DD	# <CJK>
0x6859	0x6800	# <CJK>
0x685A	0x67C3	# <CJK>
0x685B	0x67B8	# <CJK>
0x685C	0x67E2	# <CJK>
0x685D	0x680E	# <CJK>
0x685E	0x67C1	# <CJK>
0x685F	0x67FD	# <CJK>
0x6860	0x6832	# <CJK>
0x6861	0x6833	# <CJK>
0x6862	0x6860	# <CJK>
0x6863	0x6861	# <CJK>
0x6864	0x684E	# <CJK>
0x6865	0x6862	# <CJK>
0x6866	0x6844	# <CJK>
0x6867	0x6864	# <CJK>
0x6868	0x6883	# <CJK>
0x6869	0x681D	# <CJK>
0x686A	0x6855	# <CJK>
0x686B	0x6866	# <CJK>
0x686C	0x6841	# <CJK>
0x686D	0x6867	# <CJK>
0x686E	0x6840	# <CJK>
0x686F	0x683E	# <CJK>
0x6870	0x684A	# <CJK>
0x6871	0x6849	# <CJK>
0x6872	0x6829	# <CJK>
0x6873	0x68B5	# <CJK>
0x6874	0x688F	# <CJK>
0x6875	0x6874	# <CJK>
0x6876	0x6877	# <CJK>
0x6877	0x6893	# <CJK>
0x6878	0x686B	# <CJK>
0x6879	0x68C2	# <CJK>
0x687A	0x696E	# <CJK>
0x687B	0x68FC	# <CJK>
0x687C	0x691F	# <CJK>
0x687D	0x6920	# <CJK>
0x687E	0x68F9	# <CJK>
0x6921	0x6924	# <CJK>
0x6922	0x68F0	# <CJK>
0x6923	0x690B	# <CJK>
0x6924	0x6901	# <CJK>
0x6925	0x6957	# <CJK>
0x6926	0x68E3	# <CJK>
0x6927	0x6910	# <CJK>
0x6928	0x6971	# <CJK>
0x6929	0x6939	# <CJK>
0x692A	0x6960	# <CJK>
0x692B	0x6942	# <CJK>
0x692C	0x695D	# <CJK>
0x692D	0x6984	# <CJK>
0x692E	0x696B	# <CJK>
0x692F	0x6980	# <CJK>
0x6930	0x6998	# <CJK>
0x6931	0x6978	# <CJK>
0x6932	0x6934	# <CJK>
0x6933	0x69CC	# <CJK>
0x6934	0x6987	# <CJK>
0x6935	0x6988	# <CJK>
0x6936	0x69CE	# <CJK>
0x6937	0x6989	# <CJK>
0x6938	0x6966	# <CJK>
0x6939	0x6963	# <CJK>
0x693A	0x6979	# <CJK>
0x693B	0x699B	# <CJK>
0x693C	0x69A7	# <CJK>
0x693D	0x69BB	# <CJK>
0x693E	0x69AB	# <CJK>
0x693F	0x69AD	# <CJK>
0x6940	0x69D4	# <CJK>
0x6941	0x69B1	# <CJK>
0x6942	0x69C1	# <CJK>
0x6943	0x69CA	# <CJK>
0x6944	0x69DF	# <CJK>
0x6945	0x6995	# <CJK>
0x6946	0x69E0	# <CJK>
0x6947	0x698D	# <CJK>
0x6948	0x69FF	# <CJK>
0x6949	0x6A2F	# <CJK>
0x694A	0x69ED	# <CJK>
0x694B	0x6A17	# <CJK>
0x694C	0x6A18	# <CJK>
0x694D	0x6A65	# <CJK>
0x694E	0x69F2	# <CJK>
0x694F	0x6A44	# <CJK>
0x6950	0x6A3E	# <CJK>
0x6951	0x6AA0	# <CJK>
0x6952	0x6A50	# <CJK>
0x6953	0x6A5B	# <CJK>
0x6954	0x6A35	# <CJK>
0x6955	0x6A8E	# <CJK>
0x6956	0x6A79	# <CJK>
0x6957	0x6A3D	# <CJK>
0x6958	0x6A28	# <CJK>
0x6959	0x6A58	# <CJK>
0x695A	0x6A7C	# <CJK>
0x695B	0x6A91	# <CJK>
0x695C	0x6A90	# <CJK>
0x695D	0x6AA9	# <CJK>
0x695E	0x6A97	# <CJK>
0x695F	0x6AAB	# <CJK>
0x6960	0x7337	# <CJK>
0x6961	0x7352	# <CJK>
0x6962	0x6B81	# <CJK>
0x6963	0x6B82	# <CJK>
0x6964	0x6B87	# <CJK>
0x6965	0x6B84	# <CJK>
0x6966	0x6B92	# <CJK>
0x6967	0x6B93	# <CJK>
0x6968	0x6B8D	# <CJK>
0x6969	0x6B9A	# <CJK>
0x696A	0x6B9B	# <CJK>
0x696B	0x6BA1	# <CJK>
0x696C	0x6BAA	# <CJK>
0x696D	0x8F6B	# <CJK>
0x696E	0x8F6D	# <CJK>
0x696F	0x8F71	# <CJK>
0x6970	0x8F72	# <CJK>
0x6971	0x8F73	# <CJK>
0x6972	0x8F75	# <CJK>
0x6973	0x8F76	# <CJK>
0x6974	0x8F78	# <CJK>
0x6975	0x8F77	# <CJK>
0x6976	0x8F79	# <CJK>
0x6977	0x8F7A	# <CJK>
0x6978	0x8F7C	# <CJK>
0x6979	0x8F7E	# <CJK>
0x697A	0x8F81	# <CJK>
0x697B	0x8F82	# <CJK>
0x697C	0x8F84	# <CJK>
0x697D	0x8F87	# <CJK>
0x697E	0x8F8B	# <CJK>
0x6A21	0x8F8D	# <CJK>
0x6A22	0x8F8E	# <CJK>
0x6A23	0x8F8F	# <CJK>
0x6A24	0x8F98	# <CJK>
0x6A25	0x8F9A	# <CJK>
0x6A26	0x8ECE	# <CJK>
0x6A27	0x620B	# <CJK>
0x6A28	0x6217	# <CJK>
0x6A29	0x621B	# <CJK>
0x6A2A	0x621F	# <CJK>
0x6A2B	0x6222	# <CJK>
0x6A2C	0x6221	# <CJK>
0x6A2D	0x6225	# <CJK>
0x6A2E	0x6224	# <CJK>
0x6A2F	0x622C	# <CJK>
0x6A30	0x81E7	# <CJK>
0x6A31	0x74EF	# <CJK>
0x6A32	0x74F4	# <CJK>
0x6A33	0x74FF	# <CJK>
0x6A34	0x750F	# <CJK>
0x6A35	0x7511	# <CJK>
0x6A36	0x7513	# <CJK>
0x6A37	0x6534	# <CJK>
0x6A38	0x65EE	# <CJK>
0x6A39	0x65EF	# <CJK>
0x6A3A	0x65F0	# <CJK>
0x6A3B	0x660A	# <CJK>
0x6A3C	0x6619	# <CJK>
0x6A3D	0x6772	# <CJK>
0x6A3E	0x6603	# <CJK>
0x6A3F	0x6615	# <CJK>
0x6A40	0x6600	# <CJK>
0x6A41	0x7085	# <CJK>
0x6A42	0x66F7	# <CJK>
0x6A43	0x661D	# <CJK>
0x6A44	0x6634	# <CJK>
0x6A45	0x6631	# <CJK>
0x6A46	0x6636	# <CJK>
0x6A47	0x6635	# <CJK>
0x6A48	0x8006	# <CJK>
0x6A49	0x665F	# <CJK>
0x6A4A	0x6654	# <CJK>
0x6A4B	0x6641	# <CJK>
0x6A4C	0x664F	# <CJK>
0x6A4D	0x6656	# <CJK>
0x6A4E	0x6661	# <CJK>
0x6A4F	0x6657	# <CJK>
0x6A50	0x6677	# <CJK>
0x6A51	0x6684	# <CJK>
0x6A52	0x668C	# <CJK>
0x6A53	0x66A7	# <CJK>
0x6A54	0x669D	# <CJK>
0x6A55	0x66BE	# <CJK>
0x6A56	0x66DB	# <CJK>
0x6A57	0x66DC	# <CJK>
0x6A58	0x66E6	# <CJK>
0x6A59	0x66E9	# <CJK>
0x6A5A	0x8D32	# <CJK>
0x6A5B	0x8D33	# <CJK>
0x6A5C	0x8D36	# <CJK>
0x6A5D	0x8D3B	# <CJK>
0x6A5E	0x8D3D	# <CJK>
0x6A5F	0x8D40	# <CJK>
0x6A60	0x8D45	# <CJK>
0x6A61	0x8D46	# <CJK>
0x6A62	0x8D48	# <CJK>
0x6A63	0x8D49	# <CJK>
0x6A64	0x8D47	# <CJK>
0x6A65	0x8D4D	# <CJK>
0x6A66	0x8D55	# <CJK>
0x6A67	0x8D59	# <CJK>
0x6A68	0x89C7	# <CJK>
0x6A69	0x89CA	# <CJK>
0x6A6A	0x89CB	# <CJK>
0x6A6B	0x89CC	# <CJK>
0x6A6C	0x89CE	# <CJK>
0x6A6D	0x89CF	# <CJK>
0x6A6E	0x89D0	# <CJK>
0x6A6F	0x89D1	# <CJK>
0x6A70	0x726E	# <CJK>
0x6A71	0x729F	# <CJK>
0x6A72	0x725D	# <CJK>
0x6A73	0x7266	# <CJK>
0x6A74	0x726F	# <CJK>
0x6A75	0x727E	# <CJK>
0x6A76	0x727F	# <CJK>
0x6A77	0x7284	# <CJK>
0x6A78	0x728B	# <CJK>
0x6A79	0x728D	# <CJK>
0x6A7A	0x728F	# <CJK>
0x6A7B	0x7292	# <CJK>
0x6A7C	0x6308	# <CJK>
0x6A7D	0x6332	# <CJK>
0x6A7E	0x63B0	# <CJK>
0x6B21	0x643F	# <CJK>
0x6B22	0x64D8	# <CJK>
0x6B23	0x8004	# <CJK>
0x6B24	0x6BEA	# <CJK>
0x6B25	0x6BF3	# <CJK>
0x6B26	0x6BFD	# <CJK>
0x6B27	0x6BF5	# <CJK>
0x6B28	0x6BF9	# <CJK>
0x6B29	0x6C05	# <CJK>
0x6B2A	0x6C07	# <CJK>
0x6B2B	0x6C06	# <CJK>
0x6B2C	0x6C0D	# <CJK>
0x6B2D	0x6C15	# <CJK>
0x6B2E	0x6C18	# <CJK>
0x6B2F	0x6C19	# <CJK>
0x6B30	0x6C1A	# <CJK>
0x6B31	0x6C21	# <CJK>
0x6B32	0x6C29	# <CJK>
0x6B33	0x6C24	# <CJK>
0x6B34	0x6C2A	# <CJK>
0x6B35	0x6C32	# <CJK>
0x6B36	0x6535	# <CJK>
0x6B37	0x6555	# <CJK>
0x6B38	0x656B	# <CJK>
0x6B39	0x724D	# <CJK>
0x6B3A	0x7252	# <CJK>
0x6B3B	0x7256	# <CJK>
0x6B3C	0x7230	# <CJK>
0x6B3D	0x8662	# <CJK>
0x6B3E	0x5216	# <CJK>
0x6B3F	0x809F	# <CJK>
0x6B40	0x809C	# <CJK>
0x6B41	0x8093	# <CJK>
0x6B42	0x80BC	# <CJK>
0x6B43	0x670A	# <CJK>
0x6B44	0x80BD	# <CJK>
0x6B45	0x80B1	# <CJK>
0x6B46	0x80AB	# <CJK>
0x6B47	0x80AD	# <CJK>
0x6B48	0x80B4	# <CJK>
0x6B49	0x80B7	# <CJK>
0x6B4A	0x80E7	# <CJK>
0x6B4B	0x80E8	# <CJK>
0x6B4C	0x80E9	# <CJK>
0x6B4D	0x80EA	# <CJK>
0x6B4E	0x80DB	# <CJK>
0x6B4F	0x80C2	# <CJK>
0x6B50	0x80C4	# <CJK>
0x6B51	0x80D9	# <CJK>
0x6B52	0x80CD	# <CJK>
0x6B53	0x80D7	# <CJK>
0x6B54	0x6710	# <CJK>
0x6B55	0x80DD	# <CJK>
0x6B56	0x80EB	# <CJK>
0x6B57	0x80F1	# <CJK>
0x6B58	0x80F4	# <CJK>
0x6B59	0x80ED	# <CJK>
0x6B5A	0x810D	# <CJK>
0x6B5B	0x810E	# <CJK>
0x6B5C	0x80F2	# <CJK>
0x6B5D	0x80FC	# <CJK>
0x6B5E	0x6715	# <CJK>
0x6B5F	0x8112	# <CJK>
0x6B60	0x8C5A	# <CJK>
0x6B61	0x8136	# <CJK>
0x6B62	0x811E	# <CJK>
0x6B63	0x812C	# <CJK>
0x6B64	0x8118	# <CJK>
0x6B65	0x8132	# <CJK>
0x6B66	0x8148	# <CJK>
0x6B67	0x814C	# <CJK>
0x6B68	0x8153	# <CJK>
0x6B69	0x8174	# <CJK>
0x6B6A	0x8159	# <CJK>
0x6B6B	0x815A	# <CJK>
0x6B6C	0x8171	# <CJK>
0x6B6D	0x8160	# <CJK>
0x6B6E	0x8169	# <CJK>
0x6B6F	0x817C	# <CJK>
0x6B70	0x817D	# <CJK>
0x6B71	0x816D	# <CJK>
0x6B72	0x8167	# <CJK>
0x6B73	0x584D	# <CJK>
0x6B74	0x5AB5	# <CJK>
0x6B75	0x8188	# <CJK>
0x6B76	0x8182	# <CJK>
0x6B77	0x8191	# <CJK>
0x6B78	0x6ED5	# <CJK>
0x6B79	0x81A3	# <CJK>
0x6B7A	0x81AA	# <CJK>
0x6B7B	0x81CC	# <CJK>
0x6B7C	0x6726	# <CJK>
0x6B7D	0x81CA	# <CJK>
0x6B7E	0x81BB	# <CJK>
0x6C21	0x81C1	# <CJK>
0x6C22	0x81A6	# <CJK>
0x6C23	0x6B24	# <CJK>
0x6C24	0x6B37	# <CJK>
0x6C25	0x6B39	# <CJK>
0x6C26	0x6B43	# <CJK>
0x6C27	0x6B46	# <CJK>
0x6C28	0x6B59	# <CJK>
0x6C29	0x98D1	# <CJK>
0x6C2A	0x98D2	# <CJK>
0x6C2B	0x98D3	# <CJK>
0x6C2C	0x98D5	# <CJK>
0x6C2D	0x98D9	# <CJK>
0x6C2E	0x98DA	# <CJK>
0x6C2F	0x6BB3	# <CJK>
0x6C30	0x5F40	# <CJK>
0x6C31	0x6BC2	# <CJK>
0x6C32	0x89F3	# <CJK>
0x6C33	0x6590	# <CJK>
0x6C34	0x9F51	# <CJK>
0x6C35	0x6593	# <CJK>
0x6C36	0x65BC	# <CJK>
0x6C37	0x65C6	# <CJK>
0x6C38	0x65C4	# <CJK>
0x6C39	0x65C3	# <CJK>
0x6C3A	0x65CC	# <CJK>
0x6C3B	0x65CE	# <CJK>
0x6C3C	0x65D2	# <CJK>
0x6C3D	0x65D6	# <CJK>
0x6C3E	0x7080	# <CJK>
0x6C3F	0x709C	# <CJK>
0x6C40	0x7096	# <CJK>
0x6C41	0x709D	# <CJK>
0x6C42	0x70BB	# <CJK>
0x6C43	0x70C0	# <CJK>
0x6C44	0x70B7	# <CJK>
0x6C45	0x70AB	# <CJK>
0x6C46	0x70B1	# <CJK>
0x6C47	0x70E8	# <CJK>
0x6C48	0x70CA	# <CJK>
0x6C49	0x7110	# <CJK>
0x6C4A	0x7113	# <CJK>
0x6C4B	0x7116	# <CJK>
0x6C4C	0x712F	# <CJK>
0x6C4D	0x7131	# <CJK>
0x6C4E	0x7173	# <CJK>
0x6C4F	0x715C	# <CJK>
0x6C50	0x7168	# <CJK>
0x6C51	0x7145	# <CJK>
0x6C52	0x7172	# <CJK>
0x6C53	0x714A	# <CJK>
0x6C54	0x7178	# <CJK>
0x6C55	0x717A	# <CJK>
0x6C56	0x7198	# <CJK>
0x6C57	0x71B3	# <CJK>
0x6C58	0x71B5	# <CJK>
0x6C59	0x71A8	# <CJK>
0x6C5A	0x71A0	# <CJK>
0x6C5B	0x71E0	# <CJK>
0x6C5C	0x71D4	# <CJK>
0x6C5D	0x71E7	# <CJK>
0x6C5E	0x71F9	# <CJK>
0x6C5F	0x721D	# <CJK>
0x6C60	0x7228	# <CJK>
0x6C61	0x706C	# <CJK>
0x6C62	0x7118	# <CJK>
0x6C63	0x7166	# <CJK>
0x6C64	0x71B9	# <CJK>
0x6C65	0x623E	# <CJK>
0x6C66	0x623D	# <CJK>
0x6C67	0x6243	# <CJK>
0x6C68	0x6248	# <CJK>
0x6C69	0x6249	# <CJK>
0x6C6A	0x793B	# <CJK>
0x6C6B	0x7940	# <CJK>
0x6C6C	0x7946	# <CJK>
0x6C6D	0x7949	# <CJK>
0x6C6E	0x795B	# <CJK>
0x6C6F	0x795C	# <CJK>
0x6C70	0x7953	# <CJK>
0x6C71	0x795A	# <CJK>
0x6C72	0x7962	# <CJK>
0x6C73	0x7957	# <CJK>
0x6C74	0x7960	# <CJK>
0x6C75	0x796F	# <CJK>
0x6C76	0x7967	# <CJK>
0x6C77	0x797A	# <CJK>
0x6C78	0x7985	# <CJK>
0x6C79	0x798A	# <CJK>
0x6C7A	0x799A	# <CJK>
0x6C7B	0x79A7	# <CJK>
0x6C7C	0x79B3	# <CJK>
0x6C7D	0x5FD1	# <CJK>
0x6C7E	0x5FD0	# <CJK>
0x6D21	0x603C	# <CJK>
0x6D22	0x605D	# <CJK>
0x6D23	0x605A	# <CJK>
0x6D24	0x6067	# <CJK>
0x6D25	0x6041	# <CJK>
0x6D26	0x6059	# <CJK>
0x6D27	0x6063	# <CJK>
0x6D28	0x60AB	# <CJK>
0x6D29	0x6106	# <CJK>
0x6D2A	0x610D	# <CJK>
0x6D2B	0x615D	# <CJK>
0x6D2C	0x61A9	# <CJK>
0x6D2D	0x619D	# <CJK>
0x6D2E	0x61CB	# <CJK>
0x6D2F	0x61D1	# <CJK>
0x6D30	0x6206	# <CJK>
0x6D31	0x8080	# <CJK>
0x6D32	0x807F	# <CJK>
0x6D33	0x6C93	# <CJK>
0x6D34	0x6CF6	# <CJK>
0x6D35	0x6DFC	# <CJK>
0x6D36	0x77F6	# <CJK>
0x6D37	0x77F8	# <CJK>
0x6D38	0x7800	# <CJK>
0x6D39	0x7809	# <CJK>
0x6D3A	0x7817	# <CJK>
0x6D3B	0x7818	# <CJK>
0x6D3C	0x7811	# <CJK>
0x6D3D	0x65AB	# <CJK>
0x6D3E	0x782D	# <CJK>
0x6D3F	0x781C	# <CJK>
0x6D40	0x781D	# <CJK>
0x6D41	0x7839	# <CJK>
0x6D42	0x783A	# <CJK>
0x6D43	0x783B	# <CJK>
0x6D44	0x781F	# <CJK>
0x6D45	0x783C	# <CJK>
0x6D46	0x7825	# <CJK>
0x6D47	0x782C	# <CJK>
0x6D48	0x7823	# <CJK>
0x6D49	0x7829	# <CJK>
0x6D4A	0x784E	# <CJK>
0x6D4B	0x786D	# <CJK>
0x6D4C	0x7856	# <CJK>
0x6D4D	0x7857	# <CJK>
0x6D4E	0x7826	# <CJK>
0x6D4F	0x7850	# <CJK>
0x6D50	0x7847	# <CJK>
0x6D51	0x784C	# <CJK>
0x6D52	0x786A	# <CJK>
0x6D53	0x789B	# <CJK>
0x6D54	0x7893	# <CJK>
0x6D55	0x789A	# <CJK>
0x6D56	0x7887	# <CJK>
0x6D57	0x789C	# <CJK>
0x6D58	0x78A1	# <CJK>
0x6D59	0x78A3	# <CJK>
0x6D5A	0x78B2	# <CJK>
0x6D5B	0x78B9	# <CJK>
0x6D5C	0x78A5	# <CJK>
0x6D5D	0x78D4	# <CJK>
0x6D5E	0x78D9	# <CJK>
0x6D5F	0x78C9	# <CJK>
0x6D60	0x78EC	# <CJK>
0x6D61	0x78F2	# <CJK>
0x6D62	0x7905	# <CJK>
0x6D63	0x78F4	# <CJK>
0x6D64	0x7913	# <CJK>
0x6D65	0x7924	# <CJK>
0x6D66	0x791E	# <CJK>
0x6D67	0x7934	# <CJK>
0x6D68	0x9F9B	# <CJK>
0x6D69	0x9EF9	# <CJK>
0x6D6A	0x9EFB	# <CJK>
0x6D6B	0x9EFC	# <CJK>
0x6D6C	0x76F1	# <CJK>
0x6D6D	0x7704	# <CJK>
0x6D6E	0x770D	# <CJK>
0x6D6F	0x76F9	# <CJK>
0x6D70	0x7707	# <CJK>
0x6D71	0x7708	# <CJK>
0x6D72	0x771A	# <CJK>
0x6D73	0x7722	# <CJK>
0x6D74	0x7719	# <CJK>
0x6D75	0x772D	# <CJK>
0x6D76	0x7726	# <CJK>
0x6D77	0x7735	# <CJK>
0x6D78	0x7738	# <CJK>
0x6D79	0x7750	# <CJK>
0x6D7A	0x7751	# <CJK>
0x6D7B	0x7747	# <CJK>
0x6D7C	0x7743	# <CJK>
0x6D7D	0x775A	# <CJK>
0x6D7E	0x7768	# <CJK>
0x6E21	0x7762	# <CJK>
0x6E22	0x7765	# <CJK>
0x6E23	0x777F	# <CJK>
0x6E24	0x778D	# <CJK>
0x6E25	0x777D	# <CJK>
0x6E26	0x7780	# <CJK>
0x6E27	0x778C	# <CJK>
0x6E28	0x7791	# <CJK>
0x6E29	0x779F	# <CJK>
0x6E2A	0x77A0	# <CJK>
0x6E2B	0x77B0	# <CJK>
0x6E2C	0x77B5	# <CJK>
0x6E2D	0x77BD	# <CJK>
0x6E2E	0x753A	# <CJK>
0x6E2F	0x7540	# <CJK>
0x6E30	0x754E	# <CJK>
0x6E31	0x754B	# <CJK>
0x6E32	0x7548	# <CJK>
0x6E33	0x755B	# <CJK>
0x6E34	0x7572	# <CJK>
0x6E35	0x7579	# <CJK>
0x6E36	0x7583	# <CJK>
0x6E37	0x7F58	# <CJK>
0x6E38	0x7F61	# <CJK>
0x6E39	0x7F5F	# <CJK>
0x6E3A	0x8A48	# <CJK>
0x6E3B	0x7F68	# <CJK>
0x6E3C	0x7F74	# <CJK>
0x6E3D	0x7F71	# <CJK>
0x6E3E	0x7F79	# <CJK>
0x6E3F	0x7F81	# <CJK>
0x6E40	0x7F7E	# <CJK>
0x6E41	0x76CD	# <CJK>
0x6E42	0x76E5	# <CJK>
0x6E43	0x8832	# <CJK>
0x6E44	0x9485	# <CJK>
0x6E45	0x9486	# <CJK>
0x6E46	0x9487	# <CJK>
0x6E47	0x948B	# <CJK>
0x6E48	0x948A	# <CJK>
0x6E49	0x948C	# <CJK>
0x6E4A	0x948D	# <CJK>
0x6E4B	0x948F	# <CJK>
0x6E4C	0x9490	# <CJK>
0x6E4D	0x9494	# <CJK>
0x6E4E	0x9497	# <CJK>
0x6E4F	0x9495	# <CJK>
0x6E50	0x949A	# <CJK>
0x6E51	0x949B	# <CJK>
0x6E52	0x949C	# <CJK>
0x6E53	0x94A3	# <CJK>
0x6E54	0x94A4	# <CJK>
0x6E55	0x94AB	# <CJK>
0x6E56	0x94AA	# <CJK>
0x6E57	0x94AD	# <CJK>
0x6E58	0x94AC	# <CJK>
0x6E59	0x94AF	# <CJK>
0x6E5A	0x94B0	# <CJK>
0x6E5B	0x94B2	# <CJK>
0x6E5C	0x94B4	# <CJK>
0x6E5D	0x94B6	# <CJK>
0x6E5E	0x94B7	# <CJK>
0x6E5F	0x94B8	# <CJK>
0x6E60	0x94B9	# <CJK>
0x6E61	0x94BA	# <CJK>
0x6E62	0x94BC	# <CJK>
0x6E63	0x94BD	# <CJK>
0x6E64	0x94BF	# <CJK>
0x6E65	0x94C4	# <CJK>
0x6E66	0x94C8	# <CJK>
0x6E67	0x94C9	# <CJK>
0x6E68	0x94CA	# <CJK>
0x6E69	0x94CB	# <CJK>
0x6E6A	0x94CC	# <CJK>
0x6E6B	0x94CD	# <CJK>
0x6E6C	0x94CE	# <CJK>
0x6E6D	0x94D0	# <CJK>
0x6E6E	0x94D1	# <CJK>
0x6E6F	0x94D2	# <CJK>
0x6E70	0x94D5	# <CJK>
0x6E71	0x94D6	# <CJK>
0x6E72	0x94D7	# <CJK>
0x6E73	0x94D9	# <CJK>
0x6E74	0x94D8	# <CJK>
0x6E75	0x94DB	# <CJK>
0x6E76	0x94DE	# <CJK>
0x6E77	0x94DF	# <CJK>
0x6E78	0x94E0	# <CJK>
0x6E79	0x94E2	# <CJK>
0x6E7A	0x94E4	# <CJK>
0x6E7B	0x94E5	# <CJK>
0x6E7C	0x94E7	# <CJK>
0x6E7D	0x94E8	# <CJK>
0x6E7E	0x94EA	# <CJK>
0x6F21	0x94E9	# <CJK>
0x6F22	0x94EB	# <CJK>
0x6F23	0x94EE	# <CJK>
0x6F24	0x94EF	# <CJK>
0x6F25	0x94F3	# <CJK>
0x6F26	0x94F4	# <CJK>
0x6F27	0x94F5	# <CJK>
0x6F28	0x94F7	# <CJK>
0x6F29	0x94F9	# <CJK>
0x6F2A	0x94FC	# <CJK>
0x6F2B	0x94FD	# <CJK>
0x6F2C	0x94FF	# <CJK>
0x6F2D	0x9503	# <CJK>
0x6F2E	0x9502	# <CJK>
0x6F2F	0x9506	# <CJK>
0x6F30	0x9507	# <CJK>
0x6F31	0x9509	# <CJK>
0x6F32	0x950A	# <CJK>
0x6F33	0x950D	# <CJK>
0x6F34	0x950E	# <CJK>
0x6F35	0x950F	# <CJK>
0x6F36	0x9512	# <CJK>
0x6F37	0x9513	# <CJK>
0x6F38	0x9514	# <CJK>
0x6F39	0x9515	# <CJK>
0x6F3A	0x9516	# <CJK>
0x6F3B	0x9518	# <CJK>
0x6F3C	0x951B	# <CJK>
0x6F3D	0x951D	# <CJK>
0x6F3E	0x951E	# <CJK>
0x6F3F	0x951F	# <CJK>
0x6F40	0x9522	# <CJK>
0x6F41	0x952A	# <CJK>
0x6F42	0x952B	# <CJK>
0x6F43	0x9529	# <CJK>
0x6F44	0x952C	# <CJK>
0x6F45	0x9531	# <CJK>
0x6F46	0x9532	# <CJK>
0x6F47	0x9534	# <CJK>
0x6F48	0x9536	# <CJK>
0x6F49	0x9537	# <CJK>
0x6F4A	0x9538	# <CJK>
0x6F4B	0x953C	# <CJK>
0x6F4C	0x953E	# <CJK>
0x6F4D	0x953F	# <CJK>
0x6F4E	0x9542	# <CJK>
0x6F4F	0x9535	# <CJK>
0x6F50	0x9544	# <CJK>
0x6F51	0x9545	# <CJK>
0x6F52	0x9546	# <CJK>
0x6F53	0x9549	# <CJK>
0x6F54	0x954C	# <CJK>
0x6F55	0x954E	# <CJK>
0x6F56	0x954F	# <CJK>
0x6F57	0x9552	# <CJK>
0x6F58	0x9553	# <CJK>
0x6F59	0x9554	# <CJK>
0x6F5A	0x9556	# <CJK>
0x6F5B	0x9557	# <CJK>
0x6F5C	0x9558	# <CJK>
0x6F5D	0x9559	# <CJK>
0x6F5E	0x955B	# <CJK>
0x6F5F	0x955E	# <CJK>
0x6F60	0x955F	# <CJK>
0x6F61	0x955D	# <CJK>
0x6F62	0x9561	# <CJK>
0x6F63	0x9562	# <CJK>
0x6F64	0x9564	# <CJK>
0x6F65	0x9565	# <CJK>
0x6F66	0x9566	# <CJK>
0x6F67	0x9567	# <CJK>
0x6F68	0x9568	# <CJK>
0x6F69	0x9569	# <CJK>
0x6F6A	0x956A	# <CJK>
0x6F6B	0x956B	# <CJK>
0x6F6C	0x956C	# <CJK>
0x6F6D	0x956F	# <CJK>
0x6F6E	0x9571	# <CJK>
0x6F6F	0x9572	# <CJK>
0x6F70	0x9573	# <CJK>
0x6F71	0x953A	# <CJK>
0x6F72	0x77E7	# <CJK>
0x6F73	0x77EC	# <CJK>
0x6F74	0x96C9	# <CJK>
0x6F75	0x79D5	# <CJK>
0x6F76	0x79ED	# <CJK>
0x6F77	0x79E3	# <CJK>
0x6F78	0x79EB	# <CJK>
0x6F79	0x7A06	# <CJK>
0x6F7A	0x5D47	# <CJK>
0x6F7B	0x7A03	# <CJK>
0x6F7C	0x7A02	# <CJK>
0x6F7D	0x7A1E	# <CJK>
0x6F7E	0x7A14	# <CJK>
0x7021	0x7A39	# <CJK>
0x7022	0x7A37	# <CJK>
0x7023	0x7A51	# <CJK>
0x7024	0x9ECF	# <CJK>
0x7025	0x99A5	# <CJK>
0x7026	0x7A70	# <CJK>
0x7027	0x7688	# <CJK>
0x7028	0x768E	# <CJK>
0x7029	0x7693	# <CJK>
0x702A	0x7699	# <CJK>
0x702B	0x76A4	# <CJK>
0x702C	0x74DE	# <CJK>
0x702D	0x74E0	# <CJK>
0x702E	0x752C	# <CJK>
0x702F	0x9E20	# <CJK>
0x7030	0x9E22	# <CJK>
0x7031	0x9E28	# <CJK>
0x7032	0x9E29	# <CJK>
0x7033	0x9E2A	# <CJK>
0x7034	0x9E2B	# <CJK>
0x7035	0x9E2C	# <CJK>
0x7036	0x9E32	# <CJK>
0x7037	0x9E31	# <CJK>
0x7038	0x9E36	# <CJK>
0x7039	0x9E38	# <CJK>
0x703A	0x9E37	# <CJK>
0x703B	0x9E39	# <CJK>
0x703C	0x9E3A	# <CJK>
0x703D	0x9E3E	# <CJK>
0x703E	0x9E41	# <CJK>
0x703F	0x9E42	# <CJK>
0x7040	0x9E44	# <CJK>
0x7041	0x9E46	# <CJK>
0x7042	0x9E47	# <CJK>
0x7043	0x9E48	# <CJK>
0x7044	0x9E49	# <CJK>
0x7045	0x9E4B	# <CJK>
0x7046	0x9E4C	# <CJK>
0x7047	0x9E4E	# <CJK>
0x7048	0x9E51	# <CJK>
0x7049	0x9E55	# <CJK>
0x704A	0x9E57	# <CJK>
0x704B	0x9E5A	# <CJK>
0x704C	0x9E5B	# <CJK>
0x704D	0x9E5C	# <CJK>
0x704E	0x9E5E	# <CJK>
0x704F	0x9E63	# <CJK>
0x7050	0x9E66	# <CJK>
0x7051	0x9E67	# <CJK>
0x7052	0x9E68	# <CJK>
0x7053	0x9E69	# <CJK>
0x7054	0x9E6A	# <CJK>
0x7055	0x9E6B	# <CJK>
0x7056	0x9E6C	# <CJK>
0x7057	0x9E71	# <CJK>
0x7058	0x9E6D	# <CJK>
0x7059	0x9E73	# <CJK>
0x705A	0x7592	# <CJK>
0x705B	0x7594	# <CJK>
0x705C	0x7596	# <CJK>
0x705D	0x75A0	# <CJK>
0x705E	0x759D	# <CJK>
0x705F	0x75AC	# <CJK>
0x7060	0x75A3	# <CJK>
0x7061	0x75B3	# <CJK>
0x7062	0x75B4	# <CJK>
0x7063	0x75B8	# <CJK>
0x7064	0x75C4	# <CJK>
0x7065	0x75B1	# <CJK>
0x7066	0x75B0	# <CJK>
0x7067	0x75C3	# <CJK>
0x7068	0x75C2	# <CJK>
0x7069	0x75D6	# <CJK>
0x706A	0x75CD	# <CJK>
0x706B	0x75E3	# <CJK>
0x706C	0x75E8	# <CJK>
0x706D	0x75E6	# <CJK>
0x706E	0x75E4	# <CJK>
0x706F	0x75EB	# <CJK>
0x7070	0x75E7	# <CJK>
0x7071	0x7603	# <CJK>
0x7072	0x75F1	# <CJK>
0x7073	0x75FC	# <CJK>
0x7074	0x75FF	# <CJK>
0x7075	0x7610	# <CJK>
0x7076	0x7600	# <CJK>
0x7077	0x7605	# <CJK>
0x7078	0x760C	# <CJK>
0x7079	0x7617	# <CJK>
0x707A	0x760A	# <CJK>
0x707B	0x7625	# <CJK>
0x707C	0x7618	# <CJK>
0x707D	0x7615	# <CJK>
0x707E	0x7619	# <CJK>
0x7121	0x761B	# <CJK>
0x7122	0x763C	# <CJK>
0x7123	0x7622	# <CJK>
0x7124	0x7620	# <CJK>
0x7125	0x7640	# <CJK>
0x7126	0x762D	# <CJK>
0x7127	0x7630	# <CJK>
0x7128	0x763F	# <CJK>
0x7129	0x7635	# <CJK>
0x712A	0x7643	# <CJK>
0x712B	0x763E	# <CJK>
0x712C	0x7633	# <CJK>
0x712D	0x764D	# <CJK>
0x712E	0x765E	# <CJK>
0x712F	0x7654	# <CJK>
0x7130	0x765C	# <CJK>
0x7131	0x7656	# <CJK>
0x7132	0x766B	# <CJK>
0x7133	0x766F	# <CJK>
0x7134	0x7FCA	# <CJK>
0x7135	0x7AE6	# <CJK>
0x7136	0x7A78	# <CJK>
0x7137	0x7A79	# <CJK>
0x7138	0x7A80	# <CJK>
0x7139	0x7A86	# <CJK>
0x713A	0x7A88	# <CJK>
0x713B	0x7A95	# <CJK>
0x713C	0x7AA6	# <CJK>
0x713D	0x7AA0	# <CJK>
0x713E	0x7AAC	# <CJK>
0x713F	0x7AA8	# <CJK>
0x7140	0x7AAD	# <CJK>
0x7141	0x7AB3	# <CJK>
0x7142	0x8864	# <CJK>
0x7143	0x8869	# <CJK>
0x7144	0x8872	# <CJK>
0x7145	0x887D	# <CJK>
0x7146	0x887F	# <CJK>
0x7147	0x8882	# <CJK>
0x7148	0x88A2	# <CJK>
0x7149	0x88C6	# <CJK>
0x714A	0x88B7	# <CJK>
0x714B	0x88BC	# <CJK>
0x714C	0x88C9	# <CJK>
0x714D	0x88E2	# <CJK>
0x714E	0x88CE	# <CJK>
0x714F	0x88E3	# <CJK>
0x7150	0x88E5	# <CJK>
0x7151	0x88F1	# <CJK>
0x7152	0x891A	# <CJK>
0x7153	0x88FC	# <CJK>
0x7154	0x88E8	# <CJK>
0x7155	0x88FE	# <CJK>
0x7156	0x88F0	# <CJK>
0x7157	0x8921	# <CJK>
0x7158	0x8919	# <CJK>
0x7159	0x8913	# <CJK>
0x715A	0x891B	# <CJK>
0x715B	0x890A	# <CJK>
0x715C	0x8934	# <CJK>
0x715D	0x892B	# <CJK>
0x715E	0x8936	# <CJK>
0x715F	0x8941	# <CJK>
0x7160	0x8966	# <CJK>
0x7161	0x897B	# <CJK>
0x7162	0x758B	# <CJK>
0x7163	0x80E5	# <CJK>
0x7164	0x76B2	# <CJK>
0x7165	0x76B4	# <CJK>
0x7166	0x77DC	# <CJK>
0x7167	0x8012	# <CJK>
0x7168	0x8014	# <CJK>
0x7169	0x8016	# <CJK>
0x716A	0x801C	# <CJK>
0x716B	0x8020	# <CJK>
0x716C	0x8022	# <CJK>
0x716D	0x8025	# <CJK>
0x716E	0x8026	# <CJK>
0x716F	0x8027	# <CJK>
0x7170	0x8029	# <CJK>
0x7171	0x8028	# <CJK>
0x7172	0x8031	# <CJK>
0x7173	0x800B	# <CJK>
0x7174	0x8035	# <CJK>
0x7175	0x8043	# <CJK>
0x7176	0x8046	# <CJK>
0x7177	0x804D	# <CJK>
0x7178	0x8052	# <CJK>
0x7179	0x8069	# <CJK>
0x717A	0x8071	# <CJK>
0x717B	0x8983	# <CJK>
0x717C	0x9878	# <CJK>
0x717D	0x9880	# <CJK>
0x717E	0x9883	# <CJK>
0x7221	0x9889	# <CJK>
0x7222	0x988C	# <CJK>
0x7223	0x988D	# <CJK>
0x7224	0x988F	# <CJK>
0x7225	0x9894	# <CJK>
0x7226	0x989A	# <CJK>
0x7227	0x989B	# <CJK>
0x7228	0x989E	# <CJK>
0x7229	0x989F	# <CJK>
0x722A	0x98A1	# <CJK>
0x722B	0x98A2	# <CJK>
0x722C	0x98A5	# <CJK>
0x722D	0x98A6	# <CJK>
0x722E	0x864D	# <CJK>
0x722F	0x8654	# <CJK>
0x7230	0x866C	# <CJK>
0x7231	0x866E	# <CJK>
0x7232	0x867F	# <CJK>
0x7233	0x867A	# <CJK>
0x7234	0x867C	# <CJK>
0x7235	0x867B	# <CJK>
0x7236	0x86A8	# <CJK>
0x7237	0x868D	# <CJK>
0x7238	0x868B	# <CJK>
0x7239	0x86AC	# <CJK>
0x723A	0x869D	# <CJK>
0x723B	0x86A7	# <CJK>
0x723C	0x86A3	# <CJK>
0x723D	0x86AA	# <CJK>
0x723E	0x8693	# <CJK>
0x723F	0x86A9	# <CJK>
0x7240	0x86B6	# <CJK>
0x7241	0x86C4	# <CJK>
0x7242	0x86B5	# <CJK>
0x7243	0x86CE	# <CJK>
0x7244	0x86B0	# <CJK>
0x7245	0x86BA	# <CJK>
0x7246	0x86B1	# <CJK>
0x7247	0x86AF	# <CJK>
0x7248	0x86C9	# <CJK>
0x7249	0x86CF	# <CJK>
0x724A	0x86B4	# <CJK>
0x724B	0x86E9	# <CJK>
0x724C	0x86F1	# <CJK>
0x724D	0x86F2	# <CJK>
0x724E	0x86ED	# <CJK>
0x724F	0x86F3	# <CJK>
0x7250	0x86D0	# <CJK>
0x7251	0x8713	# <CJK>
0x7252	0x86DE	# <CJK>
0x7253	0x86F4	# <CJK>
0x7254	0x86DF	# <CJK>
0x7255	0x86D8	# <CJK>
0x7256	0x86D1	# <CJK>
0x7257	0x8703	# <CJK>
0x7258	0x8707	# <CJK>
0x7259	0x86F8	# <CJK>
0x725A	0x8708	# <CJK>
0x725B	0x870A	# <CJK>
0x725C	0x870D	# <CJK>
0x725D	0x8709	# <CJK>
0x725E	0x8723	# <CJK>
0x725F	0x873B	# <CJK>
0x7260	0x871E	# <CJK>
0x7261	0x8725	# <CJK>
0x7262	0x872E	# <CJK>
0x7263	0x871A	# <CJK>
0x7264	0x873E	# <CJK>
0x7265	0x8748	# <CJK>
0x7266	0x8734	# <CJK>
0x7267	0x8731	# <CJK>
0x7268	0x8729	# <CJK>
0x7269	0x8737	# <CJK>
0x726A	0x873F	# <CJK>
0x726B	0x8782	# <CJK>
0x726C	0x8722	# <CJK>
0x726D	0x877D	# <CJK>
0x726E	0x877E	# <CJK>
0x726F	0x877B	# <CJK>
0x7270	0x8760	# <CJK>
0x7271	0x8770	# <CJK>
0x7272	0x874C	# <CJK>
0x7273	0x876E	# <CJK>
0x7274	0x878B	# <CJK>
0x7275	0x8753	# <CJK>
0x7276	0x8763	# <CJK>
0x7277	0x877C	# <CJK>
0x7278	0x8764	# <CJK>
0x7279	0x8759	# <CJK>
0x727A	0x8765	# <CJK>
0x727B	0x8793	# <CJK>
0x727C	0x87AF	# <CJK>
0x727D	0x87A8	# <CJK>
0x727E	0x87D2	# <CJK>
0x7321	0x87C6	# <CJK>
0x7322	0x8788	# <CJK>
0x7323	0x8785	# <CJK>
0x7324	0x87AD	# <CJK>
0x7325	0x8797	# <CJK>
0x7326	0x8783	# <CJK>
0x7327	0x87AB	# <CJK>
0x7328	0x87E5	# <CJK>
0x7329	0x87AC	# <CJK>
0x732A	0x87B5	# <CJK>
0x732B	0x87B3	# <CJK>
0x732C	0x87CB	# <CJK>
0x732D	0x87D3	# <CJK>
0x732E	0x87BD	# <CJK>
0x732F	0x87D1	# <CJK>
0x7330	0x87C0	# <CJK>
0x7331	0x87CA	# <CJK>
0x7332	0x87DB	# <CJK>
0x7333	0x87EA	# <CJK>
0x7334	0x87E0	# <CJK>
0x7335	0x87EE	# <CJK>
0x7336	0x8816	# <CJK>
0x7337	0x8813	# <CJK>
0x7338	0x87FE	# <CJK>
0x7339	0x880A	# <CJK>
0x733A	0x881B	# <CJK>
0x733B	0x8821	# <CJK>
0x733C	0x8839	# <CJK>
0x733D	0x883C	# <CJK>
0x733E	0x7F36	# <CJK>
0x733F	0x7F42	# <CJK>
0x7340	0x7F44	# <CJK>
0x7341	0x7F45	# <CJK>
0x7342	0x8210	# <CJK>
0x7343	0x7AFA	# <CJK>
0x7344	0x7AFD	# <CJK>
0x7345	0x7B08	# <CJK>
0x7346	0x7B03	# <CJK>
0x7347	0x7B04	# <CJK>
0x7348	0x7B15	# <CJK>
0x7349	0x7B0A	# <CJK>
0x734A	0x7B2B	# <CJK>
0x734B	0x7B0F	# <CJK>
0x734C	0x7B47	# <CJK>
0x734D	0x7B38	# <CJK>
0x734E	0x7B2A	# <CJK>
0x734F	0x7B19	# <CJK>
0x7350	0x7B2E	# <CJK>
0x7351	0x7B31	# <CJK>
0x7352	0x7B20	# <CJK>
0x7353	0x7B25	# <CJK>
0x7354	0x7B24	# <CJK>
0x7355	0x7B33	# <CJK>
0x7356	0x7B3E	# <CJK>
0x7357	0x7B1E	# <CJK>
0x7358	0x7B58	# <CJK>
0x7359	0x7B5A	# <CJK>
0x735A	0x7B45	# <CJK>
0x735B	0x7B75	# <CJK>
0x735C	0x7B4C	# <CJK>
0x735D	0x7B5D	# <CJK>
0x735E	0x7B60	# <CJK>
0x735F	0x7B6E	# <CJK>
0x7360	0x7B7B	# <CJK>
0x7361	0x7B62	# <CJK>
0x7362	0x7B72	# <CJK>
0x7363	0x7B71	# <CJK>
0x7364	0x7B90	# <CJK>
0x7365	0x7BA6	# <CJK>
0x7366	0x7BA7	# <CJK>
0x7367	0x7BB8	# <CJK>
0x7368	0x7BAC	# <CJK>
0x7369	0x7B9D	# <CJK>
0x736A	0x7BA8	# <CJK>
0x736B	0x7B85	# <CJK>
0x736C	0x7BAA	# <CJK>
0x736D	0x7B9C	# <CJK>
0x736E	0x7BA2	# <CJK>
0x736F	0x7BAB	# <CJK>
0x7370	0x7BB4	# <CJK>
0x7371	0x7BD1	# <CJK>
0x7372	0x7BC1	# <CJK>
0x7373	0x7BCC	# <CJK>
0x7374	0x7BDD	# <CJK>
0x7375	0x7BDA	# <CJK>
0x7376	0x7BE5	# <CJK>
0x7377	0x7BE6	# <CJK>
0x7378	0x7BEA	# <CJK>
0x7379	0x7C0C	# <CJK>
0x737A	0x7BFE	# <CJK>
0x737B	0x7BFC	# <CJK>
0x737C	0x7C0F	# <CJK>
0x737D	0x7C16	# <CJK>
0x737E	0x7C0B	# <CJK>
0x7421	0x7C1F	# <CJK>
0x7422	0x7C2A	# <CJK>
0x7423	0x7C26	# <CJK>
0x7424	0x7C38	# <CJK>
0x7425	0x7C41	# <CJK>
0x7426	0x7C40	# <CJK>
0x7427	0x81FE	# <CJK>
0x7428	0x8201	# <CJK>
0x7429	0x8202	# <CJK>
0x742A	0x8204	# <CJK>
0x742B	0x81EC	# <CJK>
0x742C	0x8844	# <CJK>
0x742D	0x8221	# <CJK>
0x742E	0x8222	# <CJK>
0x742F	0x8223	# <CJK>
0x7430	0x822D	# <CJK>
0x7431	0x822F	# <CJK>
0x7432	0x8228	# <CJK>
0x7433	0x822B	# <CJK>
0x7434	0x8238	# <CJK>
0x7435	0x823B	# <CJK>
0x7436	0x8233	# <CJK>
0x7437	0x8234	# <CJK>
0x7438	0x823E	# <CJK>
0x7439	0x8244	# <CJK>
0x743A	0x8249	# <CJK>
0x743B	0x824B	# <CJK>
0x743C	0x824F	# <CJK>
0x743D	0x825A	# <CJK>
0x743E	0x825F	# <CJK>
0x743F	0x8268	# <CJK>
0x7440	0x887E	# <CJK>
0x7441	0x8885	# <CJK>
0x7442	0x8888	# <CJK>
0x7443	0x88D8	# <CJK>
0x7444	0x88DF	# <CJK>
0x7445	0x895E	# <CJK>
0x7446	0x7F9D	# <CJK>
0x7447	0x7F9F	# <CJK>
0x7448	0x7FA7	# <CJK>
0x7449	0x7FAF	# <CJK>
0x744A	0x7FB0	# <CJK>
0x744B	0x7FB2	# <CJK>
0x744C	0x7C7C	# <CJK>
0x744D	0x6549	# <CJK>
0x744E	0x7C91	# <CJK>
0x744F	0x7C9D	# <CJK>
0x7450	0x7C9C	# <CJK>
0x7451	0x7C9E	# <CJK>
0x7452	0x7CA2	# <CJK>
0x7453	0x7CB2	# <CJK>
0x7454	0x7CBC	# <CJK>
0x7455	0x7CBD	# <CJK>
0x7456	0x7CC1	# <CJK>
0x7457	0x7CC7	# <CJK>
0x7458	0x7CCC	# <CJK>
0x7459	0x7CCD	# <CJK>
0x745A	0x7CC8	# <CJK>
0x745B	0x7CC5	# <CJK>
0x745C	0x7CD7	# <CJK>
0x745D	0x7CE8	# <CJK>
0x745E	0x826E	# <CJK>
0x745F	0x66A8	# <CJK>
0x7460	0x7FBF	# <CJK>
0x7461	0x7FCE	# <CJK>
0x7462	0x7FD5	# <CJK>
0x7463	0x7FE5	# <CJK>
0x7464	0x7FE1	# <CJK>
0x7465	0x7FE6	# <CJK>
0x7466	0x7FE9	# <CJK>
0x7467	0x7FEE	# <CJK>
0x7468	0x7FF3	# <CJK>
0x7469	0x7CF8	# <CJK>
0x746A	0x7D77	# <CJK>
0x746B	0x7DA6	# <CJK>
0x746C	0x7DAE	# <CJK>
0x746D	0x7E47	# <CJK>
0x746E	0x7E9B	# <CJK>
0x746F	0x9EB8	# <CJK>
0x7470	0x9EB4	# <CJK>
0x7471	0x8D73	# <CJK>
0x7472	0x8D84	# <CJK>
0x7473	0x8D94	# <CJK>
0x7474	0x8D91	# <CJK>
0x7475	0x8DB1	# <CJK>
0x7476	0x8D67	# <CJK>
0x7477	0x8D6D	# <CJK>
0x7478	0x8C47	# <CJK>
0x7479	0x8C49	# <CJK>
0x747A	0x914A	# <CJK>
0x747B	0x9150	# <CJK>
0x747C	0x914E	# <CJK>
0x747D	0x914F	# <CJK>
0x747E	0x9164	# <CJK>
0x7521	0x9162	# <CJK>
0x7522	0x9161	# <CJK>
0x7523	0x9170	# <CJK>
0x7524	0x9169	# <CJK>
0x7525	0x916F	# <CJK>
0x7526	0x917D	# <CJK>
0x7527	0x917E	# <CJK>
0x7528	0x9172	# <CJK>
0x7529	0x9174	# <CJK>
0x752A	0x9179	# <CJK>
0x752B	0x918C	# <CJK>
0x752C	0x9185	# <CJK>
0x752D	0x9190	# <CJK>
0x752E	0x918D	# <CJK>
0x752F	0x9191	# <CJK>
0x7530	0x91A2	# <CJK>
0x7531	0x91A3	# <CJK>
0x7532	0x91AA	# <CJK>
0x7533	0x91AD	# <CJK>
0x7534	0x91AE	# <CJK>
0x7535	0x91AF	# <CJK>
0x7536	0x91B5	# <CJK>
0x7537	0x91B4	# <CJK>
0x7538	0x91BA	# <CJK>
0x7539	0x8C55	# <CJK>
0x753A	0x9E7E	# <CJK>
0x753B	0x8DB8	# <CJK>
0x753C	0x8DEB	# <CJK>
0x753D	0x8E05	# <CJK>
0x753E	0x8E59	# <CJK>
0x753F	0x8E69	# <CJK>
0x7540	0x8DB5	# <CJK>
0x7541	0x8DBF	# <CJK>
0x7542	0x8DBC	# <CJK>
0x7543	0x8DBA	# <CJK>
0x7544	0x8DC4	# <CJK>
0x7545	0x8DD6	# <CJK>
0x7546	0x8DD7	# <CJK>
0x7547	0x8DDA	# <CJK>
0x7548	0x8DDE	# <CJK>
0x7549	0x8DCE	# <CJK>
0x754A	0x8DCF	# <CJK>
0x754B	0x8DDB	# <CJK>
0x754C	0x8DC6	# <CJK>
0x754D	0x8DEC	# <CJK>
0x754E	0x8DF7	# <CJK>
0x754F	0x8DF8	# <CJK>
0x7550	0x8DE3	# <CJK>
0x7551	0x8DF9	# <CJK>
0x7552	0x8DFB	# <CJK>
0x7553	0x8DE4	# <CJK>
0x7554	0x8E09	# <CJK>
0x7555	0x8DFD	# <CJK>
0x7556	0x8E14	# <CJK>
0x7557	0x8E1D	# <CJK>
0x7558	0x8E1F	# <CJK>
0x7559	0x8E2C	# <CJK>
0x755A	0x8E2E	# <CJK>
0x755B	0x8E23	# <CJK>
0x755C	0x8E2F	# <CJK>
0x755D	0x8E3A	# <CJK>
0x755E	0x8E40	# <CJK>
0x755F	0x8E39	# <CJK>
0x7560	0x8E35	# <CJK>
0x7561	0x8E3D	# <CJK>
0x7562	0x8E31	# <CJK>
0x7563	0x8E49	# <CJK>
0x7564	0x8E41	# <CJK>
0x7565	0x8E42	# <CJK>
0x7566	0x8E51	# <CJK>
0x7567	0x8E52	# <CJK>
0x7568	0x8E4A	# <CJK>
0x7569	0x8E70	# <CJK>
0x756A	0x8E76	# <CJK>
0x756B	0x8E7C	# <CJK>
0x756C	0x8E6F	# <CJK>
0x756D	0x8E74	# <CJK>
0x756E	0x8E85	# <CJK>
0x756F	0x8E8F	# <CJK>
0x7570	0x8E94	# <CJK>
0x7571	0x8E90	# <CJK>
0x7572	0x8E9C	# <CJK>
0x7573	0x8E9E	# <CJK>
0x7574	0x8C78	# <CJK>
0x7575	0x8C82	# <CJK>
0x7576	0x8C8A	# <CJK>
0x7577	0x8C85	# <CJK>
0x7578	0x8C98	# <CJK>
0x7579	0x8C94	# <CJK>
0x757A	0x659B	# <CJK>
0x757B	0x89D6	# <CJK>
0x757C	0x89DE	# <CJK>
0x757D	0x89DA	# <CJK>
0x757E	0x89DC	# <CJK>
0x7621	0x89E5	# <CJK>
0x7622	0x89EB	# <CJK>
0x7623	0x89EF	# <CJK>
0x7624	0x8A3E	# <CJK>
0x7625	0x8B26	# <CJK>
0x7626	0x9753	# <CJK>
0x7627	0x96E9	# <CJK>
0x7628	0x96F3	# <CJK>
0x7629	0x96EF	# <CJK>
0x762A	0x9706	# <CJK>
0x762B	0x9701	# <CJK>
0x762C	0x9708	# <CJK>
0x762D	0x970F	# <CJK>
0x762E	0x970E	# <CJK>
0x762F	0x972A	# <CJK>
0x7630	0x972D	# <CJK>
0x7631	0x9730	# <CJK>
0x7632	0x973E	# <CJK>
0x7633	0x9F80	# <CJK>
0x7634	0x9F83	# <CJK>
0x7635	0x9F85	# <CJK>
0x7636	0x9F86	# <CJK>
0x7637	0x9F87	# <CJK>
0x7638	0x9F88	# <CJK>
0x7639	0x9F89	# <CJK>
0x763A	0x9F8A	# <CJK>
0x763B	0x9F8C	# <CJK>
0x763C	0x9EFE	# <CJK>
0x763D	0x9F0B	# <CJK>
0x763E	0x9F0D	# <CJK>
0x763F	0x96B9	# <CJK>
0x7640	0x96BC	# <CJK>
0x7641	0x96BD	# <CJK>
0x7642	0x96CE	# <CJK>
0x7643	0x96D2	# <CJK>
0x7644	0x77BF	# <CJK>
0x7645	0x96E0	# <CJK>
0x7646	0x928E	# <CJK>
0x7647	0x92AE	# <CJK>
0x7648	0x92C8	# <CJK>
0x7649	0x933E	# <CJK>
0x764A	0x936A	# <CJK>
0x764B	0x93CA	# <CJK>
0x764C	0x938F	# <CJK>
0x764D	0x943E	# <CJK>
0x764E	0x946B	# <CJK>
0x764F	0x9C7F	# <CJK>
0x7650	0x9C82	# <CJK>
0x7651	0x9C85	# <CJK>
0x7652	0x9C86	# <CJK>
0x7653	0x9C87	# <CJK>
0x7654	0x9C88	# <CJK>
0x7655	0x7A23	# <CJK>
0x7656	0x9C8B	# <CJK>
0x7657	0x9C8E	# <CJK>
0x7658	0x9C90	# <CJK>
0x7659	0x9C91	# <CJK>
0x765A	0x9C92	# <CJK>
0x765B	0x9C94	# <CJK>
0x765C	0x9C95	# <CJK>
0x765D	0x9C9A	# <CJK>
0x765E	0x9C9B	# <CJK>
0x765F	0x9C9E	# <CJK>
0x7660	0x9C9F	# <CJK>
0x7661	0x9CA0	# <CJK>
0x7662	0x9CA1	# <CJK>
0x7663	0x9CA2	# <CJK>
0x7664	0x9CA3	# <CJK>
0x7665	0x9CA5	# <CJK>
0x7666	0x9CA6	# <CJK>
0x7667	0x9CA7	# <CJK>
0x7668	0x9CA8	# <CJK>
0x7669	0x9CA9	# <CJK>
0x766A	0x9CAB	# <CJK>
0x766B	0x9CAD	# <CJK>
0x766C	0x9CAE	# <CJK>
0x766D	0x9CB0	# <CJK>
0x766E	0x9CB1	# <CJK>
0x766F	0x9CB2	# <CJK>
0x7670	0x9CB3	# <CJK>
0x7671	0x9CB4	# <CJK>
0x7672	0x9CB5	# <CJK>
0x7673	0x9CB6	# <CJK>
0x7674	0x9CB7	# <CJK>
0x7675	0x9CBA	# <CJK>
0x7676	0x9CBB	# <CJK>
0x7677	0x9CBC	# <CJK>
0x7678	0x9CBD	# <CJK>
0x7679	0x9CC4	# <CJK>
0x767A	0x9CC5	# <CJK>
0x767B	0x9CC6	# <CJK>
0x767C	0x9CC7	# <CJK>
0x767D	0x9CCA	# <CJK>
0x767E	0x9CCB	# <CJK>
0x7721	0x9CCC	# <CJK>
0x7722	0x9CCD	# <CJK>
0x7723	0x9CCE	# <CJK>
0x7724	0x9CCF	# <CJK>
0x7725	0x9CD0	# <CJK>
0x7726	0x9CD3	# <CJK>
0x7727	0x9CD4	# <CJK>
0x7728	0x9CD5	# <CJK>
0x7729	0x9CD7	# <CJK>
0x772A	0x9CD8	# <CJK>
0x772B	0x9CD9	# <CJK>
0x772C	0x9CDC	# <CJK>
0x772D	0x9CDD	# <CJK>
0x772E	0x9CDF	# <CJK>
0x772F	0x9CE2	# <CJK>
0x7730	0x977C	# <CJK>
0x7731	0x9785	# <CJK>
0x7732	0x9791	# <CJK>
0x7733	0x9792	# <CJK>
0x7734	0x9794	# <CJK>
0x7735	0x97AF	# <CJK>
0x7736	0x97AB	# <CJK>
0x7737	0x97A3	# <CJK>
0x7738	0x97B2	# <CJK>
0x7739	0x97B4	# <CJK>
0x773A	0x9AB1	# <CJK>
0x773B	0x9AB0	# <CJK>
0x773C	0x9AB7	# <CJK>
0x773D	0x9E58	# <CJK>
0x773E	0x9AB6	# <CJK>
0x773F	0x9ABA	# <CJK>
0x7740	0x9ABC	# <CJK>
0x7741	0x9AC1	# <CJK>
0x7742	0x9AC0	# <CJK>
0x7743	0x9AC5	# <CJK>
0x7744	0x9AC2	# <CJK>
0x7745	0x9ACB	# <CJK>
0x7746	0x9ACC	# <CJK>
0x7747	0x9AD1	# <CJK>
0x7748	0x9B45	# <CJK>
0x7749	0x9B43	# <CJK>
0x774A	0x9B47	# <CJK>
0x774B	0x9B49	# <CJK>
0x774C	0x9B48	# <CJK>
0x774D	0x9B4D	# <CJK>
0x774E	0x9B51	# <CJK>
0x774F	0x98E8	# <CJK>
0x7750	0x990D	# <CJK>
0x7751	0x992E	# <CJK>
0x7752	0x9955	# <CJK>
0x7753	0x9954	# <CJK>
0x7754	0x9ADF	# <CJK>
0x7755	0x9AE1	# <CJK>
0x7756	0x9AE6	# <CJK>
0x7757	0x9AEF	# <CJK>
0x7758	0x9AEB	# <CJK>
0x7759	0x9AFB	# <CJK>
0x775A	0x9AED	# <CJK>
0x775B	0x9AF9	# <CJK>
0x775C	0x9B08	# <CJK>
0x775D	0x9B0F	# <CJK>
0x775E	0x9B13	# <CJK>
0x775F	0x9B1F	# <CJK>
0x7760	0x9B23	# <CJK>
0x7761	0x9EBD	# <CJK>
0x7762	0x9EBE	# <CJK>
0x7763	0x7E3B	# <CJK>
0x7764	0x9E82	# <CJK>
0x7765	0x9E87	# <CJK>
0x7766	0x9E88	# <CJK>
0x7767	0x9E8B	# <CJK>
0x7768	0x9E92	# <CJK>
0x7769	0x93D6	# <CJK>
0x776A	0x9E9D	# <CJK>
0x776B	0x9E9F	# <CJK>
0x776C	0x9EDB	# <CJK>
0x776D	0x9EDC	# <CJK>
0x776E	0x9EDD	# <CJK>
0x776F	0x9EE0	# <CJK>
0x7770	0x9EDF	# <CJK>
0x7771	0x9EE2	# <CJK>
0x7772	0x9EE9	# <CJK>
0x7773	0x9EE7	# <CJK>
0x7774	0x9EE5	# <CJK>
0x7775	0x9EEA	# <CJK>
0x7776	0x9EEF	# <CJK>
0x7777	0x9F22	# <CJK>
0x7778	0x9F2C	# <CJK>
0x7779	0x9F2F	# <CJK>
0x777A	0x9F39	# <CJK>
0x777B	0x9F37	# <CJK>
0x777C	0x9F3D	# <CJK>
0x777D	0x9F3E	# <CJK>
0x777E	0x9F44	# <CJK>
Added jni/zint/backend/tests/tools/data/SHIFTJIS.TXT.


















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227
5228
5229
5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322
5323
5324
5325
5326
5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393
5394
5395
5396
5397
5398
5399
5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518
5519
5520
5521
5522
5523
5524
5525
5526
5527
5528
5529
5530
5531
5532
5533
5534
5535
5536
5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625
5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670
5671
5672
5673
5674
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
5690
5691
5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726
5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748
5749
5750
5751
5752
5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817
5818
5819
5820
5821
5822
5823
5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835
5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
6247
6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
# SHIFTJIS.TXT
# Date: 2015-12-02 23:52:00 GMT [KW]
# © 2015 Unicode®, Inc.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
#	Name:             Shift-JIS to Unicode
#	Unicode version:  1.1
#	Table version:    2.0
#	Table format:     Format A
#	Date:             2011 October 14 (header updated: 2015 December 02)
#
#	General notes:
#
#
# This table contains one set of mappings from Shift-JIS into Unicode.
# Note that these data are *possible* mappings only and may not be the
# same as those used by actual products, nor may they be the best suited
# for all uses.  For more information on the mappings between various code
# pages incorporating the repertoire of Shift-JIS and Unicode, consult the
# VENDORS mapping data.
#
#
#	Format:  Three tab-separated columns
#		 Column #1 is the shift-JIS code (in hex)
#		 Column #2 is the Unicode (in hex as 0xXXXX)
#		 Column #3 the Unicode name (follows a comment sign, '#')
#			The official names for Unicode characters U+4E00
#			to U+9FA5, inclusive, is "CJK UNIFIED IDEOGRAPH-XXXX",
#			where XXXX is the code point.  Including all these
#			names in this file increases its size substantially
#			and needlessly.  The token "<CJK>" is used for the
#			name of these characters.  If necessary, it can be
#			expanded algorithmically by a parser or editor.
#
#	The entries are ordered by their Shift-JIS codes as follows:
#		Single-byte characters precede double-byte characters
#		The single-byte and double-byte blocks are in ascending
#		hexadecimal order
#	There is an alternative order some people might be preferred,
#		where all the entries are in order of the top (or only) byte.
#		This alternate order can be generated from the one given here
#		by a simple sort.  
#
#  Revision History:
#
#    [v2.0, 2015 December 02]
#    updates to copyright notice and terms of use
#    no changes to character mappings
#
#    [v1.0, 2011 October 14]
#    Updated terms of use to current wording.
#    Updated contact information.
#    No changes to the mapping data.
#
#    [v0.9, 8 March 1994]
#    First release.
#
#  Use the Unicode reporting form <http://www.unicode.org/reporting.html>
#    for any questions or comments or to report errors in the data.
#
0x20	0x0020	# SPACE
0x21	0x0021	# EXCLAMATION MARK
0x22	0x0022	# QUOTATION MARK
0x23	0x0023	# NUMBER SIGN
0x24	0x0024	# DOLLAR SIGN
0x25	0x0025	# PERCENT SIGN
0x26	0x0026	# AMPERSAND
0x27	0x0027	# APOSTROPHE
0x28	0x0028	# LEFT PARENTHESIS
0x29	0x0029	# RIGHT PARENTHESIS
0x2A	0x002A	# ASTERISK
0x2B	0x002B	# PLUS SIGN
0x2C	0x002C	# COMMA
0x2D	0x002D	# HYPHEN-MINUS
0x2E	0x002E	# FULL STOP
0x2F	0x002F	# SOLIDUS
0x30	0x0030	# DIGIT ZERO
0x31	0x0031	# DIGIT ONE
0x32	0x0032	# DIGIT TWO
0x33	0x0033	# DIGIT THREE
0x34	0x0034	# DIGIT FOUR
0x35	0x0035	# DIGIT FIVE
0x36	0x0036	# DIGIT SIX
0x37	0x0037	# DIGIT SEVEN
0x38	0x0038	# DIGIT EIGHT
0x39	0x0039	# DIGIT NINE
0x3A	0x003A	# COLON
0x3B	0x003B	# SEMICOLON
0x3C	0x003C	# LESS-THAN SIGN
0x3D	0x003D	# EQUALS SIGN
0x3E	0x003E	# GREATER-THAN SIGN
0x3F	0x003F	# QUESTION MARK
0x40	0x0040	# COMMERCIAL AT
0x41	0x0041	# LATIN CAPITAL LETTER A
0x42	0x0042	# LATIN CAPITAL LETTER B
0x43	0x0043	# LATIN CAPITAL LETTER C
0x44	0x0044	# LATIN CAPITAL LETTER D
0x45	0x0045	# LATIN CAPITAL LETTER E
0x46	0x0046	# LATIN CAPITAL LETTER F
0x47	0x0047	# LATIN CAPITAL LETTER G
0x48	0x0048	# LATIN CAPITAL LETTER H
0x49	0x0049	# LATIN CAPITAL LETTER I
0x4A	0x004A	# LATIN CAPITAL LETTER J
0x4B	0x004B	# LATIN CAPITAL LETTER K
0x4C	0x004C	# LATIN CAPITAL LETTER L
0x4D	0x004D	# LATIN CAPITAL LETTER M
0x4E	0x004E	# LATIN CAPITAL LETTER N
0x4F	0x004F	# LATIN CAPITAL LETTER O
0x50	0x0050	# LATIN CAPITAL LETTER P
0x51	0x0051	# LATIN CAPITAL LETTER Q
0x52	0x0052	# LATIN CAPITAL LETTER R
0x53	0x0053	# LATIN CAPITAL LETTER S
0x54	0x0054	# LATIN CAPITAL LETTER T
0x55	0x0055	# LATIN CAPITAL LETTER U
0x56	0x0056	# LATIN CAPITAL LETTER V
0x57	0x0057	# LATIN CAPITAL LETTER W
0x58	0x0058	# LATIN CAPITAL LETTER X
0x59	0x0059	# LATIN CAPITAL LETTER Y
0x5A	0x005A	# LATIN CAPITAL LETTER Z
0x5B	0x005B	# LEFT SQUARE BRACKET
0x5C	0x00A5	# YEN SIGN
0x5D	0x005D	# RIGHT SQUARE BRACKET
0x5E	0x005E	# CIRCUMFLEX ACCENT
0x5F	0x005F	# LOW LINE
0x60	0x0060	# GRAVE ACCENT
0x61	0x0061	# LATIN SMALL LETTER A
0x62	0x0062	# LATIN SMALL LETTER B
0x63	0x0063	# LATIN SMALL LETTER C
0x64	0x0064	# LATIN SMALL LETTER D
0x65	0x0065	# LATIN SMALL LETTER E
0x66	0x0066	# LATIN SMALL LETTER F
0x67	0x0067	# LATIN SMALL LETTER G
0x68	0x0068	# LATIN SMALL LETTER H
0x69	0x0069	# LATIN SMALL LETTER I
0x6A	0x006A	# LATIN SMALL LETTER J
0x6B	0x006B	# LATIN SMALL LETTER K
0x6C	0x006C	# LATIN SMALL LETTER L
0x6D	0x006D	# LATIN SMALL LETTER M
0x6E	0x006E	# LATIN SMALL LETTER N
0x6F	0x006F	# LATIN SMALL LETTER O
0x70	0x0070	# LATIN SMALL LETTER P
0x71	0x0071	# LATIN SMALL LETTER Q
0x72	0x0072	# LATIN SMALL LETTER R
0x73	0x0073	# LATIN SMALL LETTER S
0x74	0x0074	# LATIN SMALL LETTER T
0x75	0x0075	# LATIN SMALL LETTER U
0x76	0x0076	# LATIN SMALL LETTER V
0x77	0x0077	# LATIN SMALL LETTER W
0x78	0x0078	# LATIN SMALL LETTER X
0x79	0x0079	# LATIN SMALL LETTER Y
0x7A	0x007A	# LATIN SMALL LETTER Z
0x7B	0x007B	# LEFT CURLY BRACKET
0x7C	0x007C	# VERTICAL LINE
0x7D	0x007D	# RIGHT CURLY BRACKET
0x7E	0x203E	# OVERLINE
0x8140	0x3000	# IDEOGRAPHIC SPACE
0x8141	0x3001	# IDEOGRAPHIC COMMA
0x8142	0x3002	# IDEOGRAPHIC FULL STOP
0x8143	0xFF0C	# FULLWIDTH COMMA
0x8144	0xFF0E	# FULLWIDTH FULL STOP
0x8145	0x30FB	# KATAKANA MIDDLE DOT
0x8146	0xFF1A	# FULLWIDTH COLON
0x8147	0xFF1B	# FULLWIDTH SEMICOLON
0x8148	0xFF1F	# FULLWIDTH QUESTION MARK
0x8149	0xFF01	# FULLWIDTH EXCLAMATION MARK
0x814A	0x309B	# KATAKANA-HIRAGANA VOICED SOUND MARK
0x814B	0x309C	# KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
0x814C	0x00B4	# ACUTE ACCENT
0x814D	0xFF40	# FULLWIDTH GRAVE ACCENT
0x814E	0x00A8	# DIAERESIS
0x814F	0xFF3E	# FULLWIDTH CIRCUMFLEX ACCENT
0x8150	0xFFE3	# FULLWIDTH MACRON
0x8151	0xFF3F	# FULLWIDTH LOW LINE
0x8152	0x30FD	# KATAKANA ITERATION MARK
0x8153	0x30FE	# KATAKANA VOICED ITERATION MARK
0x8154	0x309D	# HIRAGANA ITERATION MARK
0x8155	0x309E	# HIRAGANA VOICED ITERATION MARK
0x8156	0x3003	# DITTO MARK
0x8157	0x4EDD	# <CJK>
0x8158	0x3005	# IDEOGRAPHIC ITERATION MARK
0x8159	0x3006	# IDEOGRAPHIC CLOSING MARK
0x815A	0x3007	# IDEOGRAPHIC NUMBER ZERO
0x815B	0x30FC	# KATAKANA-HIRAGANA PROLONGED SOUND MARK
0x815C	0x2015	# HORIZONTAL BAR
0x815D	0x2010	# HYPHEN
0x815E	0xFF0F	# FULLWIDTH SOLIDUS
0x815F	0x005C	# REVERSE SOLIDUS
0x8160	0x301C	# WAVE DASH
0x8161	0x2016	# DOUBLE VERTICAL LINE
0x8162	0xFF5C	# FULLWIDTH VERTICAL LINE
0x8163	0x2026	# HORIZONTAL ELLIPSIS
0x8164	0x2025	# TWO DOT LEADER
0x8165	0x2018	# LEFT SINGLE QUOTATION MARK
0x8166	0x2019	# RIGHT SINGLE QUOTATION MARK
0x8167	0x201C	# LEFT DOUBLE QUOTATION MARK
0x8168	0x201D	# RIGHT DOUBLE QUOTATION MARK
0x8169	0xFF08	# FULLWIDTH LEFT PARENTHESIS
0x816A	0xFF09	# FULLWIDTH RIGHT PARENTHESIS
0x816B	0x3014	# LEFT TORTOISE SHELL BRACKET
0x816C	0x3015	# RIGHT TORTOISE SHELL BRACKET
0x816D	0xFF3B	# FULLWIDTH LEFT SQUARE BRACKET
0x816E	0xFF3D	# FULLWIDTH RIGHT SQUARE BRACKET
0x816F	0xFF5B	# FULLWIDTH LEFT CURLY BRACKET
0x8170	0xFF5D	# FULLWIDTH RIGHT CURLY BRACKET
0x8171	0x3008	# LEFT ANGLE BRACKET
0x8172	0x3009	# RIGHT ANGLE BRACKET
0x8173	0x300A	# LEFT DOUBLE ANGLE BRACKET
0x8174	0x300B	# RIGHT DOUBLE ANGLE BRACKET
0x8175	0x300C	# LEFT CORNER BRACKET
0x8176	0x300D	# RIGHT CORNER BRACKET
0x8177	0x300E	# LEFT WHITE CORNER BRACKET
0x8178	0x300F	# RIGHT WHITE CORNER BRACKET
0x8179	0x3010	# LEFT BLACK LENTICULAR BRACKET
0x817A	0x3011	# RIGHT BLACK LENTICULAR BRACKET
0x817B	0xFF0B	# FULLWIDTH PLUS SIGN
0x817C	0x2212	# MINUS SIGN
0x817D	0x00B1	# PLUS-MINUS SIGN
0x817E	0x00D7	# MULTIPLICATION SIGN
0x8180	0x00F7	# DIVISION SIGN
0x8181	0xFF1D	# FULLWIDTH EQUALS SIGN
0x8182	0x2260	# NOT EQUAL TO
0x8183	0xFF1C	# FULLWIDTH LESS-THAN SIGN
0x8184	0xFF1E	# FULLWIDTH GREATER-THAN SIGN
0x8185	0x2266	# LESS-THAN OVER EQUAL TO
0x8186	0x2267	# GREATER-THAN OVER EQUAL TO
0x8187	0x221E	# INFINITY
0x8188	0x2234	# THEREFORE
0x8189	0x2642	# MALE SIGN
0x818A	0x2640	# FEMALE SIGN
0x818B	0x00B0	# DEGREE SIGN
0x818C	0x2032	# PRIME
0x818D	0x2033	# DOUBLE PRIME
0x818E	0x2103	# DEGREE CELSIUS
0x818F	0xFFE5	# FULLWIDTH YEN SIGN
0x8190	0xFF04	# FULLWIDTH DOLLAR SIGN
0x8191	0x00A2	# CENT SIGN
0x8192	0x00A3	# POUND SIGN
0x8193	0xFF05	# FULLWIDTH PERCENT SIGN
0x8194	0xFF03	# FULLWIDTH NUMBER SIGN
0x8195	0xFF06	# FULLWIDTH AMPERSAND
0x8196	0xFF0A	# FULLWIDTH ASTERISK
0x8197	0xFF20	# FULLWIDTH COMMERCIAL AT
0x8198	0x00A7	# SECTION SIGN
0x8199	0x2606	# WHITE STAR
0x819A	0x2605	# BLACK STAR
0x819B	0x25CB	# WHITE CIRCLE
0x819C	0x25CF	# BLACK CIRCLE
0x819D	0x25CE	# BULLSEYE
0x819E	0x25C7	# WHITE DIAMOND
0x819F	0x25C6	# BLACK DIAMOND
0x81A0	0x25A1	# WHITE SQUARE
0x81A1	0x25A0	# BLACK SQUARE
0x81A2	0x25B3	# WHITE UP-POINTING TRIANGLE
0x81A3	0x25B2	# BLACK UP-POINTING TRIANGLE
0x81A4	0x25BD	# WHITE DOWN-POINTING TRIANGLE
0x81A5	0x25BC	# BLACK DOWN-POINTING TRIANGLE
0x81A6	0x203B	# REFERENCE MARK
0x81A7	0x3012	# POSTAL MARK
0x81A8	0x2192	# RIGHTWARDS ARROW
0x81A9	0x2190	# LEFTWARDS ARROW
0x81AA	0x2191	# UPWARDS ARROW
0x81AB	0x2193	# DOWNWARDS ARROW
0x81AC	0x3013	# GETA MARK
0x81B8	0x2208	# ELEMENT OF
0x81B9	0x220B	# CONTAINS AS MEMBER
0x81BA	0x2286	# SUBSET OF OR EQUAL TO
0x81BB	0x2287	# SUPERSET OF OR EQUAL TO
0x81BC	0x2282	# SUBSET OF
0x81BD	0x2283	# SUPERSET OF
0x81BE	0x222A	# UNION
0x81BF	0x2229	# INTERSECTION
0x81C8	0x2227	# LOGICAL AND
0x81C9	0x2228	# LOGICAL OR
0x81CA	0x00AC	# NOT SIGN
0x81CB	0x21D2	# RIGHTWARDS DOUBLE ARROW
0x81CC	0x21D4	# LEFT RIGHT DOUBLE ARROW
0x81CD	0x2200	# FOR ALL
0x81CE	0x2203	# THERE EXISTS
0x81DA	0x2220	# ANGLE
0x81DB	0x22A5	# UP TACK
0x81DC	0x2312	# ARC
0x81DD	0x2202	# PARTIAL DIFFERENTIAL
0x81DE	0x2207	# NABLA
0x81DF	0x2261	# IDENTICAL TO
0x81E0	0x2252	# APPROXIMATELY EQUAL TO OR THE IMAGE OF
0x81E1	0x226A	# MUCH LESS-THAN
0x81E2	0x226B	# MUCH GREATER-THAN
0x81E3	0x221A	# SQUARE ROOT
0x81E4	0x223D	# REVERSED TILDE
0x81E5	0x221D	# PROPORTIONAL TO
0x81E6	0x2235	# BECAUSE
0x81E7	0x222B	# INTEGRAL
0x81E8	0x222C	# DOUBLE INTEGRAL
0x81F0	0x212B	# ANGSTROM SIGN
0x81F1	0x2030	# PER MILLE SIGN
0x81F2	0x266F	# MUSIC SHARP SIGN
0x81F3	0x266D	# MUSIC FLAT SIGN
0x81F4	0x266A	# EIGHTH NOTE
0x81F5	0x2020	# DAGGER
0x81F6	0x2021	# DOUBLE DAGGER
0x81F7	0x00B6	# PILCROW SIGN
0x81FC	0x25EF	# LARGE CIRCLE
0x824F	0xFF10	# FULLWIDTH DIGIT ZERO
0x8250	0xFF11	# FULLWIDTH DIGIT ONE
0x8251	0xFF12	# FULLWIDTH DIGIT TWO
0x8252	0xFF13	# FULLWIDTH DIGIT THREE
0x8253	0xFF14	# FULLWIDTH DIGIT FOUR
0x8254	0xFF15	# FULLWIDTH DIGIT FIVE
0x8255	0xFF16	# FULLWIDTH DIGIT SIX
0x8256	0xFF17	# FULLWIDTH DIGIT SEVEN
0x8257	0xFF18	# FULLWIDTH DIGIT EIGHT
0x8258	0xFF19	# FULLWIDTH DIGIT NINE
0x8260	0xFF21	# FULLWIDTH LATIN CAPITAL LETTER A
0x8261	0xFF22	# FULLWIDTH LATIN CAPITAL LETTER B
0x8262	0xFF23	# FULLWIDTH LATIN CAPITAL LETTER C
0x8263	0xFF24	# FULLWIDTH LATIN CAPITAL LETTER D
0x8264	0xFF25	# FULLWIDTH LATIN CAPITAL LETTER E
0x8265	0xFF26	# FULLWIDTH LATIN CAPITAL LETTER F
0x8266	0xFF27	# FULLWIDTH LATIN CAPITAL LETTER G
0x8267	0xFF28	# FULLWIDTH LATIN CAPITAL LETTER H
0x8268	0xFF29	# FULLWIDTH LATIN CAPITAL LETTER I
0x8269	0xFF2A	# FULLWIDTH LATIN CAPITAL LETTER J
0x826A	0xFF2B	# FULLWIDTH LATIN CAPITAL LETTER K
0x826B	0xFF2C	# FULLWIDTH LATIN CAPITAL LETTER L
0x826C	0xFF2D	# FULLWIDTH LATIN CAPITAL LETTER M
0x826D	0xFF2E	# FULLWIDTH LATIN CAPITAL LETTER N
0x826E	0xFF2F	# FULLWIDTH LATIN CAPITAL LETTER O
0x826F	0xFF30	# FULLWIDTH LATIN CAPITAL LETTER P
0x8270	0xFF31	# FULLWIDTH LATIN CAPITAL LETTER Q
0x8271	0xFF32	# FULLWIDTH LATIN CAPITAL LETTER R
0x8272	0xFF33	# FULLWIDTH LATIN CAPITAL LETTER S
0x8273	0xFF34	# FULLWIDTH LATIN CAPITAL LETTER T
0x8274	0xFF35	# FULLWIDTH LATIN CAPITAL LETTER U
0x8275	0xFF36	# FULLWIDTH LATIN CAPITAL LETTER V
0x8276	0xFF37	# FULLWIDTH LATIN CAPITAL LETTER W
0x8277	0xFF38	# FULLWIDTH LATIN CAPITAL LETTER X
0x8278	0xFF39	# FULLWIDTH LATIN CAPITAL LETTER Y
0x8279	0xFF3A	# FULLWIDTH LATIN CAPITAL LETTER Z
0x8281	0xFF41	# FULLWIDTH LATIN SMALL LETTER A
0x8282	0xFF42	# FULLWIDTH LATIN SMALL LETTER B
0x8283	0xFF43	# FULLWIDTH LATIN SMALL LETTER C
0x8284	0xFF44	# FULLWIDTH LATIN SMALL LETTER D
0x8285	0xFF45	# FULLWIDTH LATIN SMALL LETTER E
0x8286	0xFF46	# FULLWIDTH LATIN SMALL LETTER F
0x8287	0xFF47	# FULLWIDTH LATIN SMALL LETTER G
0x8288	0xFF48	# FULLWIDTH LATIN SMALL LETTER H
0x8289	0xFF49	# FULLWIDTH LATIN SMALL LETTER I
0x828A	0xFF4A	# FULLWIDTH LATIN SMALL LETTER J
0x828B	0xFF4B	# FULLWIDTH LATIN SMALL LETTER K
0x828C	0xFF4C	# FULLWIDTH LATIN SMALL LETTER L
0x828D	0xFF4D	# FULLWIDTH LATIN SMALL LETTER M
0x828E	0xFF4E	# FULLWIDTH LATIN SMALL LETTER N
0x828F	0xFF4F	# FULLWIDTH LATIN SMALL LETTER O
0x8290	0xFF50	# FULLWIDTH LATIN SMALL LETTER P
0x8291	0xFF51	# FULLWIDTH LATIN SMALL LETTER Q
0x8292	0xFF52	# FULLWIDTH LATIN SMALL LETTER R
0x8293	0xFF53	# FULLWIDTH LATIN SMALL LETTER S
0x8294	0xFF54	# FULLWIDTH LATIN SMALL LETTER T
0x8295	0xFF55	# FULLWIDTH LATIN SMALL LETTER U
0x8296	0xFF56	# FULLWIDTH LATIN SMALL LETTER V
0x8297	0xFF57	# FULLWIDTH LATIN SMALL LETTER W
0x8298	0xFF58	# FULLWIDTH LATIN SMALL LETTER X
0x8299	0xFF59	# FULLWIDTH LATIN SMALL LETTER Y
0x829A	0xFF5A	# FULLWIDTH LATIN SMALL LETTER Z
0x829F	0x3041	# HIRAGANA LETTER SMALL A
0x82A0	0x3042	# HIRAGANA LETTER A
0x82A1	0x3043	# HIRAGANA LETTER SMALL I
0x82A2	0x3044	# HIRAGANA LETTER I
0x82A3	0x3045	# HIRAGANA LETTER SMALL U
0x82A4	0x3046	# HIRAGANA LETTER U
0x82A5	0x3047	# HIRAGANA LETTER SMALL E
0x82A6	0x3048	# HIRAGANA LETTER E
0x82A7	0x3049	# HIRAGANA LETTER SMALL O
0x82A8	0x304A	# HIRAGANA LETTER O
0x82A9	0x304B	# HIRAGANA LETTER KA
0x82AA	0x304C	# HIRAGANA LETTER GA
0x82AB	0x304D	# HIRAGANA LETTER KI
0x82AC	0x304E	# HIRAGANA LETTER GI
0x82AD	0x304F	# HIRAGANA LETTER KU
0x82AE	0x3050	# HIRAGANA LETTER GU
0x82AF	0x3051	# HIRAGANA LETTER KE
0x82B0	0x3052	# HIRAGANA LETTER GE
0x82B1	0x3053	# HIRAGANA LETTER KO
0x82B2	0x3054	# HIRAGANA LETTER GO
0x82B3	0x3055	# HIRAGANA LETTER SA
0x82B4	0x3056	# HIRAGANA LETTER ZA
0x82B5	0x3057	# HIRAGANA LETTER SI
0x82B6	0x3058	# HIRAGANA LETTER ZI
0x82B7	0x3059	# HIRAGANA LETTER SU
0x82B8	0x305A	# HIRAGANA LETTER ZU
0x82B9	0x305B	# HIRAGANA LETTER SE
0x82BA	0x305C	# HIRAGANA LETTER ZE
0x82BB	0x305D	# HIRAGANA LETTER SO
0x82BC	0x305E	# HIRAGANA LETTER ZO
0x82BD	0x305F	# HIRAGANA LETTER TA
0x82BE	0x3060	# HIRAGANA LETTER DA
0x82BF	0x3061	# HIRAGANA LETTER TI
0x82C0	0x3062	# HIRAGANA LETTER DI
0x82C1	0x3063	# HIRAGANA LETTER SMALL TU
0x82C2	0x3064	# HIRAGANA LETTER TU
0x82C3	0x3065	# HIRAGANA LETTER DU
0x82C4	0x3066	# HIRAGANA LETTER TE
0x82C5	0x3067	# HIRAGANA LETTER DE
0x82C6	0x3068	# HIRAGANA LETTER TO
0x82C7	0x3069	# HIRAGANA LETTER DO
0x82C8	0x306A	# HIRAGANA LETTER NA
0x82C9	0x306B	# HIRAGANA LETTER NI
0x82CA	0x306C	# HIRAGANA LETTER NU
0x82CB	0x306D	# HIRAGANA LETTER NE
0x82CC	0x306E	# HIRAGANA LETTER NO
0x82CD	0x306F	# HIRAGANA LETTER HA
0x82CE	0x3070	# HIRAGANA LETTER BA
0x82CF	0x3071	# HIRAGANA LETTER PA
0x82D0	0x3072	# HIRAGANA LETTER HI
0x82D1	0x3073	# HIRAGANA LETTER BI
0x82D2	0x3074	# HIRAGANA LETTER PI
0x82D3	0x3075	# HIRAGANA LETTER HU
0x82D4	0x3076	# HIRAGANA LETTER BU
0x82D5	0x3077	# HIRAGANA LETTER PU
0x82D6	0x3078	# HIRAGANA LETTER HE
0x82D7	0x3079	# HIRAGANA LETTER BE
0x82D8	0x307A	# HIRAGANA LETTER PE
0x82D9	0x307B	# HIRAGANA LETTER HO
0x82DA	0x307C	# HIRAGANA LETTER BO
0x82DB	0x307D	# HIRAGANA LETTER PO
0x82DC	0x307E	# HIRAGANA LETTER MA
0x82DD	0x307F	# HIRAGANA LETTER MI
0x82DE	0x3080	# HIRAGANA LETTER MU
0x82DF	0x3081	# HIRAGANA LETTER ME
0x82E0	0x3082	# HIRAGANA LETTER MO
0x82E1	0x3083	# HIRAGANA LETTER SMALL YA
0x82E2	0x3084	# HIRAGANA LETTER YA
0x82E3	0x3085	# HIRAGANA LETTER SMALL YU
0x82E4	0x3086	# HIRAGANA LETTER YU
0x82E5	0x3087	# HIRAGANA LETTER SMALL YO
0x82E6	0x3088	# HIRAGANA LETTER YO
0x82E7	0x3089	# HIRAGANA LETTER RA
0x82E8	0x308A	# HIRAGANA LETTER RI
0x82E9	0x308B	# HIRAGANA LETTER RU
0x82EA	0x308C	# HIRAGANA LETTER RE
0x82EB	0x308D	# HIRAGANA LETTER RO
0x82EC	0x308E	# HIRAGANA LETTER SMALL WA
0x82ED	0x308F	# HIRAGANA LETTER WA
0x82EE	0x3090	# HIRAGANA LETTER WI
0x82EF	0x3091	# HIRAGANA LETTER WE
0x82F0	0x3092	# HIRAGANA LETTER WO
0x82F1	0x3093	# HIRAGANA LETTER N
0x8340	0x30A1	# KATAKANA LETTER SMALL A
0x8341	0x30A2	# KATAKANA LETTER A
0x8342	0x30A3	# KATAKANA LETTER SMALL I
0x8343	0x30A4	# KATAKANA LETTER I
0x8344	0x30A5	# KATAKANA LETTER SMALL U
0x8345	0x30A6	# KATAKANA LETTER U
0x8346	0x30A7	# KATAKANA LETTER SMALL E
0x8347	0x30A8	# KATAKANA LETTER E
0x8348	0x30A9	# KATAKANA LETTER SMALL O
0x8349	0x30AA	# KATAKANA LETTER O
0x834A	0x30AB	# KATAKANA LETTER KA
0x834B	0x30AC	# KATAKANA LETTER GA
0x834C	0x30AD	# KATAKANA LETTER KI
0x834D	0x30AE	# KATAKANA LETTER GI
0x834E	0x30AF	# KATAKANA LETTER KU
0x834F	0x30B0	# KATAKANA LETTER GU
0x8350	0x30B1	# KATAKANA LETTER KE
0x8351	0x30B2	# KATAKANA LETTER GE
0x8352	0x30B3	# KATAKANA LETTER KO
0x8353	0x30B4	# KATAKANA LETTER GO
0x8354	0x30B5	# KATAKANA LETTER SA
0x8355	0x30B6	# KATAKANA LETTER ZA
0x8356	0x30B7	# KATAKANA LETTER SI
0x8357	0x30B8	# KATAKANA LETTER ZI
0x8358	0x30B9	# KATAKANA LETTER SU
0x8359	0x30BA	# KATAKANA LETTER ZU
0x835A	0x30BB	# KATAKANA LETTER SE
0x835B	0x30BC	# KATAKANA LETTER ZE
0x835C	0x30BD	# KATAKANA LETTER SO
0x835D	0x30BE	# KATAKANA LETTER ZO
0x835E	0x30BF	# KATAKANA LETTER TA
0x835F	0x30C0	# KATAKANA LETTER DA
0x8360	0x30C1	# KATAKANA LETTER TI
0x8361	0x30C2	# KATAKANA LETTER DI
0x8362	0x30C3	# KATAKANA LETTER SMALL TU
0x8363	0x30C4	# KATAKANA LETTER TU
0x8364	0x30C5	# KATAKANA LETTER DU
0x8365	0x30C6	# KATAKANA LETTER TE
0x8366	0x30C7	# KATAKANA LETTER DE
0x8367	0x30C8	# KATAKANA LETTER TO
0x8368	0x30C9	# KATAKANA LETTER DO
0x8369	0x30CA	# KATAKANA LETTER NA
0x836A	0x30CB	# KATAKANA LETTER NI
0x836B	0x30CC	# KATAKANA LETTER NU
0x836C	0x30CD	# KATAKANA LETTER NE
0x836D	0x30CE	# KATAKANA LETTER NO
0x836E	0x30CF	# KATAKANA LETTER HA
0x836F	0x30D0	# KATAKANA LETTER BA
0x8370	0x30D1	# KATAKANA LETTER PA
0x8371	0x30D2	# KATAKANA LETTER HI
0x8372	0x30D3	# KATAKANA LETTER BI
0x8373	0x30D4	# KATAKANA LETTER PI
0x8374	0x30D5	# KATAKANA LETTER HU
0x8375	0x30D6	# KATAKANA LETTER BU
0x8376	0x30D7	# KATAKANA LETTER PU
0x8377	0x30D8	# KATAKANA LETTER HE
0x8378	0x30D9	# KATAKANA LETTER BE
0x8379	0x30DA	# KATAKANA LETTER PE
0x837A	0x30DB	# KATAKANA LETTER HO
0x837B	0x30DC	# KATAKANA LETTER BO
0x837C	0x30DD	# KATAKANA LETTER PO
0x837D	0x30DE	# KATAKANA LETTER MA
0x837E	0x30DF	# KATAKANA LETTER MI
0x8380	0x30E0	# KATAKANA LETTER MU
0x8381	0x30E1	# KATAKANA LETTER ME
0x8382	0x30E2	# KATAKANA LETTER MO
0x8383	0x30E3	# KATAKANA LETTER SMALL YA
0x8384	0x30E4	# KATAKANA LETTER YA
0x8385	0x30E5	# KATAKANA LETTER SMALL YU
0x8386	0x30E6	# KATAKANA LETTER YU
0x8387	0x30E7	# KATAKANA LETTER SMALL YO
0x8388	0x30E8	# KATAKANA LETTER YO
0x8389	0x30E9	# KATAKANA LETTER RA
0x838A	0x30EA	# KATAKANA LETTER RI
0x838B	0x30EB	# KATAKANA LETTER RU
0x838C	0x30EC	# KATAKANA LETTER RE
0x838D	0x30ED	# KATAKANA LETTER RO
0x838E	0x30EE	# KATAKANA LETTER SMALL WA
0x838F	0x30EF	# KATAKANA LETTER WA
0x8390	0x30F0	# KATAKANA LETTER WI
0x8391	0x30F1	# KATAKANA LETTER WE
0x8392	0x30F2	# KATAKANA LETTER WO
0x8393	0x30F3	# KATAKANA LETTER N
0x8394	0x30F4	# KATAKANA LETTER VU
0x8395	0x30F5	# KATAKANA LETTER SMALL KA
0x8396	0x30F6	# KATAKANA LETTER SMALL KE
0x839F	0x0391	# GREEK CAPITAL LETTER ALPHA
0x83A0	0x0392	# GREEK CAPITAL LETTER BETA
0x83A1	0x0393	# GREEK CAPITAL LETTER GAMMA
0x83A2	0x0394	# GREEK CAPITAL LETTER DELTA
0x83A3	0x0395	# GREEK CAPITAL LETTER EPSILON
0x83A4	0x0396	# GREEK CAPITAL LETTER ZETA
0x83A5	0x0397	# GREEK CAPITAL LETTER ETA
0x83A6	0x0398	# GREEK CAPITAL LETTER THETA
0x83A7	0x0399	# GREEK CAPITAL LETTER IOTA
0x83A8	0x039A	# GREEK CAPITAL LETTER KAPPA
0x83A9	0x039B	# GREEK CAPITAL LETTER LAMDA
0x83AA	0x039C	# GREEK CAPITAL LETTER MU
0x83AB	0x039D	# GREEK CAPITAL LETTER NU
0x83AC	0x039E	# GREEK CAPITAL LETTER XI
0x83AD	0x039F	# GREEK CAPITAL LETTER OMICRON
0x83AE	0x03A0	# GREEK CAPITAL LETTER PI
0x83AF	0x03A1	# GREEK CAPITAL LETTER RHO
0x83B0	0x03A3	# GREEK CAPITAL LETTER SIGMA
0x83B1	0x03A4	# GREEK CAPITAL LETTER TAU
0x83B2	0x03A5	# GREEK CAPITAL LETTER UPSILON
0x83B3	0x03A6	# GREEK CAPITAL LETTER PHI
0x83B4	0x03A7	# GREEK CAPITAL LETTER CHI
0x83B5	0x03A8	# GREEK CAPITAL LETTER PSI
0x83B6	0x03A9	# GREEK CAPITAL LETTER OMEGA
0x83BF	0x03B1	# GREEK SMALL LETTER ALPHA
0x83C0	0x03B2	# GREEK SMALL LETTER BETA
0x83C1	0x03B3	# GREEK SMALL LETTER GAMMA
0x83C2	0x03B4	# GREEK SMALL LETTER DELTA
0x83C3	0x03B5	# GREEK SMALL LETTER EPSILON
0x83C4	0x03B6	# GREEK SMALL LETTER ZETA
0x83C5	0x03B7	# GREEK SMALL LETTER ETA
0x83C6	0x03B8	# GREEK SMALL LETTER THETA
0x83C7	0x03B9	# GREEK SMALL LETTER IOTA
0x83C8	0x03BA	# GREEK SMALL LETTER KAPPA
0x83C9	0x03BB	# GREEK SMALL LETTER LAMDA
0x83CA	0x03BC	# GREEK SMALL LETTER MU
0x83CB	0x03BD	# GREEK SMALL LETTER NU
0x83CC	0x03BE	# GREEK SMALL LETTER XI
0x83CD	0x03BF	# GREEK SMALL LETTER OMICRON
0x83CE	0x03C0	# GREEK SMALL LETTER PI
0x83CF	0x03C1	# GREEK SMALL LETTER RHO
0x83D0	0x03C3	# GREEK SMALL LETTER SIGMA
0x83D1	0x03C4	# GREEK SMALL LETTER TAU
0x83D2	0x03C5	# GREEK SMALL LETTER UPSILON
0x83D3	0x03C6	# GREEK SMALL LETTER PHI
0x83D4	0x03C7	# GREEK SMALL LETTER CHI
0x83D5	0x03C8	# GREEK SMALL LETTER PSI
0x83D6	0x03C9	# GREEK SMALL LETTER OMEGA
0x8440	0x0410	# CYRILLIC CAPITAL LETTER A
0x8441	0x0411	# CYRILLIC CAPITAL LETTER BE
0x8442	0x0412	# CYRILLIC CAPITAL LETTER VE
0x8443	0x0413	# CYRILLIC CAPITAL LETTER GHE
0x8444	0x0414	# CYRILLIC CAPITAL LETTER DE
0x8445	0x0415	# CYRILLIC CAPITAL LETTER IE
0x8446	0x0401	# CYRILLIC CAPITAL LETTER IO
0x8447	0x0416	# CYRILLIC CAPITAL LETTER ZHE
0x8448	0x0417	# CYRILLIC CAPITAL LETTER ZE
0x8449	0x0418	# CYRILLIC CAPITAL LETTER I
0x844A	0x0419	# CYRILLIC CAPITAL LETTER SHORT I
0x844B	0x041A	# CYRILLIC CAPITAL LETTER KA
0x844C	0x041B	# CYRILLIC CAPITAL LETTER EL
0x844D	0x041C	# CYRILLIC CAPITAL LETTER EM
0x844E	0x041D	# CYRILLIC CAPITAL LETTER EN
0x844F	0x041E	# CYRILLIC CAPITAL LETTER O
0x8450	0x041F	# CYRILLIC CAPITAL LETTER PE
0x8451	0x0420	# CYRILLIC CAPITAL LETTER ER
0x8452	0x0421	# CYRILLIC CAPITAL LETTER ES
0x8453	0x0422	# CYRILLIC CAPITAL LETTER TE
0x8454	0x0423	# CYRILLIC CAPITAL LETTER U
0x8455	0x0424	# CYRILLIC CAPITAL LETTER EF
0x8456	0x0425	# CYRILLIC CAPITAL LETTER HA
0x8457	0x0426	# CYRILLIC CAPITAL LETTER TSE
0x8458	0x0427	# CYRILLIC CAPITAL LETTER CHE
0x8459	0x0428	# CYRILLIC CAPITAL LETTER SHA
0x845A	0x0429	# CYRILLIC CAPITAL LETTER SHCHA
0x845B	0x042A	# CYRILLIC CAPITAL LETTER HARD SIGN
0x845C	0x042B	# CYRILLIC CAPITAL LETTER YERU
0x845D	0x042C	# CYRILLIC CAPITAL LETTER SOFT SIGN
0x845E	0x042D	# CYRILLIC CAPITAL LETTER E
0x845F	0x042E	# CYRILLIC CAPITAL LETTER YU
0x8460	0x042F	# CYRILLIC CAPITAL LETTER YA
0x8470	0x0430	# CYRILLIC SMALL LETTER A
0x8471	0x0431	# CYRILLIC SMALL LETTER BE
0x8472	0x0432	# CYRILLIC SMALL LETTER VE
0x8473	0x0433	# CYRILLIC SMALL LETTER GHE
0x8474	0x0434	# CYRILLIC SMALL LETTER DE
0x8475	0x0435	# CYRILLIC SMALL LETTER IE
0x8476	0x0451	# CYRILLIC SMALL LETTER IO
0x8477	0x0436	# CYRILLIC SMALL LETTER ZHE
0x8478	0x0437	# CYRILLIC SMALL LETTER ZE
0x8479	0x0438	# CYRILLIC SMALL LETTER I
0x847A	0x0439	# CYRILLIC SMALL LETTER SHORT I
0x847B	0x043A	# CYRILLIC SMALL LETTER KA
0x847C	0x043B	# CYRILLIC SMALL LETTER EL
0x847D	0x043C	# CYRILLIC SMALL LETTER EM
0x847E	0x043D	# CYRILLIC SMALL LETTER EN
0x8480	0x043E	# CYRILLIC SMALL LETTER O
0x8481	0x043F	# CYRILLIC SMALL LETTER PE
0x8482	0x0440	# CYRILLIC SMALL LETTER ER
0x8483	0x0441	# CYRILLIC SMALL LETTER ES
0x8484	0x0442	# CYRILLIC SMALL LETTER TE
0x8485	0x0443	# CYRILLIC SMALL LETTER U
0x8486	0x0444	# CYRILLIC SMALL LETTER EF
0x8487	0x0445	# CYRILLIC SMALL LETTER HA
0x8488	0x0446	# CYRILLIC SMALL LETTER TSE
0x8489	0x0447	# CYRILLIC SMALL LETTER CHE
0x848A	0x0448	# CYRILLIC SMALL LETTER SHA
0x848B	0x0449	# CYRILLIC SMALL LETTER SHCHA
0x848C	0x044A	# CYRILLIC SMALL LETTER HARD SIGN
0x848D	0x044B	# CYRILLIC SMALL LETTER YERU
0x848E	0x044C	# CYRILLIC SMALL LETTER SOFT SIGN
0x848F	0x044D	# CYRILLIC SMALL LETTER E
0x8490	0x044E	# CYRILLIC SMALL LETTER YU
0x8491	0x044F	# CYRILLIC SMALL LETTER YA
0x849F	0x2500	# BOX DRAWINGS LIGHT HORIZONTAL
0x84A0	0x2502	# BOX DRAWINGS LIGHT VERTICAL
0x84A1	0x250C	# BOX DRAWINGS LIGHT DOWN AND RIGHT
0x84A2	0x2510	# BOX DRAWINGS LIGHT DOWN AND LEFT
0x84A3	0x2518	# BOX DRAWINGS LIGHT UP AND LEFT
0x84A4	0x2514	# BOX DRAWINGS LIGHT UP AND RIGHT
0x84A5	0x251C	# BOX DRAWINGS LIGHT VERTICAL AND RIGHT
0x84A6	0x252C	# BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
0x84A7	0x2524	# BOX DRAWINGS LIGHT VERTICAL AND LEFT
0x84A8	0x2534	# BOX DRAWINGS LIGHT UP AND HORIZONTAL
0x84A9	0x253C	# BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
0x84AA	0x2501	# BOX DRAWINGS HEAVY HORIZONTAL
0x84AB	0x2503	# BOX DRAWINGS HEAVY VERTICAL
0x84AC	0x250F	# BOX DRAWINGS HEAVY DOWN AND RIGHT
0x84AD	0x2513	# BOX DRAWINGS HEAVY DOWN AND LEFT
0x84AE	0x251B	# BOX DRAWINGS HEAVY UP AND LEFT
0x84AF	0x2517	# BOX DRAWINGS HEAVY UP AND RIGHT
0x84B0	0x2523	# BOX DRAWINGS HEAVY VERTICAL AND RIGHT
0x84B1	0x2533	# BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
0x84B2	0x252B	# BOX DRAWINGS HEAVY VERTICAL AND LEFT
0x84B3	0x253B	# BOX DRAWINGS HEAVY UP AND HORIZONTAL
0x84B4	0x254B	# BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
0x84B5	0x2520	# BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
0x84B6	0x252F	# BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
0x84B7	0x2528	# BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
0x84B8	0x2537	# BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
0x84B9	0x253F	# BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
0x84BA	0x251D	# BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
0x84BB	0x2530	# BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
0x84BC	0x2525	# BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
0x84BD	0x2538	# BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
0x84BE	0x2542	# BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
0x889F	0x4E9C	# <CJK>
0x88A0	0x5516	# <CJK>
0x88A1	0x5A03	# <CJK>
0x88A2	0x963F	# <CJK>
0x88A3	0x54C0	# <CJK>
0x88A4	0x611B	# <CJK>
0x88A5	0x6328	# <CJK>
0x88A6	0x59F6	# <CJK>
0x88A7	0x9022	# <CJK>
0x88A8	0x8475	# <CJK>
0x88A9	0x831C	# <CJK>
0x88AA	0x7A50	# <CJK>
0x88AB	0x60AA	# <CJK>
0x88AC	0x63E1	# <CJK>
0x88AD	0x6E25	# <CJK>
0x88AE	0x65ED	# <CJK>
0x88AF	0x8466	# <CJK>
0x88B0	0x82A6	# <CJK>
0x88B1	0x9BF5	# <CJK>
0x88B2	0x6893	# <CJK>
0x88B3	0x5727	# <CJK>
0x88B4	0x65A1	# <CJK>
0x88B5	0x6271	# <CJK>
0x88B6	0x5B9B	# <CJK>
0x88B7	0x59D0	# <CJK>
0x88B8	0x867B	# <CJK>
0x88B9	0x98F4	# <CJK>
0x88BA	0x7D62	# <CJK>
0x88BB	0x7DBE	# <CJK>
0x88BC	0x9B8E	# <CJK>
0x88BD	0x6216	# <CJK>
0x88BE	0x7C9F	# <CJK>
0x88BF	0x88B7	# <CJK>
0x88C0	0x5B89	# <CJK>
0x88C1	0x5EB5	# <CJK>
0x88C2	0x6309	# <CJK>
0x88C3	0x6697	# <CJK>
0x88C4	0x6848	# <CJK>
0x88C5	0x95C7	# <CJK>
0x88C6	0x978D	# <CJK>
0x88C7	0x674F	# <CJK>
0x88C8	0x4EE5	# <CJK>
0x88C9	0x4F0A	# <CJK>
0x88CA	0x4F4D	# <CJK>
0x88CB	0x4F9D	# <CJK>
0x88CC	0x5049	# <CJK>
0x88CD	0x56F2	# <CJK>
0x88CE	0x5937	# <CJK>
0x88CF	0x59D4	# <CJK>
0x88D0	0x5A01	# <CJK>
0x88D1	0x5C09	# <CJK>
0x88D2	0x60DF	# <CJK>
0x88D3	0x610F	# <CJK>
0x88D4	0x6170	# <CJK>
0x88D5	0x6613	# <CJK>
0x88D6	0x6905	# <CJK>
0x88D7	0x70BA	# <CJK>
0x88D8	0x754F	# <CJK>
0x88D9	0x7570	# <CJK>
0x88DA	0x79FB	# <CJK>
0x88DB	0x7DAD	# <CJK>
0x88DC	0x7DEF	# <CJK>
0x88DD	0x80C3	# <CJK>
0x88DE	0x840E	# <CJK>
0x88DF	0x8863	# <CJK>
0x88E0	0x8B02	# <CJK>
0x88E1	0x9055	# <CJK>
0x88E2	0x907A	# <CJK>
0x88E3	0x533B	# <CJK>
0x88E4	0x4E95	# <CJK>
0x88E5	0x4EA5	# <CJK>
0x88E6	0x57DF	# <CJK>
0x88E7	0x80B2	# <CJK>
0x88E8	0x90C1	# <CJK>
0x88E9	0x78EF	# <CJK>
0x88EA	0x4E00	# <CJK>
0x88EB	0x58F1	# <CJK>
0x88EC	0x6EA2	# <CJK>
0x88ED	0x9038	# <CJK>
0x88EE	0x7A32	# <CJK>
0x88EF	0x8328	# <CJK>
0x88F0	0x828B	# <CJK>
0x88F1	0x9C2F	# <CJK>
0x88F2	0x5141	# <CJK>
0x88F3	0x5370	# <CJK>
0x88F4	0x54BD	# <CJK>
0x88F5	0x54E1	# <CJK>
0x88F6	0x56E0	# <CJK>
0x88F7	0x59FB	# <CJK>
0x88F8	0x5F15	# <CJK>
0x88F9	0x98F2	# <CJK>
0x88FA	0x6DEB	# <CJK>
0x88FB	0x80E4	# <CJK>
0x88FC	0x852D	# <CJK>
0x8940	0x9662	# <CJK>
0x8941	0x9670	# <CJK>
0x8942	0x96A0	# <CJK>
0x8943	0x97FB	# <CJK>
0x8944	0x540B	# <CJK>
0x8945	0x53F3	# <CJK>
0x8946	0x5B87	# <CJK>
0x8947	0x70CF	# <CJK>
0x8948	0x7FBD	# <CJK>
0x8949	0x8FC2	# <CJK>
0x894A	0x96E8	# <CJK>
0x894B	0x536F	# <CJK>
0x894C	0x9D5C	# <CJK>
0x894D	0x7ABA	# <CJK>
0x894E	0x4E11	# <CJK>
0x894F	0x7893	# <CJK>
0x8950	0x81FC	# <CJK>
0x8951	0x6E26	# <CJK>
0x8952	0x5618	# <CJK>
0x8953	0x5504	# <CJK>
0x8954	0x6B1D	# <CJK>
0x8955	0x851A	# <CJK>
0x8956	0x9C3B	# <CJK>
0x8957	0x59E5	# <CJK>
0x8958	0x53A9	# <CJK>
0x8959	0x6D66	# <CJK>
0x895A	0x74DC	# <CJK>
0x895B	0x958F	# <CJK>
0x895C	0x5642	# <CJK>
0x895D	0x4E91	# <CJK>
0x895E	0x904B	# <CJK>
0x895F	0x96F2	# <CJK>
0x8960	0x834F	# <CJK>
0x8961	0x990C	# <CJK>
0x8962	0x53E1	# <CJK>
0x8963	0x55B6	# <CJK>
0x8964	0x5B30	# <CJK>
0x8965	0x5F71	# <CJK>
0x8966	0x6620	# <CJK>
0x8967	0x66F3	# <CJK>
0x8968	0x6804	# <CJK>
0x8969	0x6C38	# <CJK>
0x896A	0x6CF3	# <CJK>
0x896B	0x6D29	# <CJK>
0x896C	0x745B	# <CJK>
0x896D	0x76C8	# <CJK>
0x896E	0x7A4E	# <CJK>
0x896F	0x9834	# <CJK>
0x8970	0x82F1	# <CJK>
0x8971	0x885B	# <CJK>
0x8972	0x8A60	# <CJK>
0x8973	0x92ED	# <CJK>
0x8974	0x6DB2	# <CJK>
0x8975	0x75AB	# <CJK>
0x8976	0x76CA	# <CJK>
0x8977	0x99C5	# <CJK>
0x8978	0x60A6	# <CJK>
0x8979	0x8B01	# <CJK>
0x897A	0x8D8A	# <CJK>
0x897B	0x95B2	# <CJK>
0x897C	0x698E	# <CJK>
0x897D	0x53AD	# <CJK>
0x897E	0x5186	# <CJK>
0x8980	0x5712	# <CJK>
0x8981	0x5830	# <CJK>
0x8982	0x5944	# <CJK>
0x8983	0x5BB4	# <CJK>
0x8984	0x5EF6	# <CJK>
0x8985	0x6028	# <CJK>
0x8986	0x63A9	# <CJK>
0x8987	0x63F4	# <CJK>
0x8988	0x6CBF	# <CJK>
0x8989	0x6F14	# <CJK>
0x898A	0x708E	# <CJK>
0x898B	0x7114	# <CJK>
0x898C	0x7159	# <CJK>
0x898D	0x71D5	# <CJK>
0x898E	0x733F	# <CJK>
0x898F	0x7E01	# <CJK>
0x8990	0x8276	# <CJK>
0x8991	0x82D1	# <CJK>
0x8992	0x8597	# <CJK>
0x8993	0x9060	# <CJK>
0x8994	0x925B	# <CJK>
0x8995	0x9D1B	# <CJK>
0x8996	0x5869	# <CJK>
0x8997	0x65BC	# <CJK>
0x8998	0x6C5A	# <CJK>
0x8999	0x7525	# <CJK>
0x899A	0x51F9	# <CJK>
0x899B	0x592E	# <CJK>
0x899C	0x5965	# <CJK>
0x899D	0x5F80	# <CJK>
0x899E	0x5FDC	# <CJK>
0x899F	0x62BC	# <CJK>
0x89A0	0x65FA	# <CJK>
0x89A1	0x6A2A	# <CJK>
0x89A2	0x6B27	# <CJK>
0x89A3	0x6BB4	# <CJK>
0x89A4	0x738B	# <CJK>
0x89A5	0x7FC1	# <CJK>
0x89A6	0x8956	# <CJK>
0x89A7	0x9D2C	# <CJK>
0x89A8	0x9D0E	# <CJK>
0x89A9	0x9EC4	# <CJK>
0x89AA	0x5CA1	# <CJK>
0x89AB	0x6C96	# <CJK>
0x89AC	0x837B	# <CJK>
0x89AD	0x5104	# <CJK>
0x89AE	0x5C4B	# <CJK>
0x89AF	0x61B6	# <CJK>
0x89B0	0x81C6	# <CJK>
0x89B1	0x6876	# <CJK>
0x89B2	0x7261	# <CJK>
0x89B3	0x4E59	# <CJK>
0x89B4	0x4FFA	# <CJK>
0x89B5	0x5378	# <CJK>
0x89B6	0x6069	# <CJK>
0x89B7	0x6E29	# <CJK>
0x89B8	0x7A4F	# <CJK>
0x89B9	0x97F3	# <CJK>
0x89BA	0x4E0B	# <CJK>
0x89BB	0x5316	# <CJK>
0x89BC	0x4EEE	# <CJK>
0x89BD	0x4F55	# <CJK>
0x89BE	0x4F3D	# <CJK>
0x89BF	0x4FA1	# <CJK>
0x89C0	0x4F73	# <CJK>
0x89C1	0x52A0	# <CJK>
0x89C2	0x53EF	# <CJK>
0x89C3	0x5609	# <CJK>
0x89C4	0x590F	# <CJK>
0x89C5	0x5AC1	# <CJK>
0x89C6	0x5BB6	# <CJK>
0x89C7	0x5BE1	# <CJK>
0x89C8	0x79D1	# <CJK>
0x89C9	0x6687	# <CJK>
0x89CA	0x679C	# <CJK>
0x89CB	0x67B6	# <CJK>
0x89CC	0x6B4C	# <CJK>
0x89CD	0x6CB3	# <CJK>
0x89CE	0x706B	# <CJK>
0x89CF	0x73C2	# <CJK>
0x89D0	0x798D	# <CJK>
0x89D1	0x79BE	# <CJK>
0x89D2	0x7A3C	# <CJK>
0x89D3	0x7B87	# <CJK>
0x89D4	0x82B1	# <CJK>
0x89D5	0x82DB	# <CJK>
0x89D6	0x8304	# <CJK>
0x89D7	0x8377	# <CJK>
0x89D8	0x83EF	# <CJK>
0x89D9	0x83D3	# <CJK>
0x89DA	0x8766	# <CJK>
0x89DB	0x8AB2	# <CJK>
0x89DC	0x5629	# <CJK>
0x89DD	0x8CA8	# <CJK>
0x89DE	0x8FE6	# <CJK>
0x89DF	0x904E	# <CJK>
0x89E0	0x971E	# <CJK>
0x89E1	0x868A	# <CJK>
0x89E2	0x4FC4	# <CJK>
0x89E3	0x5CE8	# <CJK>
0x89E4	0x6211	# <CJK>
0x89E5	0x7259	# <CJK>
0x89E6	0x753B	# <CJK>
0x89E7	0x81E5	# <CJK>
0x89E8	0x82BD	# <CJK>
0x89E9	0x86FE	# <CJK>
0x89EA	0x8CC0	# <CJK>
0x89EB	0x96C5	# <CJK>
0x89EC	0x9913	# <CJK>
0x89ED	0x99D5	# <CJK>
0x89EE	0x4ECB	# <CJK>
0x89EF	0x4F1A	# <CJK>
0x89F0	0x89E3	# <CJK>
0x89F1	0x56DE	# <CJK>
0x89F2	0x584A	# <CJK>
0x89F3	0x58CA	# <CJK>
0x89F4	0x5EFB	# <CJK>
0x89F5	0x5FEB	# <CJK>
0x89F6	0x602A	# <CJK>
0x89F7	0x6094	# <CJK>
0x89F8	0x6062	# <CJK>
0x89F9	0x61D0	# <CJK>
0x89FA	0x6212	# <CJK>
0x89FB	0x62D0	# <CJK>
0x89FC	0x6539	# <CJK>
0x8A40	0x9B41	# <CJK>
0x8A41	0x6666	# <CJK>
0x8A42	0x68B0	# <CJK>
0x8A43	0x6D77	# <CJK>
0x8A44	0x7070	# <CJK>
0x8A45	0x754C	# <CJK>
0x8A46	0x7686	# <CJK>
0x8A47	0x7D75	# <CJK>
0x8A48	0x82A5	# <CJK>
0x8A49	0x87F9	# <CJK>
0x8A4A	0x958B	# <CJK>
0x8A4B	0x968E	# <CJK>
0x8A4C	0x8C9D	# <CJK>
0x8A4D	0x51F1	# <CJK>
0x8A4E	0x52BE	# <CJK>
0x8A4F	0x5916	# <CJK>
0x8A50	0x54B3	# <CJK>
0x8A51	0x5BB3	# <CJK>
0x8A52	0x5D16	# <CJK>
0x8A53	0x6168	# <CJK>
0x8A54	0x6982	# <CJK>
0x8A55	0x6DAF	# <CJK>
0x8A56	0x788D	# <CJK>
0x8A57	0x84CB	# <CJK>
0x8A58	0x8857	# <CJK>
0x8A59	0x8A72	# <CJK>
0x8A5A	0x93A7	# <CJK>
0x8A5B	0x9AB8	# <CJK>
0x8A5C	0x6D6C	# <CJK>
0x8A5D	0x99A8	# <CJK>
0x8A5E	0x86D9	# <CJK>
0x8A5F	0x57A3	# <CJK>
0x8A60	0x67FF	# <CJK>
0x8A61	0x86CE	# <CJK>
0x8A62	0x920E	# <CJK>
0x8A63	0x5283	# <CJK>
0x8A64	0x5687	# <CJK>
0x8A65	0x5404	# <CJK>
0x8A66	0x5ED3	# <CJK>
0x8A67	0x62E1	# <CJK>
0x8A68	0x64B9	# <CJK>
0x8A69	0x683C	# <CJK>
0x8A6A	0x6838	# <CJK>
0x8A6B	0x6BBB	# <CJK>
0x8A6C	0x7372	# <CJK>
0x8A6D	0x78BA	# <CJK>
0x8A6E	0x7A6B	# <CJK>
0x8A6F	0x899A	# <CJK>
0x8A70	0x89D2	# <CJK>
0x8A71	0x8D6B	# <CJK>
0x8A72	0x8F03	# <CJK>
0x8A73	0x90ED	# <CJK>
0x8A74	0x95A3	# <CJK>
0x8A75	0x9694	# <CJK>
0x8A76	0x9769	# <CJK>
0x8A77	0x5B66	# <CJK>
0x8A78	0x5CB3	# <CJK>
0x8A79	0x697D	# <CJK>
0x8A7A	0x984D	# <CJK>
0x8A7B	0x984E	# <CJK>
0x8A7C	0x639B	# <CJK>
0x8A7D	0x7B20	# <CJK>
0x8A7E	0x6A2B	# <CJK>
0x8A80	0x6A7F	# <CJK>
0x8A81	0x68B6	# <CJK>
0x8A82	0x9C0D	# <CJK>
0x8A83	0x6F5F	# <CJK>
0x8A84	0x5272	# <CJK>
0x8A85	0x559D	# <CJK>
0x8A86	0x6070	# <CJK>
0x8A87	0x62EC	# <CJK>
0x8A88	0x6D3B	# <CJK>
0x8A89	0x6E07	# <CJK>
0x8A8A	0x6ED1	# <CJK>
0x8A8B	0x845B	# <CJK>
0x8A8C	0x8910	# <CJK>
0x8A8D	0x8F44	# <CJK>
0x8A8E	0x4E14	# <CJK>
0x8A8F	0x9C39	# <CJK>
0x8A90	0x53F6	# <CJK>
0x8A91	0x691B	# <CJK>
0x8A92	0x6A3A	# <CJK>
0x8A93	0x9784	# <CJK>
0x8A94	0x682A	# <CJK>
0x8A95	0x515C	# <CJK>
0x8A96	0x7AC3	# <CJK>
0x8A97	0x84B2	# <CJK>
0x8A98	0x91DC	# <CJK>
0x8A99	0x938C	# <CJK>
0x8A9A	0x565B	# <CJK>
0x8A9B	0x9D28	# <CJK>
0x8A9C	0x6822	# <CJK>
0x8A9D	0x8305	# <CJK>
0x8A9E	0x8431	# <CJK>
0x8A9F	0x7CA5	# <CJK>
0x8AA0	0x5208	# <CJK>
0x8AA1	0x82C5	# <CJK>
0x8AA2	0x74E6	# <CJK>
0x8AA3	0x4E7E	# <CJK>
0x8AA4	0x4F83	# <CJK>
0x8AA5	0x51A0	# <CJK>
0x8AA6	0x5BD2	# <CJK>
0x8AA7	0x520A	# <CJK>
0x8AA8	0x52D8	# <CJK>
0x8AA9	0x52E7	# <CJK>
0x8AAA	0x5DFB	# <CJK>
0x8AAB	0x559A	# <CJK>
0x8AAC	0x582A	# <CJK>
0x8AAD	0x59E6	# <CJK>
0x8AAE	0x5B8C	# <CJK>
0x8AAF	0x5B98	# <CJK>
0x8AB0	0x5BDB	# <CJK>
0x8AB1	0x5E72	# <CJK>
0x8AB2	0x5E79	# <CJK>
0x8AB3	0x60A3	# <CJK>
0x8AB4	0x611F	# <CJK>
0x8AB5	0x6163	# <CJK>
0x8AB6	0x61BE	# <CJK>
0x8AB7	0x63DB	# <CJK>
0x8AB8	0x6562	# <CJK>
0x8AB9	0x67D1	# <CJK>
0x8ABA	0x6853	# <CJK>
0x8ABB	0x68FA	# <CJK>
0x8ABC	0x6B3E	# <CJK>
0x8ABD	0x6B53	# <CJK>
0x8ABE	0x6C57	# <CJK>
0x8ABF	0x6F22	# <CJK>
0x8AC0	0x6F97	# <CJK>
0x8AC1	0x6F45	# <CJK>
0x8AC2	0x74B0	# <CJK>
0x8AC3	0x7518	# <CJK>
0x8AC4	0x76E3	# <CJK>
0x8AC5	0x770B	# <CJK>
0x8AC6	0x7AFF	# <CJK>
0x8AC7	0x7BA1	# <CJK>
0x8AC8	0x7C21	# <CJK>
0x8AC9	0x7DE9	# <CJK>
0x8ACA	0x7F36	# <CJK>
0x8ACB	0x7FF0	# <CJK>
0x8ACC	0x809D	# <CJK>
0x8ACD	0x8266	# <CJK>
0x8ACE	0x839E	# <CJK>
0x8ACF	0x89B3	# <CJK>
0x8AD0	0x8ACC	# <CJK>
0x8AD1	0x8CAB	# <CJK>
0x8AD2	0x9084	# <CJK>
0x8AD3	0x9451	# <CJK>
0x8AD4	0x9593	# <CJK>
0x8AD5	0x9591	# <CJK>
0x8AD6	0x95A2	# <CJK>
0x8AD7	0x9665	# <CJK>
0x8AD8	0x97D3	# <CJK>
0x8AD9	0x9928	# <CJK>
0x8ADA	0x8218	# <CJK>
0x8ADB	0x4E38	# <CJK>
0x8ADC	0x542B	# <CJK>
0x8ADD	0x5CB8	# <CJK>
0x8ADE	0x5DCC	# <CJK>
0x8ADF	0x73A9	# <CJK>
0x8AE0	0x764C	# <CJK>
0x8AE1	0x773C	# <CJK>
0x8AE2	0x5CA9	# <CJK>
0x8AE3	0x7FEB	# <CJK>
0x8AE4	0x8D0B	# <CJK>
0x8AE5	0x96C1	# <CJK>
0x8AE6	0x9811	# <CJK>
0x8AE7	0x9854	# <CJK>
0x8AE8	0x9858	# <CJK>
0x8AE9	0x4F01	# <CJK>
0x8AEA	0x4F0E	# <CJK>
0x8AEB	0x5371	# <CJK>
0x8AEC	0x559C	# <CJK>
0x8AED	0x5668	# <CJK>
0x8AEE	0x57FA	# <CJK>
0x8AEF	0x5947	# <CJK>
0x8AF0	0x5B09	# <CJK>
0x8AF1	0x5BC4	# <CJK>
0x8AF2	0x5C90	# <CJK>
0x8AF3	0x5E0C	# <CJK>
0x8AF4	0x5E7E	# <CJK>
0x8AF5	0x5FCC	# <CJK>
0x8AF6	0x63EE	# <CJK>
0x8AF7	0x673A	# <CJK>
0x8AF8	0x65D7	# <CJK>
0x8AF9	0x65E2	# <CJK>
0x8AFA	0x671F	# <CJK>
0x8AFB	0x68CB	# <CJK>
0x8AFC	0x68C4	# <CJK>
0x8B40	0x6A5F	# <CJK>
0x8B41	0x5E30	# <CJK>
0x8B42	0x6BC5	# <CJK>
0x8B43	0x6C17	# <CJK>
0x8B44	0x6C7D	# <CJK>
0x8B45	0x757F	# <CJK>
0x8B46	0x7948	# <CJK>
0x8B47	0x5B63	# <CJK>
0x8B48	0x7A00	# <CJK>
0x8B49	0x7D00	# <CJK>
0x8B4A	0x5FBD	# <CJK>
0x8B4B	0x898F	# <CJK>
0x8B4C	0x8A18	# <CJK>
0x8B4D	0x8CB4	# <CJK>
0x8B4E	0x8D77	# <CJK>
0x8B4F	0x8ECC	# <CJK>
0x8B50	0x8F1D	# <CJK>
0x8B51	0x98E2	# <CJK>
0x8B52	0x9A0E	# <CJK>
0x8B53	0x9B3C	# <CJK>
0x8B54	0x4E80	# <CJK>
0x8B55	0x507D	# <CJK>
0x8B56	0x5100	# <CJK>
0x8B57	0x5993	# <CJK>
0x8B58	0x5B9C	# <CJK>
0x8B59	0x622F	# <CJK>
0x8B5A	0x6280	# <CJK>
0x8B5B	0x64EC	# <CJK>
0x8B5C	0x6B3A	# <CJK>
0x8B5D	0x72A0	# <CJK>
0x8B5E	0x7591	# <CJK>
0x8B5F	0x7947	# <CJK>
0x8B60	0x7FA9	# <CJK>
0x8B61	0x87FB	# <CJK>
0x8B62	0x8ABC	# <CJK>
0x8B63	0x8B70	# <CJK>
0x8B64	0x63AC	# <CJK>
0x8B65	0x83CA	# <CJK>
0x8B66	0x97A0	# <CJK>
0x8B67	0x5409	# <CJK>
0x8B68	0x5403	# <CJK>
0x8B69	0x55AB	# <CJK>
0x8B6A	0x6854	# <CJK>
0x8B6B	0x6A58	# <CJK>
0x8B6C	0x8A70	# <CJK>
0x8B6D	0x7827	# <CJK>
0x8B6E	0x6775	# <CJK>
0x8B6F	0x9ECD	# <CJK>
0x8B70	0x5374	# <CJK>
0x8B71	0x5BA2	# <CJK>
0x8B72	0x811A	# <CJK>
0x8B73	0x8650	# <CJK>
0x8B74	0x9006	# <CJK>
0x8B75	0x4E18	# <CJK>
0x8B76	0x4E45	# <CJK>
0x8B77	0x4EC7	# <CJK>
0x8B78	0x4F11	# <CJK>
0x8B79	0x53CA	# <CJK>
0x8B7A	0x5438	# <CJK>
0x8B7B	0x5BAE	# <CJK>
0x8B7C	0x5F13	# <CJK>
0x8B7D	0x6025	# <CJK>
0x8B7E	0x6551	# <CJK>
0x8B80	0x673D	# <CJK>
0x8B81	0x6C42	# <CJK>
0x8B82	0x6C72	# <CJK>
0x8B83	0x6CE3	# <CJK>
0x8B84	0x7078	# <CJK>
0x8B85	0x7403	# <CJK>
0x8B86	0x7A76	# <CJK>
0x8B87	0x7AAE	# <CJK>
0x8B88	0x7B08	# <CJK>
0x8B89	0x7D1A	# <CJK>
0x8B8A	0x7CFE	# <CJK>
0x8B8B	0x7D66	# <CJK>
0x8B8C	0x65E7	# <CJK>
0x8B8D	0x725B	# <CJK>
0x8B8E	0x53BB	# <CJK>
0x8B8F	0x5C45	# <CJK>
0x8B90	0x5DE8	# <CJK>
0x8B91	0x62D2	# <CJK>
0x8B92	0x62E0	# <CJK>
0x8B93	0x6319	# <CJK>
0x8B94	0x6E20	# <CJK>
0x8B95	0x865A	# <CJK>
0x8B96	0x8A31	# <CJK>
0x8B97	0x8DDD	# <CJK>
0x8B98	0x92F8	# <CJK>
0x8B99	0x6F01	# <CJK>
0x8B9A	0x79A6	# <CJK>
0x8B9B	0x9B5A	# <CJK>
0x8B9C	0x4EA8	# <CJK>
0x8B9D	0x4EAB	# <CJK>
0x8B9E	0x4EAC	# <CJK>
0x8B9F	0x4F9B	# <CJK>
0x8BA0	0x4FA0	# <CJK>
0x8BA1	0x50D1	# <CJK>
0x8BA2	0x5147	# <CJK>
0x8BA3	0x7AF6	# <CJK>
0x8BA4	0x5171	# <CJK>
0x8BA5	0x51F6	# <CJK>
0x8BA6	0x5354	# <CJK>
0x8BA7	0x5321	# <CJK>
0x8BA8	0x537F	# <CJK>
0x8BA9	0x53EB	# <CJK>
0x8BAA	0x55AC	# <CJK>
0x8BAB	0x5883	# <CJK>
0x8BAC	0x5CE1	# <CJK>
0x8BAD	0x5F37	# <CJK>
0x8BAE	0x5F4A	# <CJK>
0x8BAF	0x602F	# <CJK>
0x8BB0	0x6050	# <CJK>
0x8BB1	0x606D	# <CJK>
0x8BB2	0x631F	# <CJK>
0x8BB3	0x6559	# <CJK>
0x8BB4	0x6A4B	# <CJK>
0x8BB5	0x6CC1	# <CJK>
0x8BB6	0x72C2	# <CJK>
0x8BB7	0x72ED	# <CJK>
0x8BB8	0x77EF	# <CJK>
0x8BB9	0x80F8	# <CJK>
0x8BBA	0x8105	# <CJK>
0x8BBB	0x8208	# <CJK>
0x8BBC	0x854E	# <CJK>
0x8BBD	0x90F7	# <CJK>
0x8BBE	0x93E1	# <CJK>
0x8BBF	0x97FF	# <CJK>
0x8BC0	0x9957	# <CJK>
0x8BC1	0x9A5A	# <CJK>
0x8BC2	0x4EF0	# <CJK>
0x8BC3	0x51DD	# <CJK>
0x8BC4	0x5C2D	# <CJK>
0x8BC5	0x6681	# <CJK>
0x8BC6	0x696D	# <CJK>
0x8BC7	0x5C40	# <CJK>
0x8BC8	0x66F2	# <CJK>
0x8BC9	0x6975	# <CJK>
0x8BCA	0x7389	# <CJK>
0x8BCB	0x6850	# <CJK>
0x8BCC	0x7C81	# <CJK>
0x8BCD	0x50C5	# <CJK>
0x8BCE	0x52E4	# <CJK>
0x8BCF	0x5747	# <CJK>
0x8BD0	0x5DFE	# <CJK>
0x8BD1	0x9326	# <CJK>
0x8BD2	0x65A4	# <CJK>
0x8BD3	0x6B23	# <CJK>
0x8BD4	0x6B3D	# <CJK>
0x8BD5	0x7434	# <CJK>
0x8BD6	0x7981	# <CJK>
0x8BD7	0x79BD	# <CJK>
0x8BD8	0x7B4B	# <CJK>
0x8BD9	0x7DCA	# <CJK>
0x8BDA	0x82B9	# <CJK>
0x8BDB	0x83CC	# <CJK>
0x8BDC	0x887F	# <CJK>
0x8BDD	0x895F	# <CJK>
0x8BDE	0x8B39	# <CJK>
0x8BDF	0x8FD1	# <CJK>
0x8BE0	0x91D1	# <CJK>
0x8BE1	0x541F	# <CJK>
0x8BE2	0x9280	# <CJK>
0x8BE3	0x4E5D	# <CJK>
0x8BE4	0x5036	# <CJK>
0x8BE5	0x53E5	# <CJK>
0x8BE6	0x533A	# <CJK>
0x8BE7	0x72D7	# <CJK>
0x8BE8	0x7396	# <CJK>
0x8BE9	0x77E9	# <CJK>
0x8BEA	0x82E6	# <CJK>
0x8BEB	0x8EAF	# <CJK>
0x8BEC	0x99C6	# <CJK>
0x8BED	0x99C8	# <CJK>
0x8BEE	0x99D2	# <CJK>
0x8BEF	0x5177	# <CJK>
0x8BF0	0x611A	# <CJK>
0x8BF1	0x865E	# <CJK>
0x8BF2	0x55B0	# <CJK>
0x8BF3	0x7A7A	# <CJK>
0x8BF4	0x5076	# <CJK>
0x8BF5	0x5BD3	# <CJK>
0x8BF6	0x9047	# <CJK>
0x8BF7	0x9685	# <CJK>
0x8BF8	0x4E32	# <CJK>
0x8BF9	0x6ADB	# <CJK>
0x8BFA	0x91E7	# <CJK>
0x8BFB	0x5C51	# <CJK>
0x8BFC	0x5C48	# <CJK>
0x8C40	0x6398	# <CJK>
0x8C41	0x7A9F	# <CJK>
0x8C42	0x6C93	# <CJK>
0x8C43	0x9774	# <CJK>
0x8C44	0x8F61	# <CJK>
0x8C45	0x7AAA	# <CJK>
0x8C46	0x718A	# <CJK>
0x8C47	0x9688	# <CJK>
0x8C48	0x7C82	# <CJK>
0x8C49	0x6817	# <CJK>
0x8C4A	0x7E70	# <CJK>
0x8C4B	0x6851	# <CJK>
0x8C4C	0x936C	# <CJK>
0x8C4D	0x52F2	# <CJK>
0x8C4E	0x541B	# <CJK>
0x8C4F	0x85AB	# <CJK>
0x8C50	0x8A13	# <CJK>
0x8C51	0x7FA4	# <CJK>
0x8C52	0x8ECD	# <CJK>
0x8C53	0x90E1	# <CJK>
0x8C54	0x5366	# <CJK>
0x8C55	0x8888	# <CJK>
0x8C56	0x7941	# <CJK>
0x8C57	0x4FC2	# <CJK>
0x8C58	0x50BE	# <CJK>
0x8C59	0x5211	# <CJK>
0x8C5A	0x5144	# <CJK>
0x8C5B	0x5553	# <CJK>
0x8C5C	0x572D	# <CJK>
0x8C5D	0x73EA	# <CJK>
0x8C5E	0x578B	# <CJK>
0x8C5F	0x5951	# <CJK>
0x8C60	0x5F62	# <CJK>
0x8C61	0x5F84	# <CJK>
0x8C62	0x6075	# <CJK>
0x8C63	0x6176	# <CJK>
0x8C64	0x6167	# <CJK>
0x8C65	0x61A9	# <CJK>
0x8C66	0x63B2	# <CJK>
0x8C67	0x643A	# <CJK>
0x8C68	0x656C	# <CJK>
0x8C69	0x666F	# <CJK>
0x8C6A	0x6842	# <CJK>
0x8C6B	0x6E13	# <CJK>
0x8C6C	0x7566	# <CJK>
0x8C6D	0x7A3D	# <CJK>
0x8C6E	0x7CFB	# <CJK>
0x8C6F	0x7D4C	# <CJK>
0x8C70	0x7D99	# <CJK>
0x8C71	0x7E4B	# <CJK>
0x8C72	0x7F6B	# <CJK>
0x8C73	0x830E	# <CJK>
0x8C74	0x834A	# <CJK>
0x8C75	0x86CD	# <CJK>
0x8C76	0x8A08	# <CJK>
0x8C77	0x8A63	# <CJK>
0x8C78	0x8B66	# <CJK>
0x8C79	0x8EFD	# <CJK>
0x8C7A	0x981A	# <CJK>
0x8C7B	0x9D8F	# <CJK>
0x8C7C	0x82B8	# <CJK>
0x8C7D	0x8FCE	# <CJK>
0x8C7E	0x9BE8	# <CJK>
0x8C80	0x5287	# <CJK>
0x8C81	0x621F	# <CJK>
0x8C82	0x6483	# <CJK>
0x8C83	0x6FC0	# <CJK>
0x8C84	0x9699	# <CJK>
0x8C85	0x6841	# <CJK>
0x8C86	0x5091	# <CJK>
0x8C87	0x6B20	# <CJK>
0x8C88	0x6C7A	# <CJK>
0x8C89	0x6F54	# <CJK>
0x8C8A	0x7A74	# <CJK>
0x8C8B	0x7D50	# <CJK>
0x8C8C	0x8840	# <CJK>
0x8C8D	0x8A23	# <CJK>
0x8C8E	0x6708	# <CJK>
0x8C8F	0x4EF6	# <CJK>
0x8C90	0x5039	# <CJK>
0x8C91	0x5026	# <CJK>
0x8C92	0x5065	# <CJK>
0x8C93	0x517C	# <CJK>
0x8C94	0x5238	# <CJK>
0x8C95	0x5263	# <CJK>
0x8C96	0x55A7	# <CJK>
0x8C97	0x570F	# <CJK>
0x8C98	0x5805	# <CJK>
0x8C99	0x5ACC	# <CJK>
0x8C9A	0x5EFA	# <CJK>
0x8C9B	0x61B2	# <CJK>
0x8C9C	0x61F8	# <CJK>
0x8C9D	0x62F3	# <CJK>
0x8C9E	0x6372	# <CJK>
0x8C9F	0x691C	# <CJK>
0x8CA0	0x6A29	# <CJK>
0x8CA1	0x727D	# <CJK>
0x8CA2	0x72AC	# <CJK>
0x8CA3	0x732E	# <CJK>
0x8CA4	0x7814	# <CJK>
0x8CA5	0x786F	# <CJK>
0x8CA6	0x7D79	# <CJK>
0x8CA7	0x770C	# <CJK>
0x8CA8	0x80A9	# <CJK>
0x8CA9	0x898B	# <CJK>
0x8CAA	0x8B19	# <CJK>
0x8CAB	0x8CE2	# <CJK>
0x8CAC	0x8ED2	# <CJK>
0x8CAD	0x9063	# <CJK>
0x8CAE	0x9375	# <CJK>
0x8CAF	0x967A	# <CJK>
0x8CB0	0x9855	# <CJK>
0x8CB1	0x9A13	# <CJK>
0x8CB2	0x9E78	# <CJK>
0x8CB3	0x5143	# <CJK>
0x8CB4	0x539F	# <CJK>
0x8CB5	0x53B3	# <CJK>
0x8CB6	0x5E7B	# <CJK>
0x8CB7	0x5F26	# <CJK>
0x8CB8	0x6E1B	# <CJK>
0x8CB9	0x6E90	# <CJK>
0x8CBA	0x7384	# <CJK>
0x8CBB	0x73FE	# <CJK>
0x8CBC	0x7D43	# <CJK>
0x8CBD	0x8237	# <CJK>
0x8CBE	0x8A00	# <CJK>
0x8CBF	0x8AFA	# <CJK>
0x8CC0	0x9650	# <CJK>
0x8CC1	0x4E4E	# <CJK>
0x8CC2	0x500B	# <CJK>
0x8CC3	0x53E4	# <CJK>
0x8CC4	0x547C	# <CJK>
0x8CC5	0x56FA	# <CJK>
0x8CC6	0x59D1	# <CJK>
0x8CC7	0x5B64	# <CJK>
0x8CC8	0x5DF1	# <CJK>
0x8CC9	0x5EAB	# <CJK>
0x8CCA	0x5F27	# <CJK>
0x8CCB	0x6238	# <CJK>
0x8CCC	0x6545	# <CJK>
0x8CCD	0x67AF	# <CJK>
0x8CCE	0x6E56	# <CJK>
0x8CCF	0x72D0	# <CJK>
0x8CD0	0x7CCA	# <CJK>
0x8CD1	0x88B4	# <CJK>
0x8CD2	0x80A1	# <CJK>
0x8CD3	0x80E1	# <CJK>
0x8CD4	0x83F0	# <CJK>
0x8CD5	0x864E	# <CJK>
0x8CD6	0x8A87	# <CJK>
0x8CD7	0x8DE8	# <CJK>
0x8CD8	0x9237	# <CJK>
0x8CD9	0x96C7	# <CJK>
0x8CDA	0x9867	# <CJK>
0x8CDB	0x9F13	# <CJK>
0x8CDC	0x4E94	# <CJK>
0x8CDD	0x4E92	# <CJK>
0x8CDE	0x4F0D	# <CJK>
0x8CDF	0x5348	# <CJK>
0x8CE0	0x5449	# <CJK>
0x8CE1	0x543E	# <CJK>
0x8CE2	0x5A2F	# <CJK>
0x8CE3	0x5F8C	# <CJK>
0x8CE4	0x5FA1	# <CJK>
0x8CE5	0x609F	# <CJK>
0x8CE6	0x68A7	# <CJK>
0x8CE7	0x6A8E	# <CJK>
0x8CE8	0x745A	# <CJK>
0x8CE9	0x7881	# <CJK>
0x8CEA	0x8A9E	# <CJK>
0x8CEB	0x8AA4	# <CJK>
0x8CEC	0x8B77	# <CJK>
0x8CED	0x9190	# <CJK>
0x8CEE	0x4E5E	# <CJK>
0x8CEF	0x9BC9	# <CJK>
0x8CF0	0x4EA4	# <CJK>
0x8CF1	0x4F7C	# <CJK>
0x8CF2	0x4FAF	# <CJK>
0x8CF3	0x5019	# <CJK>
0x8CF4	0x5016	# <CJK>
0x8CF5	0x5149	# <CJK>
0x8CF6	0x516C	# <CJK>
0x8CF7	0x529F	# <CJK>
0x8CF8	0x52B9	# <CJK>
0x8CF9	0x52FE	# <CJK>
0x8CFA	0x539A	# <CJK>
0x8CFB	0x53E3	# <CJK>
0x8CFC	0x5411	# <CJK>
0x8D40	0x540E	# <CJK>
0x8D41	0x5589	# <CJK>
0x8D42	0x5751	# <CJK>
0x8D43	0x57A2	# <CJK>
0x8D44	0x597D	# <CJK>
0x8D45	0x5B54	# <CJK>
0x8D46	0x5B5D	# <CJK>
0x8D47	0x5B8F	# <CJK>
0x8D48	0x5DE5	# <CJK>
0x8D49	0x5DE7	# <CJK>
0x8D4A	0x5DF7	# <CJK>
0x8D4B	0x5E78	# <CJK>
0x8D4C	0x5E83	# <CJK>
0x8D4D	0x5E9A	# <CJK>
0x8D4E	0x5EB7	# <CJK>
0x8D4F	0x5F18	# <CJK>
0x8D50	0x6052	# <CJK>
0x8D51	0x614C	# <CJK>
0x8D52	0x6297	# <CJK>
0x8D53	0x62D8	# <CJK>
0x8D54	0x63A7	# <CJK>
0x8D55	0x653B	# <CJK>
0x8D56	0x6602	# <CJK>
0x8D57	0x6643	# <CJK>
0x8D58	0x66F4	# <CJK>
0x8D59	0x676D	# <CJK>
0x8D5A	0x6821	# <CJK>
0x8D5B	0x6897	# <CJK>
0x8D5C	0x69CB	# <CJK>
0x8D5D	0x6C5F	# <CJK>
0x8D5E	0x6D2A	# <CJK>
0x8D5F	0x6D69	# <CJK>
0x8D60	0x6E2F	# <CJK>
0x8D61	0x6E9D	# <CJK>
0x8D62	0x7532	# <CJK>
0x8D63	0x7687	# <CJK>
0x8D64	0x786C	# <CJK>
0x8D65	0x7A3F	# <CJK>
0x8D66	0x7CE0	# <CJK>
0x8D67	0x7D05	# <CJK>
0x8D68	0x7D18	# <CJK>
0x8D69	0x7D5E	# <CJK>
0x8D6A	0x7DB1	# <CJK>
0x8D6B	0x8015	# <CJK>
0x8D6C	0x8003	# <CJK>
0x8D6D	0x80AF	# <CJK>
0x8D6E	0x80B1	# <CJK>
0x8D6F	0x8154	# <CJK>
0x8D70	0x818F	# <CJK>
0x8D71	0x822A	# <CJK>
0x8D72	0x8352	# <CJK>
0x8D73	0x884C	# <CJK>
0x8D74	0x8861	# <CJK>
0x8D75	0x8B1B	# <CJK>
0x8D76	0x8CA2	# <CJK>
0x8D77	0x8CFC	# <CJK>
0x8D78	0x90CA	# <CJK>
0x8D79	0x9175	# <CJK>
0x8D7A	0x9271	# <CJK>
0x8D7B	0x783F	# <CJK>
0x8D7C	0x92FC	# <CJK>
0x8D7D	0x95A4	# <CJK>
0x8D7E	0x964D	# <CJK>
0x8D80	0x9805	# <CJK>
0x8D81	0x9999	# <CJK>
0x8D82	0x9AD8	# <CJK>
0x8D83	0x9D3B	# <CJK>
0x8D84	0x525B	# <CJK>
0x8D85	0x52AB	# <CJK>
0x8D86	0x53F7	# <CJK>
0x8D87	0x5408	# <CJK>
0x8D88	0x58D5	# <CJK>
0x8D89	0x62F7	# <CJK>
0x8D8A	0x6FE0	# <CJK>
0x8D8B	0x8C6A	# <CJK>
0x8D8C	0x8F5F	# <CJK>
0x8D8D	0x9EB9	# <CJK>
0x8D8E	0x514B	# <CJK>
0x8D8F	0x523B	# <CJK>
0x8D90	0x544A	# <CJK>
0x8D91	0x56FD	# <CJK>
0x8D92	0x7A40	# <CJK>
0x8D93	0x9177	# <CJK>
0x8D94	0x9D60	# <CJK>
0x8D95	0x9ED2	# <CJK>
0x8D96	0x7344	# <CJK>
0x8D97	0x6F09	# <CJK>
0x8D98	0x8170	# <CJK>
0x8D99	0x7511	# <CJK>
0x8D9A	0x5FFD	# <CJK>
0x8D9B	0x60DA	# <CJK>
0x8D9C	0x9AA8	# <CJK>
0x8D9D	0x72DB	# <CJK>
0x8D9E	0x8FBC	# <CJK>
0x8D9F	0x6B64	# <CJK>
0x8DA0	0x9803	# <CJK>
0x8DA1	0x4ECA	# <CJK>
0x8DA2	0x56F0	# <CJK>
0x8DA3	0x5764	# <CJK>
0x8DA4	0x58BE	# <CJK>
0x8DA5	0x5A5A	# <CJK>
0x8DA6	0x6068	# <CJK>
0x8DA7	0x61C7	# <CJK>
0x8DA8	0x660F	# <CJK>
0x8DA9	0x6606	# <CJK>
0x8DAA	0x6839	# <CJK>
0x8DAB	0x68B1	# <CJK>
0x8DAC	0x6DF7	# <CJK>
0x8DAD	0x75D5	# <CJK>
0x8DAE	0x7D3A	# <CJK>
0x8DAF	0x826E	# <CJK>
0x8DB0	0x9B42	# <CJK>
0x8DB1	0x4E9B	# <CJK>
0x8DB2	0x4F50	# <CJK>
0x8DB3	0x53C9	# <CJK>
0x8DB4	0x5506	# <CJK>
0x8DB5	0x5D6F	# <CJK>
0x8DB6	0x5DE6	# <CJK>
0x8DB7	0x5DEE	# <CJK>
0x8DB8	0x67FB	# <CJK>
0x8DB9	0x6C99	# <CJK>
0x8DBA	0x7473	# <CJK>
0x8DBB	0x7802	# <CJK>
0x8DBC	0x8A50	# <CJK>
0x8DBD	0x9396	# <CJK>
0x8DBE	0x88DF	# <CJK>
0x8DBF	0x5750	# <CJK>
0x8DC0	0x5EA7	# <CJK>
0x8DC1	0x632B	# <CJK>
0x8DC2	0x50B5	# <CJK>
0x8DC3	0x50AC	# <CJK>
0x8DC4	0x518D	# <CJK>
0x8DC5	0x6700	# <CJK>
0x8DC6	0x54C9	# <CJK>
0x8DC7	0x585E	# <CJK>
0x8DC8	0x59BB	# <CJK>
0x8DC9	0x5BB0	# <CJK>
0x8DCA	0x5F69	# <CJK>
0x8DCB	0x624D	# <CJK>
0x8DCC	0x63A1	# <CJK>
0x8DCD	0x683D	# <CJK>
0x8DCE	0x6B73	# <CJK>
0x8DCF	0x6E08	# <CJK>
0x8DD0	0x707D	# <CJK>
0x8DD1	0x91C7	# <CJK>
0x8DD2	0x7280	# <CJK>
0x8DD3	0x7815	# <CJK>
0x8DD4	0x7826	# <CJK>
0x8DD5	0x796D	# <CJK>
0x8DD6	0x658E	# <CJK>
0x8DD7	0x7D30	# <CJK>
0x8DD8	0x83DC	# <CJK>
0x8DD9	0x88C1	# <CJK>
0x8DDA	0x8F09	# <CJK>
0x8DDB	0x969B	# <CJK>
0x8DDC	0x5264	# <CJK>
0x8DDD	0x5728	# <CJK>
0x8DDE	0x6750	# <CJK>
0x8DDF	0x7F6A	# <CJK>
0x8DE0	0x8CA1	# <CJK>
0x8DE1	0x51B4	# <CJK>
0x8DE2	0x5742	# <CJK>
0x8DE3	0x962A	# <CJK>
0x8DE4	0x583A	# <CJK>
0x8DE5	0x698A	# <CJK>
0x8DE6	0x80B4	# <CJK>
0x8DE7	0x54B2	# <CJK>
0x8DE8	0x5D0E	# <CJK>
0x8DE9	0x57FC	# <CJK>
0x8DEA	0x7895	# <CJK>
0x8DEB	0x9DFA	# <CJK>
0x8DEC	0x4F5C	# <CJK>
0x8DED	0x524A	# <CJK>
0x8DEE	0x548B	# <CJK>
0x8DEF	0x643E	# <CJK>
0x8DF0	0x6628	# <CJK>
0x8DF1	0x6714	# <CJK>
0x8DF2	0x67F5	# <CJK>
0x8DF3	0x7A84	# <CJK>
0x8DF4	0x7B56	# <CJK>
0x8DF5	0x7D22	# <CJK>
0x8DF6	0x932F	# <CJK>
0x8DF7	0x685C	# <CJK>
0x8DF8	0x9BAD	# <CJK>
0x8DF9	0x7B39	# <CJK>
0x8DFA	0x5319	# <CJK>
0x8DFB	0x518A	# <CJK>
0x8DFC	0x5237	# <CJK>
0x8E40	0x5BDF	# <CJK>
0x8E41	0x62F6	# <CJK>
0x8E42	0x64AE	# <CJK>
0x8E43	0x64E6	# <CJK>
0x8E44	0x672D	# <CJK>
0x8E45	0x6BBA	# <CJK>
0x8E46	0x85A9	# <CJK>
0x8E47	0x96D1	# <CJK>
0x8E48	0x7690	# <CJK>
0x8E49	0x9BD6	# <CJK>
0x8E4A	0x634C	# <CJK>
0x8E4B	0x9306	# <CJK>
0x8E4C	0x9BAB	# <CJK>
0x8E4D	0x76BF	# <CJK>
0x8E4E	0x6652	# <CJK>
0x8E4F	0x4E09	# <CJK>
0x8E50	0x5098	# <CJK>
0x8E51	0x53C2	# <CJK>
0x8E52	0x5C71	# <CJK>
0x8E53	0x60E8	# <CJK>
0x8E54	0x6492	# <CJK>
0x8E55	0x6563	# <CJK>
0x8E56	0x685F	# <CJK>
0x8E57	0x71E6	# <CJK>
0x8E58	0x73CA	# <CJK>
0x8E59	0x7523	# <CJK>
0x8E5A	0x7B97	# <CJK>
0x8E5B	0x7E82	# <CJK>
0x8E5C	0x8695	# <CJK>
0x8E5D	0x8B83	# <CJK>
0x8E5E	0x8CDB	# <CJK>
0x8E5F	0x9178	# <CJK>
0x8E60	0x9910	# <CJK>
0x8E61	0x65AC	# <CJK>
0x8E62	0x66AB	# <CJK>
0x8E63	0x6B8B	# <CJK>
0x8E64	0x4ED5	# <CJK>
0x8E65	0x4ED4	# <CJK>
0x8E66	0x4F3A	# <CJK>
0x8E67	0x4F7F	# <CJK>
0x8E68	0x523A	# <CJK>
0x8E69	0x53F8	# <CJK>
0x8E6A	0x53F2	# <CJK>
0x8E6B	0x55E3	# <CJK>
0x8E6C	0x56DB	# <CJK>
0x8E6D	0x58EB	# <CJK>
0x8E6E	0x59CB	# <CJK>
0x8E6F	0x59C9	# <CJK>
0x8E70	0x59FF	# <CJK>
0x8E71	0x5B50	# <CJK>
0x8E72	0x5C4D	# <CJK>
0x8E73	0x5E02	# <CJK>
0x8E74	0x5E2B	# <CJK>
0x8E75	0x5FD7	# <CJK>
0x8E76	0x601D	# <CJK>
0x8E77	0x6307	# <CJK>
0x8E78	0x652F	# <CJK>
0x8E79	0x5B5C	# <CJK>
0x8E7A	0x65AF	# <CJK>
0x8E7B	0x65BD	# <CJK>
0x8E7C	0x65E8	# <CJK>
0x8E7D	0x679D	# <CJK>
0x8E7E	0x6B62	# <CJK>
0x8E80	0x6B7B	# <CJK>
0x8E81	0x6C0F	# <CJK>
0x8E82	0x7345	# <CJK>
0x8E83	0x7949	# <CJK>
0x8E84	0x79C1	# <CJK>
0x8E85	0x7CF8	# <CJK>
0x8E86	0x7D19	# <CJK>
0x8E87	0x7D2B	# <CJK>
0x8E88	0x80A2	# <CJK>
0x8E89	0x8102	# <CJK>
0x8E8A	0x81F3	# <CJK>
0x8E8B	0x8996	# <CJK>
0x8E8C	0x8A5E	# <CJK>
0x8E8D	0x8A69	# <CJK>
0x8E8E	0x8A66	# <CJK>
0x8E8F	0x8A8C	# <CJK>
0x8E90	0x8AEE	# <CJK>
0x8E91	0x8CC7	# <CJK>
0x8E92	0x8CDC	# <CJK>
0x8E93	0x96CC	# <CJK>
0x8E94	0x98FC	# <CJK>
0x8E95	0x6B6F	# <CJK>
0x8E96	0x4E8B	# <CJK>
0x8E97	0x4F3C	# <CJK>
0x8E98	0x4F8D	# <CJK>
0x8E99	0x5150	# <CJK>
0x8E9A	0x5B57	# <CJK>
0x8E9B	0x5BFA	# <CJK>
0x8E9C	0x6148	# <CJK>
0x8E9D	0x6301	# <CJK>
0x8E9E	0x6642	# <CJK>
0x8E9F	0x6B21	# <CJK>
0x8EA0	0x6ECB	# <CJK>
0x8EA1	0x6CBB	# <CJK>
0x8EA2	0x723E	# <CJK>
0x8EA3	0x74BD	# <CJK>
0x8EA4	0x75D4	# <CJK>
0x8EA5	0x78C1	# <CJK>
0x8EA6	0x793A	# <CJK>
0x8EA7	0x800C	# <CJK>
0x8EA8	0x8033	# <CJK>
0x8EA9	0x81EA	# <CJK>
0x8EAA	0x8494	# <CJK>
0x8EAB	0x8F9E	# <CJK>
0x8EAC	0x6C50	# <CJK>
0x8EAD	0x9E7F	# <CJK>
0x8EAE	0x5F0F	# <CJK>
0x8EAF	0x8B58	# <CJK>
0x8EB0	0x9D2B	# <CJK>
0x8EB1	0x7AFA	# <CJK>
0x8EB2	0x8EF8	# <CJK>
0x8EB3	0x5B8D	# <CJK>
0x8EB4	0x96EB	# <CJK>
0x8EB5	0x4E03	# <CJK>
0x8EB6	0x53F1	# <CJK>
0x8EB7	0x57F7	# <CJK>
0x8EB8	0x5931	# <CJK>
0x8EB9	0x5AC9	# <CJK>
0x8EBA	0x5BA4	# <CJK>
0x8EBB	0x6089	# <CJK>
0x8EBC	0x6E7F	# <CJK>
0x8EBD	0x6F06	# <CJK>
0x8EBE	0x75BE	# <CJK>
0x8EBF	0x8CEA	# <CJK>
0x8EC0	0x5B9F	# <CJK>
0x8EC1	0x8500	# <CJK>
0x8EC2	0x7BE0	# <CJK>
0x8EC3	0x5072	# <CJK>
0x8EC4	0x67F4	# <CJK>
0x8EC5	0x829D	# <CJK>
0x8EC6	0x5C61	# <CJK>
0x8EC7	0x854A	# <CJK>
0x8EC8	0x7E1E	# <CJK>
0x8EC9	0x820E	# <CJK>
0x8ECA	0x5199	# <CJK>
0x8ECB	0x5C04	# <CJK>
0x8ECC	0x6368	# <CJK>
0x8ECD	0x8D66	# <CJK>
0x8ECE	0x659C	# <CJK>
0x8ECF	0x716E	# <CJK>
0x8ED0	0x793E	# <CJK>
0x8ED1	0x7D17	# <CJK>
0x8ED2	0x8005	# <CJK>
0x8ED3	0x8B1D	# <CJK>
0x8ED4	0x8ECA	# <CJK>
0x8ED5	0x906E	# <CJK>
0x8ED6	0x86C7	# <CJK>
0x8ED7	0x90AA	# <CJK>
0x8ED8	0x501F	# <CJK>
0x8ED9	0x52FA	# <CJK>
0x8EDA	0x5C3A	# <CJK>
0x8EDB	0x6753	# <CJK>
0x8EDC	0x707C	# <CJK>
0x8EDD	0x7235	# <CJK>
0x8EDE	0x914C	# <CJK>
0x8EDF	0x91C8	# <CJK>
0x8EE0	0x932B	# <CJK>
0x8EE1	0x82E5	# <CJK>
0x8EE2	0x5BC2	# <CJK>
0x8EE3	0x5F31	# <CJK>
0x8EE4	0x60F9	# <CJK>
0x8EE5	0x4E3B	# <CJK>
0x8EE6	0x53D6	# <CJK>
0x8EE7	0x5B88	# <CJK>
0x8EE8	0x624B	# <CJK>
0x8EE9	0x6731	# <CJK>
0x8EEA	0x6B8A	# <CJK>
0x8EEB	0x72E9	# <CJK>
0x8EEC	0x73E0	# <CJK>
0x8EED	0x7A2E	# <CJK>
0x8EEE	0x816B	# <CJK>
0x8EEF	0x8DA3	# <CJK>
0x8EF0	0x9152	# <CJK>
0x8EF1	0x9996	# <CJK>
0x8EF2	0x5112	# <CJK>
0x8EF3	0x53D7	# <CJK>
0x8EF4	0x546A	# <CJK>
0x8EF5	0x5BFF	# <CJK>
0x8EF6	0x6388	# <CJK>
0x8EF7	0x6A39	# <CJK>
0x8EF8	0x7DAC	# <CJK>
0x8EF9	0x9700	# <CJK>
0x8EFA	0x56DA	# <CJK>
0x8EFB	0x53CE	# <CJK>
0x8EFC	0x5468	# <CJK>
0x8F40	0x5B97	# <CJK>
0x8F41	0x5C31	# <CJK>
0x8F42	0x5DDE	# <CJK>
0x8F43	0x4FEE	# <CJK>
0x8F44	0x6101	# <CJK>
0x8F45	0x62FE	# <CJK>
0x8F46	0x6D32	# <CJK>
0x8F47	0x79C0	# <CJK>
0x8F48	0x79CB	# <CJK>
0x8F49	0x7D42	# <CJK>
0x8F4A	0x7E4D	# <CJK>
0x8F4B	0x7FD2	# <CJK>
0x8F4C	0x81ED	# <CJK>
0x8F4D	0x821F	# <CJK>
0x8F4E	0x8490	# <CJK>
0x8F4F	0x8846	# <CJK>
0x8F50	0x8972	# <CJK>
0x8F51	0x8B90	# <CJK>
0x8F52	0x8E74	# <CJK>
0x8F53	0x8F2F	# <CJK>
0x8F54	0x9031	# <CJK>
0x8F55	0x914B	# <CJK>
0x8F56	0x916C	# <CJK>
0x8F57	0x96C6	# <CJK>
0x8F58	0x919C	# <CJK>
0x8F59	0x4EC0	# <CJK>
0x8F5A	0x4F4F	# <CJK>
0x8F5B	0x5145	# <CJK>
0x8F5C	0x5341	# <CJK>
0x8F5D	0x5F93	# <CJK>
0x8F5E	0x620E	# <CJK>
0x8F5F	0x67D4	# <CJK>
0x8F60	0x6C41	# <CJK>
0x8F61	0x6E0B	# <CJK>
0x8F62	0x7363	# <CJK>
0x8F63	0x7E26	# <CJK>
0x8F64	0x91CD	# <CJK>
0x8F65	0x9283	# <CJK>
0x8F66	0x53D4	# <CJK>
0x8F67	0x5919	# <CJK>
0x8F68	0x5BBF	# <CJK>
0x8F69	0x6DD1	# <CJK>
0x8F6A	0x795D	# <CJK>
0x8F6B	0x7E2E	# <CJK>
0x8F6C	0x7C9B	# <CJK>
0x8F6D	0x587E	# <CJK>
0x8F6E	0x719F	# <CJK>
0x8F6F	0x51FA	# <CJK>
0x8F70	0x8853	# <CJK>
0x8F71	0x8FF0	# <CJK>
0x8F72	0x4FCA	# <CJK>
0x8F73	0x5CFB	# <CJK>
0x8F74	0x6625	# <CJK>
0x8F75	0x77AC	# <CJK>
0x8F76	0x7AE3	# <CJK>
0x8F77	0x821C	# <CJK>
0x8F78	0x99FF	# <CJK>
0x8F79	0x51C6	# <CJK>
0x8F7A	0x5FAA	# <CJK>
0x8F7B	0x65EC	# <CJK>
0x8F7C	0x696F	# <CJK>
0x8F7D	0x6B89	# <CJK>
0x8F7E	0x6DF3	# <CJK>
0x8F80	0x6E96	# <CJK>
0x8F81	0x6F64	# <CJK>
0x8F82	0x76FE	# <CJK>
0x8F83	0x7D14	# <CJK>
0x8F84	0x5DE1	# <CJK>
0x8F85	0x9075	# <CJK>
0x8F86	0x9187	# <CJK>
0x8F87	0x9806	# <CJK>
0x8F88	0x51E6	# <CJK>
0x8F89	0x521D	# <CJK>
0x8F8A	0x6240	# <CJK>
0x8F8B	0x6691	# <CJK>
0x8F8C	0x66D9	# <CJK>
0x8F8D	0x6E1A	# <CJK>
0x8F8E	0x5EB6	# <CJK>
0x8F8F	0x7DD2	# <CJK>
0x8F90	0x7F72	# <CJK>
0x8F91	0x66F8	# <CJK>
0x8F92	0x85AF	# <CJK>
0x8F93	0x85F7	# <CJK>
0x8F94	0x8AF8	# <CJK>
0x8F95	0x52A9	# <CJK>
0x8F96	0x53D9	# <CJK>
0x8F97	0x5973	# <CJK>
0x8F98	0x5E8F	# <CJK>
0x8F99	0x5F90	# <CJK>
0x8F9A	0x6055	# <CJK>
0x8F9B	0x92E4	# <CJK>
0x8F9C	0x9664	# <CJK>
0x8F9D	0x50B7	# <CJK>
0x8F9E	0x511F	# <CJK>
0x8F9F	0x52DD	# <CJK>
0x8FA0	0x5320	# <CJK>
0x8FA1	0x5347	# <CJK>
0x8FA2	0x53EC	# <CJK>
0x8FA3	0x54E8	# <CJK>
0x8FA4	0x5546	# <CJK>
0x8FA5	0x5531	# <CJK>
0x8FA6	0x5617	# <CJK>
0x8FA7	0x5968	# <CJK>
0x8FA8	0x59BE	# <CJK>
0x8FA9	0x5A3C	# <CJK>
0x8FAA	0x5BB5	# <CJK>
0x8FAB	0x5C06	# <CJK>
0x8FAC	0x5C0F	# <CJK>
0x8FAD	0x5C11	# <CJK>
0x8FAE	0x5C1A	# <CJK>
0x8FAF	0x5E84	# <CJK>
0x8FB0	0x5E8A	# <CJK>
0x8FB1	0x5EE0	# <CJK>
0x8FB2	0x5F70	# <CJK>
0x8FB3	0x627F	# <CJK>
0x8FB4	0x6284	# <CJK>
0x8FB5	0x62DB	# <CJK>
0x8FB6	0x638C	# <CJK>
0x8FB7	0x6377	# <CJK>
0x8FB8	0x6607	# <CJK>
0x8FB9	0x660C	# <CJK>
0x8FBA	0x662D	# <CJK>
0x8FBB	0x6676	# <CJK>
0x8FBC	0x677E	# <CJK>
0x8FBD	0x68A2	# <CJK>
0x8FBE	0x6A1F	# <CJK>
0x8FBF	0x6A35	# <CJK>
0x8FC0	0x6CBC	# <CJK>
0x8FC1	0x6D88	# <CJK>
0x8FC2	0x6E09	# <CJK>
0x8FC3	0x6E58	# <CJK>
0x8FC4	0x713C	# <CJK>
0x8FC5	0x7126	# <CJK>
0x8FC6	0x7167	# <CJK>
0x8FC7	0x75C7	# <CJK>
0x8FC8	0x7701	# <CJK>
0x8FC9	0x785D	# <CJK>
0x8FCA	0x7901	# <CJK>
0x8FCB	0x7965	# <CJK>
0x8FCC	0x79F0	# <CJK>
0x8FCD	0x7AE0	# <CJK>
0x8FCE	0x7B11	# <CJK>
0x8FCF	0x7CA7	# <CJK>
0x8FD0	0x7D39	# <CJK>
0x8FD1	0x8096	# <CJK>
0x8FD2	0x83D6	# <CJK>
0x8FD3	0x848B	# <CJK>
0x8FD4	0x8549	# <CJK>
0x8FD5	0x885D	# <CJK>
0x8FD6	0x88F3	# <CJK>
0x8FD7	0x8A1F	# <CJK>
0x8FD8	0x8A3C	# <CJK>
0x8FD9	0x8A54	# <CJK>
0x8FDA	0x8A73	# <CJK>
0x8FDB	0x8C61	# <CJK>
0x8FDC	0x8CDE	# <CJK>
0x8FDD	0x91A4	# <CJK>
0x8FDE	0x9266	# <CJK>
0x8FDF	0x937E	# <CJK>
0x8FE0	0x9418	# <CJK>
0x8FE1	0x969C	# <CJK>
0x8FE2	0x9798	# <CJK>
0x8FE3	0x4E0A	# <CJK>
0x8FE4	0x4E08	# <CJK>
0x8FE5	0x4E1E	# <CJK>
0x8FE6	0x4E57	# <CJK>
0x8FE7	0x5197	# <CJK>
0x8FE8	0x5270	# <CJK>
0x8FE9	0x57CE	# <CJK>
0x8FEA	0x5834	# <CJK>
0x8FEB	0x58CC	# <CJK>
0x8FEC	0x5B22	# <CJK>
0x8FED	0x5E38	# <CJK>
0x8FEE	0x60C5	# <CJK>
0x8FEF	0x64FE	# <CJK>
0x8FF0	0x6761	# <CJK>
0x8FF1	0x6756	# <CJK>
0x8FF2	0x6D44	# <CJK>
0x8FF3	0x72B6	# <CJK>
0x8FF4	0x7573	# <CJK>
0x8FF5	0x7A63	# <CJK>
0x8FF6	0x84B8	# <CJK>
0x8FF7	0x8B72	# <CJK>
0x8FF8	0x91B8	# <CJK>
0x8FF9	0x9320	# <CJK>
0x8FFA	0x5631	# <CJK>
0x8FFB	0x57F4	# <CJK>
0x8FFC	0x98FE	# <CJK>
0x9040	0x62ED	# <CJK>
0x9041	0x690D	# <CJK>
0x9042	0x6B96	# <CJK>
0x9043	0x71ED	# <CJK>
0x9044	0x7E54	# <CJK>
0x9045	0x8077	# <CJK>
0x9046	0x8272	# <CJK>
0x9047	0x89E6	# <CJK>
0x9048	0x98DF	# <CJK>
0x9049	0x8755	# <CJK>
0x904A	0x8FB1	# <CJK>
0x904B	0x5C3B	# <CJK>
0x904C	0x4F38	# <CJK>
0x904D	0x4FE1	# <CJK>
0x904E	0x4FB5	# <CJK>
0x904F	0x5507	# <CJK>
0x9050	0x5A20	# <CJK>
0x9051	0x5BDD	# <CJK>
0x9052	0x5BE9	# <CJK>
0x9053	0x5FC3	# <CJK>
0x9054	0x614E	# <CJK>
0x9055	0x632F	# <CJK>
0x9056	0x65B0	# <CJK>
0x9057	0x664B	# <CJK>
0x9058	0x68EE	# <CJK>
0x9059	0x699B	# <CJK>
0x905A	0x6D78	# <CJK>
0x905B	0x6DF1	# <CJK>
0x905C	0x7533	# <CJK>
0x905D	0x75B9	# <CJK>
0x905E	0x771F	# <CJK>
0x905F	0x795E	# <CJK>
0x9060	0x79E6	# <CJK>
0x9061	0x7D33	# <CJK>
0x9062	0x81E3	# <CJK>
0x9063	0x82AF	# <CJK>
0x9064	0x85AA	# <CJK>
0x9065	0x89AA	# <CJK>
0x9066	0x8A3A	# <CJK>
0x9067	0x8EAB	# <CJK>
0x9068	0x8F9B	# <CJK>
0x9069	0x9032	# <CJK>
0x906A	0x91DD	# <CJK>
0x906B	0x9707	# <CJK>
0x906C	0x4EBA	# <CJK>
0x906D	0x4EC1	# <CJK>
0x906E	0x5203	# <CJK>
0x906F	0x5875	# <CJK>
0x9070	0x58EC	# <CJK>
0x9071	0x5C0B	# <CJK>
0x9072	0x751A	# <CJK>
0x9073	0x5C3D	# <CJK>
0x9074	0x814E	# <CJK>
0x9075	0x8A0A	# <CJK>
0x9076	0x8FC5	# <CJK>
0x9077	0x9663	# <CJK>
0x9078	0x976D	# <CJK>
0x9079	0x7B25	# <CJK>
0x907A	0x8ACF	# <CJK>
0x907B	0x9808	# <CJK>
0x907C	0x9162	# <CJK>
0x907D	0x56F3	# <CJK>
0x907E	0x53A8	# <CJK>
0x9080	0x9017	# <CJK>
0x9081	0x5439	# <CJK>
0x9082	0x5782	# <CJK>
0x9083	0x5E25	# <CJK>
0x9084	0x63A8	# <CJK>
0x9085	0x6C34	# <CJK>
0x9086	0x708A	# <CJK>
0x9087	0x7761	# <CJK>
0x9088	0x7C8B	# <CJK>
0x9089	0x7FE0	# <CJK>
0x908A	0x8870	# <CJK>
0x908B	0x9042	# <CJK>
0x908C	0x9154	# <CJK>
0x908D	0x9310	# <CJK>
0x908E	0x9318	# <CJK>
0x908F	0x968F	# <CJK>
0x9090	0x745E	# <CJK>
0x9091	0x9AC4	# <CJK>
0x9092	0x5D07	# <CJK>
0x9093	0x5D69	# <CJK>
0x9094	0x6570	# <CJK>
0x9095	0x67A2	# <CJK>
0x9096	0x8DA8	# <CJK>
0x9097	0x96DB	# <CJK>
0x9098	0x636E	# <CJK>
0x9099	0x6749	# <CJK>
0x909A	0x6919	# <CJK>
0x909B	0x83C5	# <CJK>
0x909C	0x9817	# <CJK>
0x909D	0x96C0	# <CJK>
0x909E	0x88FE	# <CJK>
0x909F	0x6F84	# <CJK>
0x90A0	0x647A	# <CJK>
0x90A1	0x5BF8	# <CJK>
0x90A2	0x4E16	# <CJK>
0x90A3	0x702C	# <CJK>
0x90A4	0x755D	# <CJK>
0x90A5	0x662F	# <CJK>
0x90A6	0x51C4	# <CJK>
0x90A7	0x5236	# <CJK>
0x90A8	0x52E2	# <CJK>
0x90A9	0x59D3	# <CJK>
0x90AA	0x5F81	# <CJK>
0x90AB	0x6027	# <CJK>
0x90AC	0x6210	# <CJK>
0x90AD	0x653F	# <CJK>
0x90AE	0x6574	# <CJK>
0x90AF	0x661F	# <CJK>
0x90B0	0x6674	# <CJK>
0x90B1	0x68F2	# <CJK>
0x90B2	0x6816	# <CJK>
0x90B3	0x6B63	# <CJK>
0x90B4	0x6E05	# <CJK>
0x90B5	0x7272	# <CJK>
0x90B6	0x751F	# <CJK>
0x90B7	0x76DB	# <CJK>
0x90B8	0x7CBE	# <CJK>
0x90B9	0x8056	# <CJK>
0x90BA	0x58F0	# <CJK>
0x90BB	0x88FD	# <CJK>
0x90BC	0x897F	# <CJK>
0x90BD	0x8AA0	# <CJK>
0x90BE	0x8A93	# <CJK>
0x90BF	0x8ACB	# <CJK>
0x90C0	0x901D	# <CJK>
0x90C1	0x9192	# <CJK>
0x90C2	0x9752	# <CJK>
0x90C3	0x9759	# <CJK>
0x90C4	0x6589	# <CJK>
0x90C5	0x7A0E	# <CJK>
0x90C6	0x8106	# <CJK>
0x90C7	0x96BB	# <CJK>
0x90C8	0x5E2D	# <CJK>
0x90C9	0x60DC	# <CJK>
0x90CA	0x621A	# <CJK>
0x90CB	0x65A5	# <CJK>
0x90CC	0x6614	# <CJK>
0x90CD	0x6790	# <CJK>
0x90CE	0x77F3	# <CJK>
0x90CF	0x7A4D	# <CJK>
0x90D0	0x7C4D	# <CJK>
0x90D1	0x7E3E	# <CJK>
0x90D2	0x810A	# <CJK>
0x90D3	0x8CAC	# <CJK>
0x90D4	0x8D64	# <CJK>
0x90D5	0x8DE1	# <CJK>
0x90D6	0x8E5F	# <CJK>
0x90D7	0x78A9	# <CJK>
0x90D8	0x5207	# <CJK>
0x90D9	0x62D9	# <CJK>
0x90DA	0x63A5	# <CJK>
0x90DB	0x6442	# <CJK>
0x90DC	0x6298	# <CJK>
0x90DD	0x8A2D	# <CJK>
0x90DE	0x7A83	# <CJK>
0x90DF	0x7BC0	# <CJK>
0x90E0	0x8AAC	# <CJK>
0x90E1	0x96EA	# <CJK>
0x90E2	0x7D76	# <CJK>
0x90E3	0x820C	# <CJK>
0x90E4	0x8749	# <CJK>
0x90E5	0x4ED9	# <CJK>
0x90E6	0x5148	# <CJK>
0x90E7	0x5343	# <CJK>
0x90E8	0x5360	# <CJK>
0x90E9	0x5BA3	# <CJK>
0x90EA	0x5C02	# <CJK>
0x90EB	0x5C16	# <CJK>
0x90EC	0x5DDD	# <CJK>
0x90ED	0x6226	# <CJK>
0x90EE	0x6247	# <CJK>
0x90EF	0x64B0	# <CJK>
0x90F0	0x6813	# <CJK>
0x90F1	0x6834	# <CJK>
0x90F2	0x6CC9	# <CJK>
0x90F3	0x6D45	# <CJK>
0x90F4	0x6D17	# <CJK>
0x90F5	0x67D3	# <CJK>
0x90F6	0x6F5C	# <CJK>
0x90F7	0x714E	# <CJK>
0x90F8	0x717D	# <CJK>
0x90F9	0x65CB	# <CJK>
0x90FA	0x7A7F	# <CJK>
0x90FB	0x7BAD	# <CJK>
0x90FC	0x7DDA	# <CJK>
0x9140	0x7E4A	# <CJK>
0x9141	0x7FA8	# <CJK>
0x9142	0x817A	# <CJK>
0x9143	0x821B	# <CJK>
0x9144	0x8239	# <CJK>
0x9145	0x85A6	# <CJK>
0x9146	0x8A6E	# <CJK>
0x9147	0x8CCE	# <CJK>
0x9148	0x8DF5	# <CJK>
0x9149	0x9078	# <CJK>
0x914A	0x9077	# <CJK>
0x914B	0x92AD	# <CJK>
0x914C	0x9291	# <CJK>
0x914D	0x9583	# <CJK>
0x914E	0x9BAE	# <CJK>
0x914F	0x524D	# <CJK>
0x9150	0x5584	# <CJK>
0x9151	0x6F38	# <CJK>
0x9152	0x7136	# <CJK>
0x9153	0x5168	# <CJK>
0x9154	0x7985	# <CJK>
0x9155	0x7E55	# <CJK>
0x9156	0x81B3	# <CJK>
0x9157	0x7CCE	# <CJK>
0x9158	0x564C	# <CJK>
0x9159	0x5851	# <CJK>
0x915A	0x5CA8	# <CJK>
0x915B	0x63AA	# <CJK>
0x915C	0x66FE	# <CJK>
0x915D	0x66FD	# <CJK>
0x915E	0x695A	# <CJK>
0x915F	0x72D9	# <CJK>
0x9160	0x758F	# <CJK>
0x9161	0x758E	# <CJK>
0x9162	0x790E	# <CJK>
0x9163	0x7956	# <CJK>
0x9164	0x79DF	# <CJK>
0x9165	0x7C97	# <CJK>
0x9166	0x7D20	# <CJK>
0x9167	0x7D44	# <CJK>
0x9168	0x8607	# <CJK>
0x9169	0x8A34	# <CJK>
0x916A	0x963B	# <CJK>
0x916B	0x9061	# <CJK>
0x916C	0x9F20	# <CJK>
0x916D	0x50E7	# <CJK>
0x916E	0x5275	# <CJK>
0x916F	0x53CC	# <CJK>
0x9170	0x53E2	# <CJK>
0x9171	0x5009	# <CJK>
0x9172	0x55AA	# <CJK>
0x9173	0x58EE	# <CJK>
0x9174	0x594F	# <CJK>
0x9175	0x723D	# <CJK>
0x9176	0x5B8B	# <CJK>
0x9177	0x5C64	# <CJK>
0x9178	0x531D	# <CJK>
0x9179	0x60E3	# <CJK>
0x917A	0x60F3	# <CJK>
0x917B	0x635C	# <CJK>
0x917C	0x6383	# <CJK>
0x917D	0x633F	# <CJK>
0x917E	0x63BB	# <CJK>
0x9180	0x64CD	# <CJK>
0x9181	0x65E9	# <CJK>
0x9182	0x66F9	# <CJK>
0x9183	0x5DE3	# <CJK>
0x9184	0x69CD	# <CJK>
0x9185	0x69FD	# <CJK>
0x9186	0x6F15	# <CJK>
0x9187	0x71E5	# <CJK>
0x9188	0x4E89	# <CJK>
0x9189	0x75E9	# <CJK>
0x918A	0x76F8	# <CJK>
0x918B	0x7A93	# <CJK>
0x918C	0x7CDF	# <CJK>
0x918D	0x7DCF	# <CJK>
0x918E	0x7D9C	# <CJK>
0x918F	0x8061	# <CJK>
0x9190	0x8349	# <CJK>
0x9191	0x8358	# <CJK>
0x9192	0x846C	# <CJK>
0x9193	0x84BC	# <CJK>
0x9194	0x85FB	# <CJK>
0x9195	0x88C5	# <CJK>
0x9196	0x8D70	# <CJK>
0x9197	0x9001	# <CJK>
0x9198	0x906D	# <CJK>
0x9199	0x9397	# <CJK>
0x919A	0x971C	# <CJK>
0x919B	0x9A12	# <CJK>
0x919C	0x50CF	# <CJK>
0x919D	0x5897	# <CJK>
0x919E	0x618E	# <CJK>
0x919F	0x81D3	# <CJK>
0x91A0	0x8535	# <CJK>
0x91A1	0x8D08	# <CJK>
0x91A2	0x9020	# <CJK>
0x91A3	0x4FC3	# <CJK>
0x91A4	0x5074	# <CJK>
0x91A5	0x5247	# <CJK>
0x91A6	0x5373	# <CJK>
0x91A7	0x606F	# <CJK>
0x91A8	0x6349	# <CJK>
0x91A9	0x675F	# <CJK>
0x91AA	0x6E2C	# <CJK>
0x91AB	0x8DB3	# <CJK>
0x91AC	0x901F	# <CJK>
0x91AD	0x4FD7	# <CJK>
0x91AE	0x5C5E	# <CJK>
0x91AF	0x8CCA	# <CJK>
0x91B0	0x65CF	# <CJK>
0x91B1	0x7D9A	# <CJK>
0x91B2	0x5352	# <CJK>
0x91B3	0x8896	# <CJK>
0x91B4	0x5176	# <CJK>
0x91B5	0x63C3	# <CJK>
0x91B6	0x5B58	# <CJK>
0x91B7	0x5B6B	# <CJK>
0x91B8	0x5C0A	# <CJK>
0x91B9	0x640D	# <CJK>
0x91BA	0x6751	# <CJK>
0x91BB	0x905C	# <CJK>
0x91BC	0x4ED6	# <CJK>
0x91BD	0x591A	# <CJK>
0x91BE	0x592A	# <CJK>
0x91BF	0x6C70	# <CJK>
0x91C0	0x8A51	# <CJK>
0x91C1	0x553E	# <CJK>
0x91C2	0x5815	# <CJK>
0x91C3	0x59A5	# <CJK>
0x91C4	0x60F0	# <CJK>
0x91C5	0x6253	# <CJK>
0x91C6	0x67C1	# <CJK>
0x91C7	0x8235	# <CJK>
0x91C8	0x6955	# <CJK>
0x91C9	0x9640	# <CJK>
0x91CA	0x99C4	# <CJK>
0x91CB	0x9A28	# <CJK>
0x91CC	0x4F53	# <CJK>
0x91CD	0x5806	# <CJK>
0x91CE	0x5BFE	# <CJK>
0x91CF	0x8010	# <CJK>
0x91D0	0x5CB1	# <CJK>
0x91D1	0x5E2F	# <CJK>
0x91D2	0x5F85	# <CJK>
0x91D3	0x6020	# <CJK>
0x91D4	0x614B	# <CJK>
0x91D5	0x6234	# <CJK>
0x91D6	0x66FF	# <CJK>
0x91D7	0x6CF0	# <CJK>
0x91D8	0x6EDE	# <CJK>
0x91D9	0x80CE	# <CJK>
0x91DA	0x817F	# <CJK>
0x91DB	0x82D4	# <CJK>
0x91DC	0x888B	# <CJK>
0x91DD	0x8CB8	# <CJK>
0x91DE	0x9000	# <CJK>
0x91DF	0x902E	# <CJK>
0x91E0	0x968A	# <CJK>
0x91E1	0x9EDB	# <CJK>
0x91E2	0x9BDB	# <CJK>
0x91E3	0x4EE3	# <CJK>
0x91E4	0x53F0	# <CJK>
0x91E5	0x5927	# <CJK>
0x91E6	0x7B2C	# <CJK>
0x91E7	0x918D	# <CJK>
0x91E8	0x984C	# <CJK>
0x91E9	0x9DF9	# <CJK>
0x91EA	0x6EDD	# <CJK>
0x91EB	0x7027	# <CJK>
0x91EC	0x5353	# <CJK>
0x91ED	0x5544	# <CJK>
0x91EE	0x5B85	# <CJK>
0x91EF	0x6258	# <CJK>
0x91F0	0x629E	# <CJK>
0x91F1	0x62D3	# <CJK>
0x91F2	0x6CA2	# <CJK>
0x91F3	0x6FEF	# <CJK>
0x91F4	0x7422	# <CJK>
0x91F5	0x8A17	# <CJK>
0x91F6	0x9438	# <CJK>
0x91F7	0x6FC1	# <CJK>
0x91F8	0x8AFE	# <CJK>
0x91F9	0x8338	# <CJK>
0x91FA	0x51E7	# <CJK>
0x91FB	0x86F8	# <CJK>
0x91FC	0x53EA	# <CJK>
0x9240	0x53E9	# <CJK>
0x9241	0x4F46	# <CJK>
0x9242	0x9054	# <CJK>
0x9243	0x8FB0	# <CJK>
0x9244	0x596A	# <CJK>
0x9245	0x8131	# <CJK>
0x9246	0x5DFD	# <CJK>
0x9247	0x7AEA	# <CJK>
0x9248	0x8FBF	# <CJK>
0x9249	0x68DA	# <CJK>
0x924A	0x8C37	# <CJK>
0x924B	0x72F8	# <CJK>
0x924C	0x9C48	# <CJK>
0x924D	0x6A3D	# <CJK>
0x924E	0x8AB0	# <CJK>
0x924F	0x4E39	# <CJK>
0x9250	0x5358	# <CJK>
0x9251	0x5606	# <CJK>
0x9252	0x5766	# <CJK>
0x9253	0x62C5	# <CJK>
0x9254	0x63A2	# <CJK>
0x9255	0x65E6	# <CJK>
0x9256	0x6B4E	# <CJK>
0x9257	0x6DE1	# <CJK>
0x9258	0x6E5B	# <CJK>
0x9259	0x70AD	# <CJK>
0x925A	0x77ED	# <CJK>
0x925B	0x7AEF	# <CJK>
0x925C	0x7BAA	# <CJK>
0x925D	0x7DBB	# <CJK>
0x925E	0x803D	# <CJK>
0x925F	0x80C6	# <CJK>
0x9260	0x86CB	# <CJK>
0x9261	0x8A95	# <CJK>
0x9262	0x935B	# <CJK>
0x9263	0x56E3	# <CJK>
0x9264	0x58C7	# <CJK>
0x9265	0x5F3E	# <CJK>
0x9266	0x65AD	# <CJK>
0x9267	0x6696	# <CJK>
0x9268	0x6A80	# <CJK>
0x9269	0x6BB5	# <CJK>
0x926A	0x7537	# <CJK>
0x926B	0x8AC7	# <CJK>
0x926C	0x5024	# <CJK>
0x926D	0x77E5	# <CJK>
0x926E	0x5730	# <CJK>
0x926F	0x5F1B	# <CJK>
0x9270	0x6065	# <CJK>
0x9271	0x667A	# <CJK>
0x9272	0x6C60	# <CJK>
0x9273	0x75F4	# <CJK>
0x9274	0x7A1A	# <CJK>
0x9275	0x7F6E	# <CJK>
0x9276	0x81F4	# <CJK>
0x9277	0x8718	# <CJK>
0x9278	0x9045	# <CJK>
0x9279	0x99B3	# <CJK>
0x927A	0x7BC9	# <CJK>
0x927B	0x755C	# <CJK>
0x927C	0x7AF9	# <CJK>
0x927D	0x7B51	# <CJK>
0x927E	0x84C4	# <CJK>
0x9280	0x9010	# <CJK>
0x9281	0x79E9	# <CJK>
0x9282	0x7A92	# <CJK>
0x9283	0x8336	# <CJK>
0x9284	0x5AE1	# <CJK>
0x9285	0x7740	# <CJK>
0x9286	0x4E2D	# <CJK>
0x9287	0x4EF2	# <CJK>
0x9288	0x5B99	# <CJK>
0x9289	0x5FE0	# <CJK>
0x928A	0x62BD	# <CJK>
0x928B	0x663C	# <CJK>
0x928C	0x67F1	# <CJK>
0x928D	0x6CE8	# <CJK>
0x928E	0x866B	# <CJK>
0x928F	0x8877	# <CJK>
0x9290	0x8A3B	# <CJK>
0x9291	0x914E	# <CJK>
0x9292	0x92F3	# <CJK>
0x9293	0x99D0	# <CJK>
0x9294	0x6A17	# <CJK>
0x9295	0x7026	# <CJK>
0x9296	0x732A	# <CJK>
0x9297	0x82E7	# <CJK>
0x9298	0x8457	# <CJK>
0x9299	0x8CAF	# <CJK>
0x929A	0x4E01	# <CJK>
0x929B	0x5146	# <CJK>
0x929C	0x51CB	# <CJK>
0x929D	0x558B	# <CJK>
0x929E	0x5BF5	# <CJK>
0x929F	0x5E16	# <CJK>
0x92A0	0x5E33	# <CJK>
0x92A1	0x5E81	# <CJK>
0x92A2	0x5F14	# <CJK>
0x92A3	0x5F35	# <CJK>
0x92A4	0x5F6B	# <CJK>
0x92A5	0x5FB4	# <CJK>
0x92A6	0x61F2	# <CJK>
0x92A7	0x6311	# <CJK>
0x92A8	0x66A2	# <CJK>
0x92A9	0x671D	# <CJK>
0x92AA	0x6F6E	# <CJK>
0x92AB	0x7252	# <CJK>
0x92AC	0x753A	# <CJK>
0x92AD	0x773A	# <CJK>
0x92AE	0x8074	# <CJK>
0x92AF	0x8139	# <CJK>
0x92B0	0x8178	# <CJK>
0x92B1	0x8776	# <CJK>
0x92B2	0x8ABF	# <CJK>
0x92B3	0x8ADC	# <CJK>
0x92B4	0x8D85	# <CJK>
0x92B5	0x8DF3	# <CJK>
0x92B6	0x929A	# <CJK>
0x92B7	0x9577	# <CJK>
0x92B8	0x9802	# <CJK>
0x92B9	0x9CE5	# <CJK>
0x92BA	0x52C5	# <CJK>
0x92BB	0x6357	# <CJK>
0x92BC	0x76F4	# <CJK>
0x92BD	0x6715	# <CJK>
0x92BE	0x6C88	# <CJK>
0x92BF	0x73CD	# <CJK>
0x92C0	0x8CC3	# <CJK>
0x92C1	0x93AE	# <CJK>
0x92C2	0x9673	# <CJK>
0x92C3	0x6D25	# <CJK>
0x92C4	0x589C	# <CJK>
0x92C5	0x690E	# <CJK>
0x92C6	0x69CC	# <CJK>
0x92C7	0x8FFD	# <CJK>
0x92C8	0x939A	# <CJK>
0x92C9	0x75DB	# <CJK>
0x92CA	0x901A	# <CJK>
0x92CB	0x585A	# <CJK>
0x92CC	0x6802	# <CJK>
0x92CD	0x63B4	# <CJK>
0x92CE	0x69FB	# <CJK>
0x92CF	0x4F43	# <CJK>
0x92D0	0x6F2C	# <CJK>
0x92D1	0x67D8	# <CJK>
0x92D2	0x8FBB	# <CJK>
0x92D3	0x8526	# <CJK>
0x92D4	0x7DB4	# <CJK>
0x92D5	0x9354	# <CJK>
0x92D6	0x693F	# <CJK>
0x92D7	0x6F70	# <CJK>
0x92D8	0x576A	# <CJK>
0x92D9	0x58F7	# <CJK>
0x92DA	0x5B2C	# <CJK>
0x92DB	0x7D2C	# <CJK>
0x92DC	0x722A	# <CJK>
0x92DD	0x540A	# <CJK>
0x92DE	0x91E3	# <CJK>
0x92DF	0x9DB4	# <CJK>
0x92E0	0x4EAD	# <CJK>
0x92E1	0x4F4E	# <CJK>
0x92E2	0x505C	# <CJK>
0x92E3	0x5075	# <CJK>
0x92E4	0x5243	# <CJK>
0x92E5	0x8C9E	# <CJK>
0x92E6	0x5448	# <CJK>
0x92E7	0x5824	# <CJK>
0x92E8	0x5B9A	# <CJK>
0x92E9	0x5E1D	# <CJK>
0x92EA	0x5E95	# <CJK>
0x92EB	0x5EAD	# <CJK>
0x92EC	0x5EF7	# <CJK>
0x92ED	0x5F1F	# <CJK>
0x92EE	0x608C	# <CJK>
0x92EF	0x62B5	# <CJK>
0x92F0	0x633A	# <CJK>
0x92F1	0x63D0	# <CJK>
0x92F2	0x68AF	# <CJK>
0x92F3	0x6C40	# <CJK>
0x92F4	0x7887	# <CJK>
0x92F5	0x798E	# <CJK>
0x92F6	0x7A0B	# <CJK>
0x92F7	0x7DE0	# <CJK>
0x92F8	0x8247	# <CJK>
0x92F9	0x8A02	# <CJK>
0x92FA	0x8AE6	# <CJK>
0x92FB	0x8E44	# <CJK>
0x92FC	0x9013	# <CJK>
0x9340	0x90B8	# <CJK>
0x9341	0x912D	# <CJK>
0x9342	0x91D8	# <CJK>
0x9343	0x9F0E	# <CJK>
0x9344	0x6CE5	# <CJK>
0x9345	0x6458	# <CJK>
0x9346	0x64E2	# <CJK>
0x9347	0x6575	# <CJK>
0x9348	0x6EF4	# <CJK>
0x9349	0x7684	# <CJK>
0x934A	0x7B1B	# <CJK>
0x934B	0x9069	# <CJK>
0x934C	0x93D1	# <CJK>
0x934D	0x6EBA	# <CJK>
0x934E	0x54F2	# <CJK>
0x934F	0x5FB9	# <CJK>
0x9350	0x64A4	# <CJK>
0x9351	0x8F4D	# <CJK>
0x9352	0x8FED	# <CJK>
0x9353	0x9244	# <CJK>
0x9354	0x5178	# <CJK>
0x9355	0x586B	# <CJK>
0x9356	0x5929	# <CJK>
0x9357	0x5C55	# <CJK>
0x9358	0x5E97	# <CJK>
0x9359	0x6DFB	# <CJK>
0x935A	0x7E8F	# <CJK>
0x935B	0x751C	# <CJK>
0x935C	0x8CBC	# <CJK>
0x935D	0x8EE2	# <CJK>
0x935E	0x985B	# <CJK>
0x935F	0x70B9	# <CJK>
0x9360	0x4F1D	# <CJK>
0x9361	0x6BBF	# <CJK>
0x9362	0x6FB1	# <CJK>
0x9363	0x7530	# <CJK>
0x9364	0x96FB	# <CJK>
0x9365	0x514E	# <CJK>
0x9366	0x5410	# <CJK>
0x9367	0x5835	# <CJK>
0x9368	0x5857	# <CJK>
0x9369	0x59AC	# <CJK>
0x936A	0x5C60	# <CJK>
0x936B	0x5F92	# <CJK>
0x936C	0x6597	# <CJK>
0x936D	0x675C	# <CJK>
0x936E	0x6E21	# <CJK>
0x936F	0x767B	# <CJK>
0x9370	0x83DF	# <CJK>
0x9371	0x8CED	# <CJK>
0x9372	0x9014	# <CJK>
0x9373	0x90FD	# <CJK>
0x9374	0x934D	# <CJK>
0x9375	0x7825	# <CJK>
0x9376	0x783A	# <CJK>
0x9377	0x52AA	# <CJK>
0x9378	0x5EA6	# <CJK>
0x9379	0x571F	# <CJK>
0x937A	0x5974	# <CJK>
0x937B	0x6012	# <CJK>
0x937C	0x5012	# <CJK>
0x937D	0x515A	# <CJK>
0x937E	0x51AC	# <CJK>
0x9380	0x51CD	# <CJK>
0x9381	0x5200	# <CJK>
0x9382	0x5510	# <CJK>
0x9383	0x5854	# <CJK>
0x9384	0x5858	# <CJK>
0x9385	0x5957	# <CJK>
0x9386	0x5B95	# <CJK>
0x9387	0x5CF6	# <CJK>
0x9388	0x5D8B	# <CJK>
0x9389	0x60BC	# <CJK>
0x938A	0x6295	# <CJK>
0x938B	0x642D	# <CJK>
0x938C	0x6771	# <CJK>
0x938D	0x6843	# <CJK>
0x938E	0x68BC	# <CJK>
0x938F	0x68DF	# <CJK>
0x9390	0x76D7	# <CJK>
0x9391	0x6DD8	# <CJK>
0x9392	0x6E6F	# <CJK>
0x9393	0x6D9B	# <CJK>
0x9394	0x706F	# <CJK>
0x9395	0x71C8	# <CJK>
0x9396	0x5F53	# <CJK>
0x9397	0x75D8	# <CJK>
0x9398	0x7977	# <CJK>
0x9399	0x7B49	# <CJK>
0x939A	0x7B54	# <CJK>
0x939B	0x7B52	# <CJK>
0x939C	0x7CD6	# <CJK>
0x939D	0x7D71	# <CJK>
0x939E	0x5230	# <CJK>
0x939F	0x8463	# <CJK>
0x93A0	0x8569	# <CJK>
0x93A1	0x85E4	# <CJK>
0x93A2	0x8A0E	# <CJK>
0x93A3	0x8B04	# <CJK>
0x93A4	0x8C46	# <CJK>
0x93A5	0x8E0F	# <CJK>
0x93A6	0x9003	# <CJK>
0x93A7	0x900F	# <CJK>
0x93A8	0x9419	# <CJK>
0x93A9	0x9676	# <CJK>
0x93AA	0x982D	# <CJK>
0x93AB	0x9A30	# <CJK>
0x93AC	0x95D8	# <CJK>
0x93AD	0x50CD	# <CJK>
0x93AE	0x52D5	# <CJK>
0x93AF	0x540C	# <CJK>
0x93B0	0x5802	# <CJK>
0x93B1	0x5C0E	# <CJK>
0x93B2	0x61A7	# <CJK>
0x93B3	0x649E	# <CJK>
0x93B4	0x6D1E	# <CJK>
0x93B5	0x77B3	# <CJK>
0x93B6	0x7AE5	# <CJK>
0x93B7	0x80F4	# <CJK>
0x93B8	0x8404	# <CJK>
0x93B9	0x9053	# <CJK>
0x93BA	0x9285	# <CJK>
0x93BB	0x5CE0	# <CJK>
0x93BC	0x9D07	# <CJK>
0x93BD	0x533F	# <CJK>
0x93BE	0x5F97	# <CJK>
0x93BF	0x5FB3	# <CJK>
0x93C0	0x6D9C	# <CJK>
0x93C1	0x7279	# <CJK>
0x93C2	0x7763	# <CJK>
0x93C3	0x79BF	# <CJK>
0x93C4	0x7BE4	# <CJK>
0x93C5	0x6BD2	# <CJK>
0x93C6	0x72EC	# <CJK>
0x93C7	0x8AAD	# <CJK>
0x93C8	0x6803	# <CJK>
0x93C9	0x6A61	# <CJK>
0x93CA	0x51F8	# <CJK>
0x93CB	0x7A81	# <CJK>
0x93CC	0x6934	# <CJK>
0x93CD	0x5C4A	# <CJK>
0x93CE	0x9CF6	# <CJK>
0x93CF	0x82EB	# <CJK>
0x93D0	0x5BC5	# <CJK>
0x93D1	0x9149	# <CJK>
0x93D2	0x701E	# <CJK>
0x93D3	0x5678	# <CJK>
0x93D4	0x5C6F	# <CJK>
0x93D5	0x60C7	# <CJK>
0x93D6	0x6566	# <CJK>
0x93D7	0x6C8C	# <CJK>
0x93D8	0x8C5A	# <CJK>
0x93D9	0x9041	# <CJK>
0x93DA	0x9813	# <CJK>
0x93DB	0x5451	# <CJK>
0x93DC	0x66C7	# <CJK>
0x93DD	0x920D	# <CJK>
0x93DE	0x5948	# <CJK>
0x93DF	0x90A3	# <CJK>
0x93E0	0x5185	# <CJK>
0x93E1	0x4E4D	# <CJK>
0x93E2	0x51EA	# <CJK>
0x93E3	0x8599	# <CJK>
0x93E4	0x8B0E	# <CJK>
0x93E5	0x7058	# <CJK>
0x93E6	0x637A	# <CJK>
0x93E7	0x934B	# <CJK>
0x93E8	0x6962	# <CJK>
0x93E9	0x99B4	# <CJK>
0x93EA	0x7E04	# <CJK>
0x93EB	0x7577	# <CJK>
0x93EC	0x5357	# <CJK>
0x93ED	0x6960	# <CJK>
0x93EE	0x8EDF	# <CJK>
0x93EF	0x96E3	# <CJK>
0x93F0	0x6C5D	# <CJK>
0x93F1	0x4E8C	# <CJK>
0x93F2	0x5C3C	# <CJK>
0x93F3	0x5F10	# <CJK>
0x93F4	0x8FE9	# <CJK>
0x93F5	0x5302	# <CJK>
0x93F6	0x8CD1	# <CJK>
0x93F7	0x8089	# <CJK>
0x93F8	0x8679	# <CJK>
0x93F9	0x5EFF	# <CJK>
0x93FA	0x65E5	# <CJK>
0x93FB	0x4E73	# <CJK>
0x93FC	0x5165	# <CJK>
0x9440	0x5982	# <CJK>
0x9441	0x5C3F	# <CJK>
0x9442	0x97EE	# <CJK>
0x9443	0x4EFB	# <CJK>
0x9444	0x598A	# <CJK>
0x9445	0x5FCD	# <CJK>
0x9446	0x8A8D	# <CJK>
0x9447	0x6FE1	# <CJK>
0x9448	0x79B0	# <CJK>
0x9449	0x7962	# <CJK>
0x944A	0x5BE7	# <CJK>
0x944B	0x8471	# <CJK>
0x944C	0x732B	# <CJK>
0x944D	0x71B1	# <CJK>
0x944E	0x5E74	# <CJK>
0x944F	0x5FF5	# <CJK>
0x9450	0x637B	# <CJK>
0x9451	0x649A	# <CJK>
0x9452	0x71C3	# <CJK>
0x9453	0x7C98	# <CJK>
0x9454	0x4E43	# <CJK>
0x9455	0x5EFC	# <CJK>
0x9456	0x4E4B	# <CJK>
0x9457	0x57DC	# <CJK>
0x9458	0x56A2	# <CJK>
0x9459	0x60A9	# <CJK>
0x945A	0x6FC3	# <CJK>
0x945B	0x7D0D	# <CJK>
0x945C	0x80FD	# <CJK>
0x945D	0x8133	# <CJK>
0x945E	0x81BF	# <CJK>
0x945F	0x8FB2	# <CJK>
0x9460	0x8997	# <CJK>
0x9461	0x86A4	# <CJK>
0x9462	0x5DF4	# <CJK>
0x9463	0x628A	# <CJK>
0x9464	0x64AD	# <CJK>
0x9465	0x8987	# <CJK>
0x9466	0x6777	# <CJK>
0x9467	0x6CE2	# <CJK>
0x9468	0x6D3E	# <CJK>
0x9469	0x7436	# <CJK>
0x946A	0x7834	# <CJK>
0x946B	0x5A46	# <CJK>
0x946C	0x7F75	# <CJK>
0x946D	0x82AD	# <CJK>
0x946E	0x99AC	# <CJK>
0x946F	0x4FF3	# <CJK>
0x9470	0x5EC3	# <CJK>
0x9471	0x62DD	# <CJK>
0x9472	0x6392	# <CJK>
0x9473	0x6557	# <CJK>
0x9474	0x676F	# <CJK>
0x9475	0x76C3	# <CJK>
0x9476	0x724C	# <CJK>
0x9477	0x80CC	# <CJK>
0x9478	0x80BA	# <CJK>
0x9479	0x8F29	# <CJK>
0x947A	0x914D	# <CJK>
0x947B	0x500D	# <CJK>
0x947C	0x57F9	# <CJK>
0x947D	0x5A92	# <CJK>
0x947E	0x6885	# <CJK>
0x9480	0x6973	# <CJK>
0x9481	0x7164	# <CJK>
0x9482	0x72FD	# <CJK>
0x9483	0x8CB7	# <CJK>
0x9484	0x58F2	# <CJK>
0x9485	0x8CE0	# <CJK>
0x9486	0x966A	# <CJK>
0x9487	0x9019	# <CJK>
0x9488	0x877F	# <CJK>
0x9489	0x79E4	# <CJK>
0x948A	0x77E7	# <CJK>
0x948B	0x8429	# <CJK>
0x948C	0x4F2F	# <CJK>
0x948D	0x5265	# <CJK>
0x948E	0x535A	# <CJK>
0x948F	0x62CD	# <CJK>
0x9490	0x67CF	# <CJK>
0x9491	0x6CCA	# <CJK>
0x9492	0x767D	# <CJK>
0x9493	0x7B94	# <CJK>
0x9494	0x7C95	# <CJK>
0x9495	0x8236	# <CJK>
0x9496	0x8584	# <CJK>
0x9497	0x8FEB	# <CJK>
0x9498	0x66DD	# <CJK>
0x9499	0x6F20	# <CJK>
0x949A	0x7206	# <CJK>
0x949B	0x7E1B	# <CJK>
0x949C	0x83AB	# <CJK>
0x949D	0x99C1	# <CJK>
0x949E	0x9EA6	# <CJK>
0x949F	0x51FD	# <CJK>
0x94A0	0x7BB1	# <CJK>
0x94A1	0x7872	# <CJK>
0x94A2	0x7BB8	# <CJK>
0x94A3	0x8087	# <CJK>
0x94A4	0x7B48	# <CJK>
0x94A5	0x6AE8	# <CJK>
0x94A6	0x5E61	# <CJK>
0x94A7	0x808C	# <CJK>
0x94A8	0x7551	# <CJK>
0x94A9	0x7560	# <CJK>
0x94AA	0x516B	# <CJK>
0x94AB	0x9262	# <CJK>
0x94AC	0x6E8C	# <CJK>
0x94AD	0x767A	# <CJK>
0x94AE	0x9197	# <CJK>
0x94AF	0x9AEA	# <CJK>
0x94B0	0x4F10	# <CJK>
0x94B1	0x7F70	# <CJK>
0x94B2	0x629C	# <CJK>
0x94B3	0x7B4F	# <CJK>
0x94B4	0x95A5	# <CJK>
0x94B5	0x9CE9	# <CJK>
0x94B6	0x567A	# <CJK>
0x94B7	0x5859	# <CJK>
0x94B8	0x86E4	# <CJK>
0x94B9	0x96BC	# <CJK>
0x94BA	0x4F34	# <CJK>
0x94BB	0x5224	# <CJK>
0x94BC	0x534A	# <CJK>
0x94BD	0x53CD	# <CJK>
0x94BE	0x53DB	# <CJK>
0x94BF	0x5E06	# <CJK>
0x94C0	0x642C	# <CJK>
0x94C1	0x6591	# <CJK>
0x94C2	0x677F	# <CJK>
0x94C3	0x6C3E	# <CJK>
0x94C4	0x6C4E	# <CJK>
0x94C5	0x7248	# <CJK>
0x94C6	0x72AF	# <CJK>
0x94C7	0x73ED	# <CJK>
0x94C8	0x7554	# <CJK>
0x94C9	0x7E41	# <CJK>
0x94CA	0x822C	# <CJK>
0x94CB	0x85E9	# <CJK>
0x94CC	0x8CA9	# <CJK>
0x94CD	0x7BC4	# <CJK>
0x94CE	0x91C6	# <CJK>
0x94CF	0x7169	# <CJK>
0x94D0	0x9812	# <CJK>
0x94D1	0x98EF	# <CJK>
0x94D2	0x633D	# <CJK>
0x94D3	0x6669	# <CJK>
0x94D4	0x756A	# <CJK>
0x94D5	0x76E4	# <CJK>
0x94D6	0x78D0	# <CJK>
0x94D7	0x8543	# <CJK>
0x94D8	0x86EE	# <CJK>
0x94D9	0x532A	# <CJK>
0x94DA	0x5351	# <CJK>
0x94DB	0x5426	# <CJK>
0x94DC	0x5983	# <CJK>
0x94DD	0x5E87	# <CJK>
0x94DE	0x5F7C	# <CJK>
0x94DF	0x60B2	# <CJK>
0x94E0	0x6249	# <CJK>
0x94E1	0x6279	# <CJK>
0x94E2	0x62AB	# <CJK>
0x94E3	0x6590	# <CJK>
0x94E4	0x6BD4	# <CJK>
0x94E5	0x6CCC	# <CJK>
0x94E6	0x75B2	# <CJK>
0x94E7	0x76AE	# <CJK>
0x94E8	0x7891	# <CJK>
0x94E9	0x79D8	# <CJK>
0x94EA	0x7DCB	# <CJK>
0x94EB	0x7F77	# <CJK>
0x94EC	0x80A5	# <CJK>
0x94ED	0x88AB	# <CJK>
0x94EE	0x8AB9	# <CJK>
0x94EF	0x8CBB	# <CJK>
0x94F0	0x907F	# <CJK>
0x94F1	0x975E	# <CJK>
0x94F2	0x98DB	# <CJK>
0x94F3	0x6A0B	# <CJK>
0x94F4	0x7C38	# <CJK>
0x94F5	0x5099	# <CJK>
0x94F6	0x5C3E	# <CJK>
0x94F7	0x5FAE	# <CJK>
0x94F8	0x6787	# <CJK>
0x94F9	0x6BD8	# <CJK>
0x94FA	0x7435	# <CJK>
0x94FB	0x7709	# <CJK>
0x94FC	0x7F8E	# <CJK>
0x9540	0x9F3B	# <CJK>
0x9541	0x67CA	# <CJK>
0x9542	0x7A17	# <CJK>
0x9543	0x5339	# <CJK>
0x9544	0x758B	# <CJK>
0x9545	0x9AED	# <CJK>
0x9546	0x5F66	# <CJK>
0x9547	0x819D	# <CJK>
0x9548	0x83F1	# <CJK>
0x9549	0x8098	# <CJK>
0x954A	0x5F3C	# <CJK>
0x954B	0x5FC5	# <CJK>
0x954C	0x7562	# <CJK>
0x954D	0x7B46	# <CJK>
0x954E	0x903C	# <CJK>
0x954F	0x6867	# <CJK>
0x9550	0x59EB	# <CJK>
0x9551	0x5A9B	# <CJK>
0x9552	0x7D10	# <CJK>
0x9553	0x767E	# <CJK>
0x9554	0x8B2C	# <CJK>
0x9555	0x4FF5	# <CJK>
0x9556	0x5F6A	# <CJK>
0x9557	0x6A19	# <CJK>
0x9558	0x6C37	# <CJK>
0x9559	0x6F02	# <CJK>
0x955A	0x74E2	# <CJK>
0x955B	0x7968	# <CJK>
0x955C	0x8868	# <CJK>
0x955D	0x8A55	# <CJK>
0x955E	0x8C79	# <CJK>
0x955F	0x5EDF	# <CJK>
0x9560	0x63CF	# <CJK>
0x9561	0x75C5	# <CJK>
0x9562	0x79D2	# <CJK>
0x9563	0x82D7	# <CJK>
0x9564	0x9328	# <CJK>
0x9565	0x92F2	# <CJK>
0x9566	0x849C	# <CJK>
0x9567	0x86ED	# <CJK>
0x9568	0x9C2D	# <CJK>
0x9569	0x54C1	# <CJK>
0x956A	0x5F6C	# <CJK>
0x956B	0x658C	# <CJK>
0x956C	0x6D5C	# <CJK>
0x956D	0x7015	# <CJK>
0x956E	0x8CA7	# <CJK>
0x956F	0x8CD3	# <CJK>
0x9570	0x983B	# <CJK>
0x9571	0x654F	# <CJK>
0x9572	0x74F6	# <CJK>
0x9573	0x4E0D	# <CJK>
0x9574	0x4ED8	# <CJK>
0x9575	0x57E0	# <CJK>
0x9576	0x592B	# <CJK>
0x9577	0x5A66	# <CJK>
0x9578	0x5BCC	# <CJK>
0x9579	0x51A8	# <CJK>
0x957A	0x5E03	# <CJK>
0x957B	0x5E9C	# <CJK>
0x957C	0x6016	# <CJK>
0x957D	0x6276	# <CJK>
0x957E	0x6577	# <CJK>
0x9580	0x65A7	# <CJK>
0x9581	0x666E	# <CJK>
0x9582	0x6D6E	# <CJK>
0x9583	0x7236	# <CJK>
0x9584	0x7B26	# <CJK>
0x9585	0x8150	# <CJK>
0x9586	0x819A	# <CJK>
0x9587	0x8299	# <CJK>
0x9588	0x8B5C	# <CJK>
0x9589	0x8CA0	# <CJK>
0x958A	0x8CE6	# <CJK>
0x958B	0x8D74	# <CJK>
0x958C	0x961C	# <CJK>
0x958D	0x9644	# <CJK>
0x958E	0x4FAE	# <CJK>
0x958F	0x64AB	# <CJK>
0x9590	0x6B66	# <CJK>
0x9591	0x821E	# <CJK>
0x9592	0x8461	# <CJK>
0x9593	0x856A	# <CJK>
0x9594	0x90E8	# <CJK>
0x9595	0x5C01	# <CJK>
0x9596	0x6953	# <CJK>
0x9597	0x98A8	# <CJK>
0x9598	0x847A	# <CJK>
0x9599	0x8557	# <CJK>
0x959A	0x4F0F	# <CJK>
0x959B	0x526F	# <CJK>
0x959C	0x5FA9	# <CJK>
0x959D	0x5E45	# <CJK>
0x959E	0x670D	# <CJK>
0x959F	0x798F	# <CJK>
0x95A0	0x8179	# <CJK>
0x95A1	0x8907	# <CJK>
0x95A2	0x8986	# <CJK>
0x95A3	0x6DF5	# <CJK>
0x95A4	0x5F17	# <CJK>
0x95A5	0x6255	# <CJK>
0x95A6	0x6CB8	# <CJK>
0x95A7	0x4ECF	# <CJK>
0x95A8	0x7269	# <CJK>
0x95A9	0x9B92	# <CJK>
0x95AA	0x5206	# <CJK>
0x95AB	0x543B	# <CJK>
0x95AC	0x5674	# <CJK>
0x95AD	0x58B3	# <CJK>
0x95AE	0x61A4	# <CJK>
0x95AF	0x626E	# <CJK>
0x95B0	0x711A	# <CJK>
0x95B1	0x596E	# <CJK>
0x95B2	0x7C89	# <CJK>
0x95B3	0x7CDE	# <CJK>
0x95B4	0x7D1B	# <CJK>
0x95B5	0x96F0	# <CJK>
0x95B6	0x6587	# <CJK>
0x95B7	0x805E	# <CJK>
0x95B8	0x4E19	# <CJK>
0x95B9	0x4F75	# <CJK>
0x95BA	0x5175	# <CJK>
0x95BB	0x5840	# <CJK>
0x95BC	0x5E63	# <CJK>
0x95BD	0x5E73	# <CJK>
0x95BE	0x5F0A	# <CJK>
0x95BF	0x67C4	# <CJK>
0x95C0	0x4E26	# <CJK>
0x95C1	0x853D	# <CJK>
0x95C2	0x9589	# <CJK>
0x95C3	0x965B	# <CJK>
0x95C4	0x7C73	# <CJK>
0x95C5	0x9801	# <CJK>
0x95C6	0x50FB	# <CJK>
0x95C7	0x58C1	# <CJK>
0x95C8	0x7656	# <CJK>
0x95C9	0x78A7	# <CJK>
0x95CA	0x5225	# <CJK>
0x95CB	0x77A5	# <CJK>
0x95CC	0x8511	# <CJK>
0x95CD	0x7B86	# <CJK>
0x95CE	0x504F	# <CJK>
0x95CF	0x5909	# <CJK>
0x95D0	0x7247	# <CJK>
0x95D1	0x7BC7	# <CJK>
0x95D2	0x7DE8	# <CJK>
0x95D3	0x8FBA	# <CJK>
0x95D4	0x8FD4	# <CJK>
0x95D5	0x904D	# <CJK>
0x95D6	0x4FBF	# <CJK>
0x95D7	0x52C9	# <CJK>
0x95D8	0x5A29	# <CJK>
0x95D9	0x5F01	# <CJK>
0x95DA	0x97AD	# <CJK>
0x95DB	0x4FDD	# <CJK>
0x95DC	0x8217	# <CJK>
0x95DD	0x92EA	# <CJK>
0x95DE	0x5703	# <CJK>
0x95DF	0x6355	# <CJK>
0x95E0	0x6B69	# <CJK>
0x95E1	0x752B	# <CJK>
0x95E2	0x88DC	# <CJK>
0x95E3	0x8F14	# <CJK>
0x95E4	0x7A42	# <CJK>
0x95E5	0x52DF	# <CJK>
0x95E6	0x5893	# <CJK>
0x95E7	0x6155	# <CJK>
0x95E8	0x620A	# <CJK>
0x95E9	0x66AE	# <CJK>
0x95EA	0x6BCD	# <CJK>
0x95EB	0x7C3F	# <CJK>
0x95EC	0x83E9	# <CJK>
0x95ED	0x5023	# <CJK>
0x95EE	0x4FF8	# <CJK>
0x95EF	0x5305	# <CJK>
0x95F0	0x5446	# <CJK>
0x95F1	0x5831	# <CJK>
0x95F2	0x5949	# <CJK>
0x95F3	0x5B9D	# <CJK>
0x95F4	0x5CF0	# <CJK>
0x95F5	0x5CEF	# <CJK>
0x95F6	0x5D29	# <CJK>
0x95F7	0x5E96	# <CJK>
0x95F8	0x62B1	# <CJK>
0x95F9	0x6367	# <CJK>
0x95FA	0x653E	# <CJK>
0x95FB	0x65B9	# <CJK>
0x95FC	0x670B	# <CJK>
0x9640	0x6CD5	# <CJK>
0x9641	0x6CE1	# <CJK>
0x9642	0x70F9	# <CJK>
0x9643	0x7832	# <CJK>
0x9644	0x7E2B	# <CJK>
0x9645	0x80DE	# <CJK>
0x9646	0x82B3	# <CJK>
0x9647	0x840C	# <CJK>
0x9648	0x84EC	# <CJK>
0x9649	0x8702	# <CJK>
0x964A	0x8912	# <CJK>
0x964B	0x8A2A	# <CJK>
0x964C	0x8C4A	# <CJK>
0x964D	0x90A6	# <CJK>
0x964E	0x92D2	# <CJK>
0x964F	0x98FD	# <CJK>
0x9650	0x9CF3	# <CJK>
0x9651	0x9D6C	# <CJK>
0x9652	0x4E4F	# <CJK>
0x9653	0x4EA1	# <CJK>
0x9654	0x508D	# <CJK>
0x9655	0x5256	# <CJK>
0x9656	0x574A	# <CJK>
0x9657	0x59A8	# <CJK>
0x9658	0x5E3D	# <CJK>
0x9659	0x5FD8	# <CJK>
0x965A	0x5FD9	# <CJK>
0x965B	0x623F	# <CJK>
0x965C	0x66B4	# <CJK>
0x965D	0x671B	# <CJK>
0x965E	0x67D0	# <CJK>
0x965F	0x68D2	# <CJK>
0x9660	0x5192	# <CJK>
0x9661	0x7D21	# <CJK>
0x9662	0x80AA	# <CJK>
0x9663	0x81A8	# <CJK>
0x9664	0x8B00	# <CJK>
0x9665	0x8C8C	# <CJK>
0x9666	0x8CBF	# <CJK>
0x9667	0x927E	# <CJK>
0x9668	0x9632	# <CJK>
0x9669	0x5420	# <CJK>
0x966A	0x982C	# <CJK>
0x966B	0x5317	# <CJK>
0x966C	0x50D5	# <CJK>
0x966D	0x535C	# <CJK>
0x966E	0x58A8	# <CJK>
0x966F	0x64B2	# <CJK>
0x9670	0x6734	# <CJK>
0x9671	0x7267	# <CJK>
0x9672	0x7766	# <CJK>
0x9673	0x7A46	# <CJK>
0x9674	0x91E6	# <CJK>
0x9675	0x52C3	# <CJK>
0x9676	0x6CA1	# <CJK>
0x9677	0x6B86	# <CJK>
0x9678	0x5800	# <CJK>
0x9679	0x5E4C	# <CJK>
0x967A	0x5954	# <CJK>
0x967B	0x672C	# <CJK>
0x967C	0x7FFB	# <CJK>
0x967D	0x51E1	# <CJK>
0x967E	0x76C6	# <CJK>
0x9680	0x6469	# <CJK>
0x9681	0x78E8	# <CJK>
0x9682	0x9B54	# <CJK>
0x9683	0x9EBB	# <CJK>
0x9684	0x57CB	# <CJK>
0x9685	0x59B9	# <CJK>
0x9686	0x6627	# <CJK>
0x9687	0x679A	# <CJK>
0x9688	0x6BCE	# <CJK>
0x9689	0x54E9	# <CJK>
0x968A	0x69D9	# <CJK>
0x968B	0x5E55	# <CJK>
0x968C	0x819C	# <CJK>
0x968D	0x6795	# <CJK>
0x968E	0x9BAA	# <CJK>
0x968F	0x67FE	# <CJK>
0x9690	0x9C52	# <CJK>
0x9691	0x685D	# <CJK>
0x9692	0x4EA6	# <CJK>
0x9693	0x4FE3	# <CJK>
0x9694	0x53C8	# <CJK>
0x9695	0x62B9	# <CJK>
0x9696	0x672B	# <CJK>
0x9697	0x6CAB	# <CJK>
0x9698	0x8FC4	# <CJK>
0x9699	0x4FAD	# <CJK>
0x969A	0x7E6D	# <CJK>
0x969B	0x9EBF	# <CJK>
0x969C	0x4E07	# <CJK>
0x969D	0x6162	# <CJK>
0x969E	0x6E80	# <CJK>
0x969F	0x6F2B	# <CJK>
0x96A0	0x8513	# <CJK>
0x96A1	0x5473	# <CJK>
0x96A2	0x672A	# <CJK>
0x96A3	0x9B45	# <CJK>
0x96A4	0x5DF3	# <CJK>
0x96A5	0x7B95	# <CJK>
0x96A6	0x5CAC	# <CJK>
0x96A7	0x5BC6	# <CJK>
0x96A8	0x871C	# <CJK>
0x96A9	0x6E4A	# <CJK>
0x96AA	0x84D1	# <CJK>
0x96AB	0x7A14	# <CJK>
0x96AC	0x8108	# <CJK>
0x96AD	0x5999	# <CJK>
0x96AE	0x7C8D	# <CJK>
0x96AF	0x6C11	# <CJK>
0x96B0	0x7720	# <CJK>
0x96B1	0x52D9	# <CJK>
0x96B2	0x5922	# <CJK>
0x96B3	0x7121	# <CJK>
0x96B4	0x725F	# <CJK>
0x96B5	0x77DB	# <CJK>
0x96B6	0x9727	# <CJK>
0x96B7	0x9D61	# <CJK>
0x96B8	0x690B	# <CJK>
0x96B9	0x5A7F	# <CJK>
0x96BA	0x5A18	# <CJK>
0x96BB	0x51A5	# <CJK>
0x96BC	0x540D	# <CJK>
0x96BD	0x547D	# <CJK>
0x96BE	0x660E	# <CJK>
0x96BF	0x76DF	# <CJK>
0x96C0	0x8FF7	# <CJK>
0x96C1	0x9298	# <CJK>
0x96C2	0x9CF4	# <CJK>
0x96C3	0x59EA	# <CJK>
0x96C4	0x725D	# <CJK>
0x96C5	0x6EC5	# <CJK>
0x96C6	0x514D	# <CJK>
0x96C7	0x68C9	# <CJK>
0x96C8	0x7DBF	# <CJK>
0x96C9	0x7DEC	# <CJK>
0x96CA	0x9762	# <CJK>
0x96CB	0x9EBA	# <CJK>
0x96CC	0x6478	# <CJK>
0x96CD	0x6A21	# <CJK>
0x96CE	0x8302	# <CJK>
0x96CF	0x5984	# <CJK>
0x96D0	0x5B5F	# <CJK>
0x96D1	0x6BDB	# <CJK>
0x96D2	0x731B	# <CJK>
0x96D3	0x76F2	# <CJK>
0x96D4	0x7DB2	# <CJK>
0x96D5	0x8017	# <CJK>
0x96D6	0x8499	# <CJK>
0x96D7	0x5132	# <CJK>
0x96D8	0x6728	# <CJK>
0x96D9	0x9ED9	# <CJK>
0x96DA	0x76EE	# <CJK>
0x96DB	0x6762	# <CJK>
0x96DC	0x52FF	# <CJK>
0x96DD	0x9905	# <CJK>
0x96DE	0x5C24	# <CJK>
0x96DF	0x623B	# <CJK>
0x96E0	0x7C7E	# <CJK>
0x96E1	0x8CB0	# <CJK>
0x96E2	0x554F	# <CJK>
0x96E3	0x60B6	# <CJK>
0x96E4	0x7D0B	# <CJK>
0x96E5	0x9580	# <CJK>
0x96E6	0x5301	# <CJK>
0x96E7	0x4E5F	# <CJK>
0x96E8	0x51B6	# <CJK>
0x96E9	0x591C	# <CJK>
0x96EA	0x723A	# <CJK>
0x96EB	0x8036	# <CJK>
0x96EC	0x91CE	# <CJK>
0x96ED	0x5F25	# <CJK>
0x96EE	0x77E2	# <CJK>
0x96EF	0x5384	# <CJK>
0x96F0	0x5F79	# <CJK>
0x96F1	0x7D04	# <CJK>
0x96F2	0x85AC	# <CJK>
0x96F3	0x8A33	# <CJK>
0x96F4	0x8E8D	# <CJK>
0x96F5	0x9756	# <CJK>
0x96F6	0x67F3	# <CJK>
0x96F7	0x85AE	# <CJK>
0x96F8	0x9453	# <CJK>
0x96F9	0x6109	# <CJK>
0x96FA	0x6108	# <CJK>
0x96FB	0x6CB9	# <CJK>
0x96FC	0x7652	# <CJK>
0x9740	0x8AED	# <CJK>
0x9741	0x8F38	# <CJK>
0x9742	0x552F	# <CJK>
0x9743	0x4F51	# <CJK>
0x9744	0x512A	# <CJK>
0x9745	0x52C7	# <CJK>
0x9746	0x53CB	# <CJK>
0x9747	0x5BA5	# <CJK>
0x9748	0x5E7D	# <CJK>
0x9749	0x60A0	# <CJK>
0x974A	0x6182	# <CJK>
0x974B	0x63D6	# <CJK>
0x974C	0x6709	# <CJK>
0x974D	0x67DA	# <CJK>
0x974E	0x6E67	# <CJK>
0x974F	0x6D8C	# <CJK>
0x9750	0x7336	# <CJK>
0x9751	0x7337	# <CJK>
0x9752	0x7531	# <CJK>
0x9753	0x7950	# <CJK>
0x9754	0x88D5	# <CJK>
0x9755	0x8A98	# <CJK>
0x9756	0x904A	# <CJK>
0x9757	0x9091	# <CJK>
0x9758	0x90F5	# <CJK>
0x9759	0x96C4	# <CJK>
0x975A	0x878D	# <CJK>
0x975B	0x5915	# <CJK>
0x975C	0x4E88	# <CJK>
0x975D	0x4F59	# <CJK>
0x975E	0x4E0E	# <CJK>
0x975F	0x8A89	# <CJK>
0x9760	0x8F3F	# <CJK>
0x9761	0x9810	# <CJK>
0x9762	0x50AD	# <CJK>
0x9763	0x5E7C	# <CJK>
0x9764	0x5996	# <CJK>
0x9765	0x5BB9	# <CJK>
0x9766	0x5EB8	# <CJK>
0x9767	0x63DA	# <CJK>
0x9768	0x63FA	# <CJK>
0x9769	0x64C1	# <CJK>
0x976A	0x66DC	# <CJK>
0x976B	0x694A	# <CJK>
0x976C	0x69D8	# <CJK>
0x976D	0x6D0B	# <CJK>
0x976E	0x6EB6	# <CJK>
0x976F	0x7194	# <CJK>
0x9770	0x7528	# <CJK>
0x9771	0x7AAF	# <CJK>
0x9772	0x7F8A	# <CJK>
0x9773	0x8000	# <CJK>
0x9774	0x8449	# <CJK>
0x9775	0x84C9	# <CJK>
0x9776	0x8981	# <CJK>
0x9777	0x8B21	# <CJK>
0x9778	0x8E0A	# <CJK>
0x9779	0x9065	# <CJK>
0x977A	0x967D	# <CJK>
0x977B	0x990A	# <CJK>
0x977C	0x617E	# <CJK>
0x977D	0x6291	# <CJK>
0x977E	0x6B32	# <CJK>
0x9780	0x6C83	# <CJK>
0x9781	0x6D74	# <CJK>
0x9782	0x7FCC	# <CJK>
0x9783	0x7FFC	# <CJK>
0x9784	0x6DC0	# <CJK>
0x9785	0x7F85	# <CJK>
0x9786	0x87BA	# <CJK>
0x9787	0x88F8	# <CJK>
0x9788	0x6765	# <CJK>
0x9789	0x83B1	# <CJK>
0x978A	0x983C	# <CJK>
0x978B	0x96F7	# <CJK>
0x978C	0x6D1B	# <CJK>
0x978D	0x7D61	# <CJK>
0x978E	0x843D	# <CJK>
0x978F	0x916A	# <CJK>
0x9790	0x4E71	# <CJK>
0x9791	0x5375	# <CJK>
0x9792	0x5D50	# <CJK>
0x9793	0x6B04	# <CJK>
0x9794	0x6FEB	# <CJK>
0x9795	0x85CD	# <CJK>
0x9796	0x862D	# <CJK>
0x9797	0x89A7	# <CJK>
0x9798	0x5229	# <CJK>
0x9799	0x540F	# <CJK>
0x979A	0x5C65	# <CJK>
0x979B	0x674E	# <CJK>
0x979C	0x68A8	# <CJK>
0x979D	0x7406	# <CJK>
0x979E	0x7483	# <CJK>
0x979F	0x75E2	# <CJK>
0x97A0	0x88CF	# <CJK>
0x97A1	0x88E1	# <CJK>
0x97A2	0x91CC	# <CJK>
0x97A3	0x96E2	# <CJK>
0x97A4	0x9678	# <CJK>
0x97A5	0x5F8B	# <CJK>
0x97A6	0x7387	# <CJK>
0x97A7	0x7ACB	# <CJK>
0x97A8	0x844E	# <CJK>
0x97A9	0x63A0	# <CJK>
0x97AA	0x7565	# <CJK>
0x97AB	0x5289	# <CJK>
0x97AC	0x6D41	# <CJK>
0x97AD	0x6E9C	# <CJK>
0x97AE	0x7409	# <CJK>
0x97AF	0x7559	# <CJK>
0x97B0	0x786B	# <CJK>
0x97B1	0x7C92	# <CJK>
0x97B2	0x9686	# <CJK>
0x97B3	0x7ADC	# <CJK>
0x97B4	0x9F8D	# <CJK>
0x97B5	0x4FB6	# <CJK>
0x97B6	0x616E	# <CJK>
0x97B7	0x65C5	# <CJK>
0x97B8	0x865C	# <CJK>
0x97B9	0x4E86	# <CJK>
0x97BA	0x4EAE	# <CJK>
0x97BB	0x50DA	# <CJK>
0x97BC	0x4E21	# <CJK>
0x97BD	0x51CC	# <CJK>
0x97BE	0x5BEE	# <CJK>
0x97BF	0x6599	# <CJK>
0x97C0	0x6881	# <CJK>
0x97C1	0x6DBC	# <CJK>
0x97C2	0x731F	# <CJK>
0x97C3	0x7642	# <CJK>
0x97C4	0x77AD	# <CJK>
0x97C5	0x7A1C	# <CJK>
0x97C6	0x7CE7	# <CJK>
0x97C7	0x826F	# <CJK>
0x97C8	0x8AD2	# <CJK>
0x97C9	0x907C	# <CJK>
0x97CA	0x91CF	# <CJK>
0x97CB	0x9675	# <CJK>
0x97CC	0x9818	# <CJK>
0x97CD	0x529B	# <CJK>
0x97CE	0x7DD1	# <CJK>
0x97CF	0x502B	# <CJK>
0x97D0	0x5398	# <CJK>
0x97D1	0x6797	# <CJK>
0x97D2	0x6DCB	# <CJK>
0x97D3	0x71D0	# <CJK>
0x97D4	0x7433	# <CJK>
0x97D5	0x81E8	# <CJK>
0x97D6	0x8F2A	# <CJK>
0x97D7	0x96A3	# <CJK>
0x97D8	0x9C57	# <CJK>
0x97D9	0x9E9F	# <CJK>
0x97DA	0x7460	# <CJK>
0x97DB	0x5841	# <CJK>
0x97DC	0x6D99	# <CJK>
0x97DD	0x7D2F	# <CJK>
0x97DE	0x985E	# <CJK>
0x97DF	0x4EE4	# <CJK>
0x97E0	0x4F36	# <CJK>
0x97E1	0x4F8B	# <CJK>
0x97E2	0x51B7	# <CJK>
0x97E3	0x52B1	# <CJK>
0x97E4	0x5DBA	# <CJK>
0x97E5	0x601C	# <CJK>
0x97E6	0x73B2	# <CJK>
0x97E7	0x793C	# <CJK>
0x97E8	0x82D3	# <CJK>
0x97E9	0x9234	# <CJK>
0x97EA	0x96B7	# <CJK>
0x97EB	0x96F6	# <CJK>
0x97EC	0x970A	# <CJK>
0x97ED	0x9E97	# <CJK>
0x97EE	0x9F62	# <CJK>
0x97EF	0x66A6	# <CJK>
0x97F0	0x6B74	# <CJK>
0x97F1	0x5217	# <CJK>
0x97F2	0x52A3	# <CJK>
0x97F3	0x70C8	# <CJK>
0x97F4	0x88C2	# <CJK>
0x97F5	0x5EC9	# <CJK>
0x97F6	0x604B	# <CJK>
0x97F7	0x6190	# <CJK>
0x97F8	0x6F23	# <CJK>
0x97F9	0x7149	# <CJK>
0x97FA	0x7C3E	# <CJK>
0x97FB	0x7DF4	# <CJK>
0x97FC	0x806F	# <CJK>
0x9840	0x84EE	# <CJK>
0x9841	0x9023	# <CJK>
0x9842	0x932C	# <CJK>
0x9843	0x5442	# <CJK>
0x9844	0x9B6F	# <CJK>
0x9845	0x6AD3	# <CJK>
0x9846	0x7089	# <CJK>
0x9847	0x8CC2	# <CJK>
0x9848	0x8DEF	# <CJK>
0x9849	0x9732	# <CJK>
0x984A	0x52B4	# <CJK>
0x984B	0x5A41	# <CJK>
0x984C	0x5ECA	# <CJK>
0x984D	0x5F04	# <CJK>
0x984E	0x6717	# <CJK>
0x984F	0x697C	# <CJK>
0x9850	0x6994	# <CJK>
0x9851	0x6D6A	# <CJK>
0x9852	0x6F0F	# <CJK>
0x9853	0x7262	# <CJK>
0x9854	0x72FC	# <CJK>
0x9855	0x7BED	# <CJK>
0x9856	0x8001	# <CJK>
0x9857	0x807E	# <CJK>
0x9858	0x874B	# <CJK>
0x9859	0x90CE	# <CJK>
0x985A	0x516D	# <CJK>
0x985B	0x9E93	# <CJK>
0x985C	0x7984	# <CJK>
0x985D	0x808B	# <CJK>
0x985E	0x9332	# <CJK>
0x985F	0x8AD6	# <CJK>
0x9860	0x502D	# <CJK>
0x9861	0x548C	# <CJK>
0x9862	0x8A71	# <CJK>
0x9863	0x6B6A	# <CJK>
0x9864	0x8CC4	# <CJK>
0x9865	0x8107	# <CJK>
0x9866	0x60D1	# <CJK>
0x9867	0x67A0	# <CJK>
0x9868	0x9DF2	# <CJK>
0x9869	0x4E99	# <CJK>
0x986A	0x4E98	# <CJK>
0x986B	0x9C10	# <CJK>
0x986C	0x8A6B	# <CJK>
0x986D	0x85C1	# <CJK>
0x986E	0x8568	# <CJK>
0x986F	0x6900	# <CJK>
0x9870	0x6E7E	# <CJK>
0x9871	0x7897	# <CJK>
0x9872	0x8155	# <CJK>
0x989F	0x5F0C	# <CJK>
0x98A0	0x4E10	# <CJK>
0x98A1	0x4E15	# <CJK>
0x98A2	0x4E2A	# <CJK>
0x98A3	0x4E31	# <CJK>
0x98A4	0x4E36	# <CJK>
0x98A5	0x4E3C	# <CJK>
0x98A6	0x4E3F	# <CJK>
0x98A7	0x4E42	# <CJK>
0x98A8	0x4E56	# <CJK>
0x98A9	0x4E58	# <CJK>
0x98AA	0x4E82	# <CJK>
0x98AB	0x4E85	# <CJK>
0x98AC	0x8C6B	# <CJK>
0x98AD	0x4E8A	# <CJK>
0x98AE	0x8212	# <CJK>
0x98AF	0x5F0D	# <CJK>
0x98B0	0x4E8E	# <CJK>
0x98B1	0x4E9E	# <CJK>
0x98B2	0x4E9F	# <CJK>
0x98B3	0x4EA0	# <CJK>
0x98B4	0x4EA2	# <CJK>
0x98B5	0x4EB0	# <CJK>
0x98B6	0x4EB3	# <CJK>
0x98B7	0x4EB6	# <CJK>
0x98B8	0x4ECE	# <CJK>
0x98B9	0x4ECD	# <CJK>
0x98BA	0x4EC4	# <CJK>
0x98BB	0x4EC6	# <CJK>
0x98BC	0x4EC2	# <CJK>
0x98BD	0x4ED7	# <CJK>
0x98BE	0x4EDE	# <CJK>
0x98BF	0x4EED	# <CJK>
0x98C0	0x4EDF	# <CJK>
0x98C1	0x4EF7	# <CJK>
0x98C2	0x4F09	# <CJK>
0x98C3	0x4F5A	# <CJK>
0x98C4	0x4F30	# <CJK>
0x98C5	0x4F5B	# <CJK>
0x98C6	0x4F5D	# <CJK>
0x98C7	0x4F57	# <CJK>
0x98C8	0x4F47	# <CJK>
0x98C9	0x4F76	# <CJK>
0x98CA	0x4F88	# <CJK>
0x98CB	0x4F8F	# <CJK>
0x98CC	0x4F98	# <CJK>
0x98CD	0x4F7B	# <CJK>
0x98CE	0x4F69	# <CJK>
0x98CF	0x4F70	# <CJK>
0x98D0	0x4F91	# <CJK>
0x98D1	0x4F6F	# <CJK>
0x98D2	0x4F86	# <CJK>
0x98D3	0x4F96	# <CJK>
0x98D4	0x5118	# <CJK>
0x98D5	0x4FD4	# <CJK>
0x98D6	0x4FDF	# <CJK>
0x98D7	0x4FCE	# <CJK>
0x98D8	0x4FD8	# <CJK>
0x98D9	0x4FDB	# <CJK>
0x98DA	0x4FD1	# <CJK>
0x98DB	0x4FDA	# <CJK>
0x98DC	0x4FD0	# <CJK>
0x98DD	0x4FE4	# <CJK>
0x98DE	0x4FE5	# <CJK>
0x98DF	0x501A	# <CJK>
0x98E0	0x5028	# <CJK>
0x98E1	0x5014	# <CJK>
0x98E2	0x502A	# <CJK>
0x98E3	0x5025	# <CJK>
0x98E4	0x5005	# <CJK>
0x98E5	0x4F1C	# <CJK>
0x98E6	0x4FF6	# <CJK>
0x98E7	0x5021	# <CJK>
0x98E8	0x5029	# <CJK>
0x98E9	0x502C	# <CJK>
0x98EA	0x4FFE	# <CJK>
0x98EB	0x4FEF	# <CJK>
0x98EC	0x5011	# <CJK>
0x98ED	0x5006	# <CJK>
0x98EE	0x5043	# <CJK>
0x98EF	0x5047	# <CJK>
0x98F0	0x6703	# <CJK>
0x98F1	0x5055	# <CJK>
0x98F2	0x5050	# <CJK>
0x98F3	0x5048	# <CJK>
0x98F4	0x505A	# <CJK>
0x98F5	0x5056	# <CJK>
0x98F6	0x506C	# <CJK>
0x98F7	0x5078	# <CJK>
0x98F8	0x5080	# <CJK>
0x98F9	0x509A	# <CJK>
0x98FA	0x5085	# <CJK>
0x98FB	0x50B4	# <CJK>
0x98FC	0x50B2	# <CJK>
0x9940	0x50C9	# <CJK>
0x9941	0x50CA	# <CJK>
0x9942	0x50B3	# <CJK>
0x9943	0x50C2	# <CJK>
0x9944	0x50D6	# <CJK>
0x9945	0x50DE	# <CJK>
0x9946	0x50E5	# <CJK>
0x9947	0x50ED	# <CJK>
0x9948	0x50E3	# <CJK>
0x9949	0x50EE	# <CJK>
0x994A	0x50F9	# <CJK>
0x994B	0x50F5	# <CJK>
0x994C	0x5109	# <CJK>
0x994D	0x5101	# <CJK>
0x994E	0x5102	# <CJK>
0x994F	0x5116	# <CJK>
0x9950	0x5115	# <CJK>
0x9951	0x5114	# <CJK>
0x9952	0x511A	# <CJK>
0x9953	0x5121	# <CJK>
0x9954	0x513A	# <CJK>
0x9955	0x5137	# <CJK>
0x9956	0x513C	# <CJK>
0x9957	0x513B	# <CJK>
0x9958	0x513F	# <CJK>
0x9959	0x5140	# <CJK>
0x995A	0x5152	# <CJK>
0x995B	0x514C	# <CJK>
0x995C	0x5154	# <CJK>
0x995D	0x5162	# <CJK>
0x995E	0x7AF8	# <CJK>
0x995F	0x5169	# <CJK>
0x9960	0x516A	# <CJK>
0x9961	0x516E	# <CJK>
0x9962	0x5180	# <CJK>
0x9963	0x5182	# <CJK>
0x9964	0x56D8	# <CJK>
0x9965	0x518C	# <CJK>
0x9966	0x5189	# <CJK>
0x9967	0x518F	# <CJK>
0x9968	0x5191	# <CJK>
0x9969	0x5193	# <CJK>
0x996A	0x5195	# <CJK>
0x996B	0x5196	# <CJK>
0x996C	0x51A4	# <CJK>
0x996D	0x51A6	# <CJK>
0x996E	0x51A2	# <CJK>
0x996F	0x51A9	# <CJK>
0x9970	0x51AA	# <CJK>
0x9971	0x51AB	# <CJK>
0x9972	0x51B3	# <CJK>
0x9973	0x51B1	# <CJK>
0x9974	0x51B2	# <CJK>
0x9975	0x51B0	# <CJK>
0x9976	0x51B5	# <CJK>
0x9977	0x51BD	# <CJK>
0x9978	0x51C5	# <CJK>
0x9979	0x51C9	# <CJK>
0x997A	0x51DB	# <CJK>
0x997B	0x51E0	# <CJK>
0x997C	0x8655	# <CJK>
0x997D	0x51E9	# <CJK>
0x997E	0x51ED	# <CJK>
0x9980	0x51F0	# <CJK>
0x9981	0x51F5	# <CJK>
0x9982	0x51FE	# <CJK>
0x9983	0x5204	# <CJK>
0x9984	0x520B	# <CJK>
0x9985	0x5214	# <CJK>
0x9986	0x520E	# <CJK>
0x9987	0x5227	# <CJK>
0x9988	0x522A	# <CJK>
0x9989	0x522E	# <CJK>
0x998A	0x5233	# <CJK>
0x998B	0x5239	# <CJK>
0x998C	0x524F	# <CJK>
0x998D	0x5244	# <CJK>
0x998E	0x524B	# <CJK>
0x998F	0x524C	# <CJK>
0x9990	0x525E	# <CJK>
0x9991	0x5254	# <CJK>
0x9992	0x526A	# <CJK>
0x9993	0x5274	# <CJK>
0x9994	0x5269	# <CJK>
0x9995	0x5273	# <CJK>
0x9996	0x527F	# <CJK>
0x9997	0x527D	# <CJK>
0x9998	0x528D	# <CJK>
0x9999	0x5294	# <CJK>
0x999A	0x5292	# <CJK>
0x999B	0x5271	# <CJK>
0x999C	0x5288	# <CJK>
0x999D	0x5291	# <CJK>
0x999E	0x8FA8	# <CJK>
0x999F	0x8FA7	# <CJK>
0x99A0	0x52AC	# <CJK>
0x99A1	0x52AD	# <CJK>
0x99A2	0x52BC	# <CJK>
0x99A3	0x52B5	# <CJK>
0x99A4	0x52C1	# <CJK>
0x99A5	0x52CD	# <CJK>
0x99A6	0x52D7	# <CJK>
0x99A7	0x52DE	# <CJK>
0x99A8	0x52E3	# <CJK>
0x99A9	0x52E6	# <CJK>
0x99AA	0x98ED	# <CJK>
0x99AB	0x52E0	# <CJK>
0x99AC	0x52F3	# <CJK>
0x99AD	0x52F5	# <CJK>
0x99AE	0x52F8	# <CJK>
0x99AF	0x52F9	# <CJK>
0x99B0	0x5306	# <CJK>
0x99B1	0x5308	# <CJK>
0x99B2	0x7538	# <CJK>
0x99B3	0x530D	# <CJK>
0x99B4	0x5310	# <CJK>
0x99B5	0x530F	# <CJK>
0x99B6	0x5315	# <CJK>
0x99B7	0x531A	# <CJK>
0x99B8	0x5323	# <CJK>
0x99B9	0x532F	# <CJK>
0x99BA	0x5331	# <CJK>
0x99BB	0x5333	# <CJK>
0x99BC	0x5338	# <CJK>
0x99BD	0x5340	# <CJK>
0x99BE	0x5346	# <CJK>
0x99BF	0x5345	# <CJK>
0x99C0	0x4E17	# <CJK>
0x99C1	0x5349	# <CJK>
0x99C2	0x534D	# <CJK>
0x99C3	0x51D6	# <CJK>
0x99C4	0x535E	# <CJK>
0x99C5	0x5369	# <CJK>
0x99C6	0x536E	# <CJK>
0x99C7	0x5918	# <CJK>
0x99C8	0x537B	# <CJK>
0x99C9	0x5377	# <CJK>
0x99CA	0x5382	# <CJK>
0x99CB	0x5396	# <CJK>
0x99CC	0x53A0	# <CJK>
0x99CD	0x53A6	# <CJK>
0x99CE	0x53A5	# <CJK>
0x99CF	0x53AE	# <CJK>
0x99D0	0x53B0	# <CJK>
0x99D1	0x53B6	# <CJK>
0x99D2	0x53C3	# <CJK>
0x99D3	0x7C12	# <CJK>
0x99D4	0x96D9	# <CJK>
0x99D5	0x53DF	# <CJK>
0x99D6	0x66FC	# <CJK>
0x99D7	0x71EE	# <CJK>
0x99D8	0x53EE	# <CJK>
0x99D9	0x53E8	# <CJK>
0x99DA	0x53ED	# <CJK>
0x99DB	0x53FA	# <CJK>
0x99DC	0x5401	# <CJK>
0x99DD	0x543D	# <CJK>
0x99DE	0x5440	# <CJK>
0x99DF	0x542C	# <CJK>
0x99E0	0x542D	# <CJK>
0x99E1	0x543C	# <CJK>
0x99E2	0x542E	# <CJK>
0x99E3	0x5436	# <CJK>
0x99E4	0x5429	# <CJK>
0x99E5	0x541D	# <CJK>
0x99E6	0x544E	# <CJK>
0x99E7	0x548F	# <CJK>
0x99E8	0x5475	# <CJK>
0x99E9	0x548E	# <CJK>
0x99EA	0x545F	# <CJK>
0x99EB	0x5471	# <CJK>
0x99EC	0x5477	# <CJK>
0x99ED	0x5470	# <CJK>
0x99EE	0x5492	# <CJK>
0x99EF	0x547B	# <CJK>
0x99F0	0x5480	# <CJK>
0x99F1	0x5476	# <CJK>
0x99F2	0x5484	# <CJK>
0x99F3	0x5490	# <CJK>
0x99F4	0x5486	# <CJK>
0x99F5	0x54C7	# <CJK>
0x99F6	0x54A2	# <CJK>
0x99F7	0x54B8	# <CJK>
0x99F8	0x54A5	# <CJK>
0x99F9	0x54AC	# <CJK>
0x99FA	0x54C4	# <CJK>
0x99FB	0x54C8	# <CJK>
0x99FC	0x54A8	# <CJK>
0x9A40	0x54AB	# <CJK>
0x9A41	0x54C2	# <CJK>
0x9A42	0x54A4	# <CJK>
0x9A43	0x54BE	# <CJK>
0x9A44	0x54BC	# <CJK>
0x9A45	0x54D8	# <CJK>
0x9A46	0x54E5	# <CJK>
0x9A47	0x54E6	# <CJK>
0x9A48	0x550F	# <CJK>
0x9A49	0x5514	# <CJK>
0x9A4A	0x54FD	# <CJK>
0x9A4B	0x54EE	# <CJK>
0x9A4C	0x54ED	# <CJK>
0x9A4D	0x54FA	# <CJK>
0x9A4E	0x54E2	# <CJK>
0x9A4F	0x5539	# <CJK>
0x9A50	0x5540	# <CJK>
0x9A51	0x5563	# <CJK>
0x9A52	0x554C	# <CJK>
0x9A53	0x552E	# <CJK>
0x9A54	0x555C	# <CJK>
0x9A55	0x5545	# <CJK>
0x9A56	0x5556	# <CJK>
0x9A57	0x5557	# <CJK>
0x9A58	0x5538	# <CJK>
0x9A59	0x5533	# <CJK>
0x9A5A	0x555D	# <CJK>
0x9A5B	0x5599	# <CJK>
0x9A5C	0x5580	# <CJK>
0x9A5D	0x54AF	# <CJK>
0x9A5E	0x558A	# <CJK>
0x9A5F	0x559F	# <CJK>
0x9A60	0x557B	# <CJK>
0x9A61	0x557E	# <CJK>
0x9A62	0x5598	# <CJK>
0x9A63	0x559E	# <CJK>
0x9A64	0x55AE	# <CJK>
0x9A65	0x557C	# <CJK>
0x9A66	0x5583	# <CJK>
0x9A67	0x55A9	# <CJK>
0x9A68	0x5587	# <CJK>
0x9A69	0x55A8	# <CJK>
0x9A6A	0x55DA	# <CJK>
0x9A6B	0x55C5	# <CJK>
0x9A6C	0x55DF	# <CJK>
0x9A6D	0x55C4	# <CJK>
0x9A6E	0x55DC	# <CJK>
0x9A6F	0x55E4	# <CJK>
0x9A70	0x55D4	# <CJK>
0x9A71	0x5614	# <CJK>
0x9A72	0x55F7	# <CJK>
0x9A73	0x5616	# <CJK>
0x9A74	0x55FE	# <CJK>
0x9A75	0x55FD	# <CJK>
0x9A76	0x561B	# <CJK>
0x9A77	0x55F9	# <CJK>
0x9A78	0x564E	# <CJK>
0x9A79	0x5650	# <CJK>
0x9A7A	0x71DF	# <CJK>
0x9A7B	0x5634	# <CJK>
0x9A7C	0x5636	# <CJK>
0x9A7D	0x5632	# <CJK>
0x9A7E	0x5638	# <CJK>
0x9A80	0x566B	# <CJK>
0x9A81	0x5664	# <CJK>
0x9A82	0x562F	# <CJK>
0x9A83	0x566C	# <CJK>
0x9A84	0x566A	# <CJK>
0x9A85	0x5686	# <CJK>
0x9A86	0x5680	# <CJK>
0x9A87	0x568A	# <CJK>
0x9A88	0x56A0	# <CJK>
0x9A89	0x5694	# <CJK>
0x9A8A	0x568F	# <CJK>
0x9A8B	0x56A5	# <CJK>
0x9A8C	0x56AE	# <CJK>
0x9A8D	0x56B6	# <CJK>
0x9A8E	0x56B4	# <CJK>
0x9A8F	0x56C2	# <CJK>
0x9A90	0x56BC	# <CJK>
0x9A91	0x56C1	# <CJK>
0x9A92	0x56C3	# <CJK>
0x9A93	0x56C0	# <CJK>
0x9A94	0x56C8	# <CJK>
0x9A95	0x56CE	# <CJK>
0x9A96	0x56D1	# <CJK>
0x9A97	0x56D3	# <CJK>
0x9A98	0x56D7	# <CJK>
0x9A99	0x56EE	# <CJK>
0x9A9A	0x56F9	# <CJK>
0x9A9B	0x5700	# <CJK>
0x9A9C	0x56FF	# <CJK>
0x9A9D	0x5704	# <CJK>
0x9A9E	0x5709	# <CJK>
0x9A9F	0x5708	# <CJK>
0x9AA0	0x570B	# <CJK>
0x9AA1	0x570D	# <CJK>
0x9AA2	0x5713	# <CJK>
0x9AA3	0x5718	# <CJK>
0x9AA4	0x5716	# <CJK>
0x9AA5	0x55C7	# <CJK>
0x9AA6	0x571C	# <CJK>
0x9AA7	0x5726	# <CJK>
0x9AA8	0x5737	# <CJK>
0x9AA9	0x5738	# <CJK>
0x9AAA	0x574E	# <CJK>
0x9AAB	0x573B	# <CJK>
0x9AAC	0x5740	# <CJK>
0x9AAD	0x574F	# <CJK>
0x9AAE	0x5769	# <CJK>
0x9AAF	0x57C0	# <CJK>
0x9AB0	0x5788	# <CJK>
0x9AB1	0x5761	# <CJK>
0x9AB2	0x577F	# <CJK>
0x9AB3	0x5789	# <CJK>
0x9AB4	0x5793	# <CJK>
0x9AB5	0x57A0	# <CJK>
0x9AB6	0x57B3	# <CJK>
0x9AB7	0x57A4	# <CJK>
0x9AB8	0x57AA	# <CJK>
0x9AB9	0x57B0	# <CJK>
0x9ABA	0x57C3	# <CJK>
0x9ABB	0x57C6	# <CJK>
0x9ABC	0x57D4	# <CJK>
0x9ABD	0x57D2	# <CJK>
0x9ABE	0x57D3	# <CJK>
0x9ABF	0x580A	# <CJK>
0x9AC0	0x57D6	# <CJK>
0x9AC1	0x57E3	# <CJK>
0x9AC2	0x580B	# <CJK>
0x9AC3	0x5819	# <CJK>
0x9AC4	0x581D	# <CJK>
0x9AC5	0x5872	# <CJK>
0x9AC6	0x5821	# <CJK>
0x9AC7	0x5862	# <CJK>
0x9AC8	0x584B	# <CJK>
0x9AC9	0x5870	# <CJK>
0x9ACA	0x6BC0	# <CJK>
0x9ACB	0x5852	# <CJK>
0x9ACC	0x583D	# <CJK>
0x9ACD	0x5879	# <CJK>
0x9ACE	0x5885	# <CJK>
0x9ACF	0x58B9	# <CJK>
0x9AD0	0x589F	# <CJK>
0x9AD1	0x58AB	# <CJK>
0x9AD2	0x58BA	# <CJK>
0x9AD3	0x58DE	# <CJK>
0x9AD4	0x58BB	# <CJK>
0x9AD5	0x58B8	# <CJK>
0x9AD6	0x58AE	# <CJK>
0x9AD7	0x58C5	# <CJK>
0x9AD8	0x58D3	# <CJK>
0x9AD9	0x58D1	# <CJK>
0x9ADA	0x58D7	# <CJK>
0x9ADB	0x58D9	# <CJK>
0x9ADC	0x58D8	# <CJK>
0x9ADD	0x58E5	# <CJK>
0x9ADE	0x58DC	# <CJK>
0x9ADF	0x58E4	# <CJK>
0x9AE0	0x58DF	# <CJK>
0x9AE1	0x58EF	# <CJK>
0x9AE2	0x58FA	# <CJK>
0x9AE3	0x58F9	# <CJK>
0x9AE4	0x58FB	# <CJK>
0x9AE5	0x58FC	# <CJK>
0x9AE6	0x58FD	# <CJK>
0x9AE7	0x5902	# <CJK>
0x9AE8	0x590A	# <CJK>
0x9AE9	0x5910	# <CJK>
0x9AEA	0x591B	# <CJK>
0x9AEB	0x68A6	# <CJK>
0x9AEC	0x5925	# <CJK>
0x9AED	0x592C	# <CJK>
0x9AEE	0x592D	# <CJK>
0x9AEF	0x5932	# <CJK>
0x9AF0	0x5938	# <CJK>
0x9AF1	0x593E	# <CJK>
0x9AF2	0x7AD2	# <CJK>
0x9AF3	0x5955	# <CJK>
0x9AF4	0x5950	# <CJK>
0x9AF5	0x594E	# <CJK>
0x9AF6	0x595A	# <CJK>
0x9AF7	0x5958	# <CJK>
0x9AF8	0x5962	# <CJK>
0x9AF9	0x5960	# <CJK>
0x9AFA	0x5967	# <CJK>
0x9AFB	0x596C	# <CJK>
0x9AFC	0x5969	# <CJK>
0x9B40	0x5978	# <CJK>
0x9B41	0x5981	# <CJK>
0x9B42	0x599D	# <CJK>
0x9B43	0x4F5E	# <CJK>
0x9B44	0x4FAB	# <CJK>
0x9B45	0x59A3	# <CJK>
0x9B46	0x59B2	# <CJK>
0x9B47	0x59C6	# <CJK>
0x9B48	0x59E8	# <CJK>
0x9B49	0x59DC	# <CJK>
0x9B4A	0x598D	# <CJK>
0x9B4B	0x59D9	# <CJK>
0x9B4C	0x59DA	# <CJK>
0x9B4D	0x5A25	# <CJK>
0x9B4E	0x5A1F	# <CJK>
0x9B4F	0x5A11	# <CJK>
0x9B50	0x5A1C	# <CJK>
0x9B51	0x5A09	# <CJK>
0x9B52	0x5A1A	# <CJK>
0x9B53	0x5A40	# <CJK>
0x9B54	0x5A6C	# <CJK>
0x9B55	0x5A49	# <CJK>
0x9B56	0x5A35	# <CJK>
0x9B57	0x5A36	# <CJK>
0x9B58	0x5A62	# <CJK>
0x9B59	0x5A6A	# <CJK>
0x9B5A	0x5A9A	# <CJK>
0x9B5B	0x5ABC	# <CJK>
0x9B5C	0x5ABE	# <CJK>
0x9B5D	0x5ACB	# <CJK>
0x9B5E	0x5AC2	# <CJK>
0x9B5F	0x5ABD	# <CJK>
0x9B60	0x5AE3	# <CJK>
0x9B61	0x5AD7	# <CJK>
0x9B62	0x5AE6	# <CJK>
0x9B63	0x5AE9	# <CJK>
0x9B64	0x5AD6	# <CJK>
0x9B65	0x5AFA	# <CJK>
0x9B66	0x5AFB	# <CJK>
0x9B67	0x5B0C	# <CJK>
0x9B68	0x5B0B	# <CJK>
0x9B69	0x5B16	# <CJK>
0x9B6A	0x5B32	# <CJK>
0x9B6B	0x5AD0	# <CJK>
0x9B6C	0x5B2A	# <CJK>
0x9B6D	0x5B36	# <CJK>
0x9B6E	0x5B3E	# <CJK>
0x9B6F	0x5B43	# <CJK>
0x9B70	0x5B45	# <CJK>
0x9B71	0x5B40	# <CJK>
0x9B72	0x5B51	# <CJK>
0x9B73	0x5B55	# <CJK>
0x9B74	0x5B5A	# <CJK>
0x9B75	0x5B5B	# <CJK>
0x9B76	0x5B65	# <CJK>
0x9B77	0x5B69	# <CJK>
0x9B78	0x5B70	# <CJK>
0x9B79	0x5B73	# <CJK>
0x9B7A	0x5B75	# <CJK>
0x9B7B	0x5B78	# <CJK>
0x9B7C	0x6588	# <CJK>
0x9B7D	0x5B7A	# <CJK>
0x9B7E	0x5B80	# <CJK>
0x9B80	0x5B83	# <CJK>
0x9B81	0x5BA6	# <CJK>
0x9B82	0x5BB8	# <CJK>
0x9B83	0x5BC3	# <CJK>
0x9B84	0x5BC7	# <CJK>
0x9B85	0x5BC9	# <CJK>
0x9B86	0x5BD4	# <CJK>
0x9B87	0x5BD0	# <CJK>
0x9B88	0x5BE4	# <CJK>
0x9B89	0x5BE6	# <CJK>
0x9B8A	0x5BE2	# <CJK>
0x9B8B	0x5BDE	# <CJK>
0x9B8C	0x5BE5	# <CJK>
0x9B8D	0x5BEB	# <CJK>
0x9B8E	0x5BF0	# <CJK>
0x9B8F	0x5BF6	# <CJK>
0x9B90	0x5BF3	# <CJK>
0x9B91	0x5C05	# <CJK>
0x9B92	0x5C07	# <CJK>
0x9B93	0x5C08	# <CJK>
0x9B94	0x5C0D	# <CJK>
0x9B95	0x5C13	# <CJK>
0x9B96	0x5C20	# <CJK>
0x9B97	0x5C22	# <CJK>
0x9B98	0x5C28	# <CJK>
0x9B99	0x5C38	# <CJK>
0x9B9A	0x5C39	# <CJK>
0x9B9B	0x5C41	# <CJK>
0x9B9C	0x5C46	# <CJK>
0x9B9D	0x5C4E	# <CJK>
0x9B9E	0x5C53	# <CJK>
0x9B9F	0x5C50	# <CJK>
0x9BA0	0x5C4F	# <CJK>
0x9BA1	0x5B71	# <CJK>
0x9BA2	0x5C6C	# <CJK>
0x9BA3	0x5C6E	# <CJK>
0x9BA4	0x4E62	# <CJK>
0x9BA5	0x5C76	# <CJK>
0x9BA6	0x5C79	# <CJK>
0x9BA7	0x5C8C	# <CJK>
0x9BA8	0x5C91	# <CJK>
0x9BA9	0x5C94	# <CJK>
0x9BAA	0x599B	# <CJK>
0x9BAB	0x5CAB	# <CJK>
0x9BAC	0x5CBB	# <CJK>
0x9BAD	0x5CB6	# <CJK>
0x9BAE	0x5CBC	# <CJK>
0x9BAF	0x5CB7	# <CJK>
0x9BB0	0x5CC5	# <CJK>
0x9BB1	0x5CBE	# <CJK>
0x9BB2	0x5CC7	# <CJK>
0x9BB3	0x5CD9	# <CJK>
0x9BB4	0x5CE9	# <CJK>
0x9BB5	0x5CFD	# <CJK>
0x9BB6	0x5CFA	# <CJK>
0x9BB7	0x5CED	# <CJK>
0x9BB8	0x5D8C	# <CJK>
0x9BB9	0x5CEA	# <CJK>
0x9BBA	0x5D0B	# <CJK>
0x9BBB	0x5D15	# <CJK>
0x9BBC	0x5D17	# <CJK>
0x9BBD	0x5D5C	# <CJK>
0x9BBE	0x5D1F	# <CJK>
0x9BBF	0x5D1B	# <CJK>
0x9BC0	0x5D11	# <CJK>
0x9BC1	0x5D14	# <CJK>
0x9BC2	0x5D22	# <CJK>
0x9BC3	0x5D1A	# <CJK>
0x9BC4	0x5D19	# <CJK>
0x9BC5	0x5D18	# <CJK>
0x9BC6	0x5D4C	# <CJK>
0x9BC7	0x5D52	# <CJK>
0x9BC8	0x5D4E	# <CJK>
0x9BC9	0x5D4B	# <CJK>
0x9BCA	0x5D6C	# <CJK>
0x9BCB	0x5D73	# <CJK>
0x9BCC	0x5D76	# <CJK>
0x9BCD	0x5D87	# <CJK>
0x9BCE	0x5D84	# <CJK>
0x9BCF	0x5D82	# <CJK>
0x9BD0	0x5DA2	# <CJK>
0x9BD1	0x5D9D	# <CJK>
0x9BD2	0x5DAC	# <CJK>
0x9BD3	0x5DAE	# <CJK>
0x9BD4	0x5DBD	# <CJK>
0x9BD5	0x5D90	# <CJK>
0x9BD6	0x5DB7	# <CJK>
0x9BD7	0x5DBC	# <CJK>
0x9BD8	0x5DC9	# <CJK>
0x9BD9	0x5DCD	# <CJK>
0x9BDA	0x5DD3	# <CJK>
0x9BDB	0x5DD2	# <CJK>
0x9BDC	0x5DD6	# <CJK>
0x9BDD	0x5DDB	# <CJK>
0x9BDE	0x5DEB	# <CJK>
0x9BDF	0x5DF2	# <CJK>
0x9BE0	0x5DF5	# <CJK>
0x9BE1	0x5E0B	# <CJK>
0x9BE2	0x5E1A	# <CJK>
0x9BE3	0x5E19	# <CJK>
0x9BE4	0x5E11	# <CJK>
0x9BE5	0x5E1B	# <CJK>
0x9BE6	0x5E36	# <CJK>
0x9BE7	0x5E37	# <CJK>
0x9BE8	0x5E44	# <CJK>
0x9BE9	0x5E43	# <CJK>
0x9BEA	0x5E40	# <CJK>
0x9BEB	0x5E4E	# <CJK>
0x9BEC	0x5E57	# <CJK>
0x9BED	0x5E54	# <CJK>
0x9BEE	0x5E5F	# <CJK>
0x9BEF	0x5E62	# <CJK>
0x9BF0	0x5E64	# <CJK>
0x9BF1	0x5E47	# <CJK>
0x9BF2	0x5E75	# <CJK>
0x9BF3	0x5E76	# <CJK>
0x9BF4	0x5E7A	# <CJK>
0x9BF5	0x9EBC	# <CJK>
0x9BF6	0x5E7F	# <CJK>
0x9BF7	0x5EA0	# <CJK>
0x9BF8	0x5EC1	# <CJK>
0x9BF9	0x5EC2	# <CJK>
0x9BFA	0x5EC8	# <CJK>
0x9BFB	0x5ED0	# <CJK>
0x9BFC	0x5ECF	# <CJK>
0x9C40	0x5ED6	# <CJK>
0x9C41	0x5EE3	# <CJK>
0x9C42	0x5EDD	# <CJK>
0x9C43	0x5EDA	# <CJK>
0x9C44	0x5EDB	# <CJK>
0x9C45	0x5EE2	# <CJK>
0x9C46	0x5EE1	# <CJK>
0x9C47	0x5EE8	# <CJK>
0x9C48	0x5EE9	# <CJK>
0x9C49	0x5EEC	# <CJK>
0x9C4A	0x5EF1	# <CJK>
0x9C4B	0x5EF3	# <CJK>
0x9C4C	0x5EF0	# <CJK>
0x9C4D	0x5EF4	# <CJK>
0x9C4E	0x5EF8	# <CJK>
0x9C4F	0x5EFE	# <CJK>
0x9C50	0x5F03	# <CJK>
0x9C51	0x5F09	# <CJK>
0x9C52	0x5F5D	# <CJK>
0x9C53	0x5F5C	# <CJK>
0x9C54	0x5F0B	# <CJK>
0x9C55	0x5F11	# <CJK>
0x9C56	0x5F16	# <CJK>
0x9C57	0x5F29	# <CJK>
0x9C58	0x5F2D	# <CJK>
0x9C59	0x5F38	# <CJK>
0x9C5A	0x5F41	# <CJK>
0x9C5B	0x5F48	# <CJK>
0x9C5C	0x5F4C	# <CJK>
0x9C5D	0x5F4E	# <CJK>
0x9C5E	0x5F2F	# <CJK>
0x9C5F	0x5F51	# <CJK>
0x9C60	0x5F56	# <CJK>
0x9C61	0x5F57	# <CJK>
0x9C62	0x5F59	# <CJK>
0x9C63	0x5F61	# <CJK>
0x9C64	0x5F6D	# <CJK>
0x9C65	0x5F73	# <CJK>
0x9C66	0x5F77	# <CJK>
0x9C67	0x5F83	# <CJK>
0x9C68	0x5F82	# <CJK>
0x9C69	0x5F7F	# <CJK>
0x9C6A	0x5F8A	# <CJK>
0x9C6B	0x5F88	# <CJK>
0x9C6C	0x5F91	# <CJK>
0x9C6D	0x5F87	# <CJK>
0x9C6E	0x5F9E	# <CJK>
0x9C6F	0x5F99	# <CJK>
0x9C70	0x5F98	# <CJK>
0x9C71	0x5FA0	# <CJK>
0x9C72	0x5FA8	# <CJK>
0x9C73	0x5FAD	# <CJK>
0x9C74	0x5FBC	# <CJK>
0x9C75	0x5FD6	# <CJK>
0x9C76	0x5FFB	# <CJK>
0x9C77	0x5FE4	# <CJK>
0x9C78	0x5FF8	# <CJK>
0x9C79	0x5FF1	# <CJK>
0x9C7A	0x5FDD	# <CJK>
0x9C7B	0x60B3	# <CJK>
0x9C7C	0x5FFF	# <CJK>
0x9C7D	0x6021	# <CJK>
0x9C7E	0x6060	# <CJK>
0x9C80	0x6019	# <CJK>
0x9C81	0x6010	# <CJK>
0x9C82	0x6029	# <CJK>
0x9C83	0x600E	# <CJK>
0x9C84	0x6031	# <CJK>
0x9C85	0x601B	# <CJK>
0x9C86	0x6015	# <CJK>
0x9C87	0x602B	# <CJK>
0x9C88	0x6026	# <CJK>
0x9C89	0x600F	# <CJK>
0x9C8A	0x603A	# <CJK>
0x9C8B	0x605A	# <CJK>
0x9C8C	0x6041	# <CJK>
0x9C8D	0x606A	# <CJK>
0x9C8E	0x6077	# <CJK>
0x9C8F	0x605F	# <CJK>
0x9C90	0x604A	# <CJK>
0x9C91	0x6046	# <CJK>
0x9C92	0x604D	# <CJK>
0x9C93	0x6063	# <CJK>
0x9C94	0x6043	# <CJK>
0x9C95	0x6064	# <CJK>
0x9C96	0x6042	# <CJK>
0x9C97	0x606C	# <CJK>
0x9C98	0x606B	# <CJK>
0x9C99	0x6059	# <CJK>
0x9C9A	0x6081	# <CJK>
0x9C9B	0x608D	# <CJK>
0x9C9C	0x60E7	# <CJK>
0x9C9D	0x6083	# <CJK>
0x9C9E	0x609A	# <CJK>
0x9C9F	0x6084	# <CJK>
0x9CA0	0x609B	# <CJK>
0x9CA1	0x6096	# <CJK>
0x9CA2	0x6097	# <CJK>
0x9CA3	0x6092	# <CJK>
0x9CA4	0x60A7	# <CJK>
0x9CA5	0x608B	# <CJK>
0x9CA6	0x60E1	# <CJK>
0x9CA7	0x60B8	# <CJK>
0x9CA8	0x60E0	# <CJK>
0x9CA9	0x60D3	# <CJK>
0x9CAA	0x60B4	# <CJK>
0x9CAB	0x5FF0	# <CJK>
0x9CAC	0x60BD	# <CJK>
0x9CAD	0x60C6	# <CJK>
0x9CAE	0x60B5	# <CJK>
0x9CAF	0x60D8	# <CJK>
0x9CB0	0x614D	# <CJK>
0x9CB1	0x6115	# <CJK>
0x9CB2	0x6106	# <CJK>
0x9CB3	0x60F6	# <CJK>
0x9CB4	0x60F7	# <CJK>
0x9CB5	0x6100	# <CJK>
0x9CB6	0x60F4	# <CJK>
0x9CB7	0x60FA	# <CJK>
0x9CB8	0x6103	# <CJK>
0x9CB9	0x6121	# <CJK>
0x9CBA	0x60FB	# <CJK>
0x9CBB	0x60F1	# <CJK>
0x9CBC	0x610D	# <CJK>
0x9CBD	0x610E	# <CJK>
0x9CBE	0x6147	# <CJK>
0x9CBF	0x613E	# <CJK>
0x9CC0	0x6128	# <CJK>
0x9CC1	0x6127	# <CJK>
0x9CC2	0x614A	# <CJK>
0x9CC3	0x613F	# <CJK>
0x9CC4	0x613C	# <CJK>
0x9CC5	0x612C	# <CJK>
0x9CC6	0x6134	# <CJK>
0x9CC7	0x613D	# <CJK>
0x9CC8	0x6142	# <CJK>
0x9CC9	0x6144	# <CJK>
0x9CCA	0x6173	# <CJK>
0x9CCB	0x6177	# <CJK>
0x9CCC	0x6158	# <CJK>
0x9CCD	0x6159	# <CJK>
0x9CCE	0x615A	# <CJK>
0x9CCF	0x616B	# <CJK>
0x9CD0	0x6174	# <CJK>
0x9CD1	0x616F	# <CJK>
0x9CD2	0x6165	# <CJK>
0x9CD3	0x6171	# <CJK>
0x9CD4	0x615F	# <CJK>
0x9CD5	0x615D	# <CJK>
0x9CD6	0x6153	# <CJK>
0x9CD7	0x6175	# <CJK>
0x9CD8	0x6199	# <CJK>
0x9CD9	0x6196	# <CJK>
0x9CDA	0x6187	# <CJK>
0x9CDB	0x61AC	# <CJK>
0x9CDC	0x6194	# <CJK>
0x9CDD	0x619A	# <CJK>
0x9CDE	0x618A	# <CJK>
0x9CDF	0x6191	# <CJK>
0x9CE0	0x61AB	# <CJK>
0x9CE1	0x61AE	# <CJK>
0x9CE2	0x61CC	# <CJK>
0x9CE3	0x61CA	# <CJK>
0x9CE4	0x61C9	# <CJK>
0x9CE5	0x61F7	# <CJK>
0x9CE6	0x61C8	# <CJK>
0x9CE7	0x61C3	# <CJK>
0x9CE8	0x61C6	# <CJK>
0x9CE9	0x61BA	# <CJK>
0x9CEA	0x61CB	# <CJK>
0x9CEB	0x7F79	# <CJK>
0x9CEC	0x61CD	# <CJK>
0x9CED	0x61E6	# <CJK>
0x9CEE	0x61E3	# <CJK>
0x9CEF	0x61F6	# <CJK>
0x9CF0	0x61FA	# <CJK>
0x9CF1	0x61F4	# <CJK>
0x9CF2	0x61FF	# <CJK>
0x9CF3	0x61FD	# <CJK>
0x9CF4	0x61FC	# <CJK>
0x9CF5	0x61FE	# <CJK>
0x9CF6	0x6200	# <CJK>
0x9CF7	0x6208	# <CJK>
0x9CF8	0x6209	# <CJK>
0x9CF9	0x620D	# <CJK>
0x9CFA	0x620C	# <CJK>
0x9CFB	0x6214	# <CJK>
0x9CFC	0x621B	# <CJK>
0x9D40	0x621E	# <CJK>
0x9D41	0x6221	# <CJK>
0x9D42	0x622A	# <CJK>
0x9D43	0x622E	# <CJK>
0x9D44	0x6230	# <CJK>
0x9D45	0x6232	# <CJK>
0x9D46	0x6233	# <CJK>
0x9D47	0x6241	# <CJK>
0x9D48	0x624E	# <CJK>
0x9D49	0x625E	# <CJK>
0x9D4A	0x6263	# <CJK>
0x9D4B	0x625B	# <CJK>
0x9D4C	0x6260	# <CJK>
0x9D4D	0x6268	# <CJK>
0x9D4E	0x627C	# <CJK>
0x9D4F	0x6282	# <CJK>
0x9D50	0x6289	# <CJK>
0x9D51	0x627E	# <CJK>
0x9D52	0x6292	# <CJK>
0x9D53	0x6293	# <CJK>
0x9D54	0x6296	# <CJK>
0x9D55	0x62D4	# <CJK>
0x9D56	0x6283	# <CJK>
0x9D57	0x6294	# <CJK>
0x9D58	0x62D7	# <CJK>
0x9D59	0x62D1	# <CJK>
0x9D5A	0x62BB	# <CJK>
0x9D5B	0x62CF	# <CJK>
0x9D5C	0x62FF	# <CJK>
0x9D5D	0x62C6	# <CJK>
0x9D5E	0x64D4	# <CJK>
0x9D5F	0x62C8	# <CJK>
0x9D60	0x62DC	# <CJK>
0x9D61	0x62CC	# <CJK>
0x9D62	0x62CA	# <CJK>
0x9D63	0x62C2	# <CJK>
0x9D64	0x62C7	# <CJK>
0x9D65	0x629B	# <CJK>
0x9D66	0x62C9	# <CJK>
0x9D67	0x630C	# <CJK>
0x9D68	0x62EE	# <CJK>
0x9D69	0x62F1	# <CJK>
0x9D6A	0x6327	# <CJK>
0x9D6B	0x6302	# <CJK>
0x9D6C	0x6308	# <CJK>
0x9D6D	0x62EF	# <CJK>
0x9D6E	0x62F5	# <CJK>
0x9D6F	0x6350	# <CJK>
0x9D70	0x633E	# <CJK>
0x9D71	0x634D	# <CJK>
0x9D72	0x641C	# <CJK>
0x9D73	0x634F	# <CJK>
0x9D74	0x6396	# <CJK>
0x9D75	0x638E	# <CJK>
0x9D76	0x6380	# <CJK>
0x9D77	0x63AB	# <CJK>
0x9D78	0x6376	# <CJK>
0x9D79	0x63A3	# <CJK>
0x9D7A	0x638F	# <CJK>
0x9D7B	0x6389	# <CJK>
0x9D7C	0x639F	# <CJK>
0x9D7D	0x63B5	# <CJK>
0x9D7E	0x636B	# <CJK>
0x9D80	0x6369	# <CJK>
0x9D81	0x63BE	# <CJK>
0x9D82	0x63E9	# <CJK>
0x9D83	0x63C0	# <CJK>
0x9D84	0x63C6	# <CJK>
0x9D85	0x63E3	# <CJK>
0x9D86	0x63C9	# <CJK>
0x9D87	0x63D2	# <CJK>
0x9D88	0x63F6	# <CJK>
0x9D89	0x63C4	# <CJK>
0x9D8A	0x6416	# <CJK>
0x9D8B	0x6434	# <CJK>
0x9D8C	0x6406	# <CJK>
0x9D8D	0x6413	# <CJK>
0x9D8E	0x6426	# <CJK>
0x9D8F	0x6436	# <CJK>
0x9D90	0x651D	# <CJK>
0x9D91	0x6417	# <CJK>
0x9D92	0x6428	# <CJK>
0x9D93	0x640F	# <CJK>
0x9D94	0x6467	# <CJK>
0x9D95	0x646F	# <CJK>
0x9D96	0x6476	# <CJK>
0x9D97	0x644E	# <CJK>
0x9D98	0x652A	# <CJK>
0x9D99	0x6495	# <CJK>
0x9D9A	0x6493	# <CJK>
0x9D9B	0x64A5	# <CJK>
0x9D9C	0x64A9	# <CJK>
0x9D9D	0x6488	# <CJK>
0x9D9E	0x64BC	# <CJK>
0x9D9F	0x64DA	# <CJK>
0x9DA0	0x64D2	# <CJK>
0x9DA1	0x64C5	# <CJK>
0x9DA2	0x64C7	# <CJK>
0x9DA3	0x64BB	# <CJK>
0x9DA4	0x64D8	# <CJK>
0x9DA5	0x64C2	# <CJK>
0x9DA6	0x64F1	# <CJK>
0x9DA7	0x64E7	# <CJK>
0x9DA8	0x8209	# <CJK>
0x9DA9	0x64E0	# <CJK>
0x9DAA	0x64E1	# <CJK>
0x9DAB	0x62AC	# <CJK>
0x9DAC	0x64E3	# <CJK>
0x9DAD	0x64EF	# <CJK>
0x9DAE	0x652C	# <CJK>
0x9DAF	0x64F6	# <CJK>
0x9DB0	0x64F4	# <CJK>
0x9DB1	0x64F2	# <CJK>
0x9DB2	0x64FA	# <CJK>
0x9DB3	0x6500	# <CJK>
0x9DB4	0x64FD	# <CJK>
0x9DB5	0x6518	# <CJK>
0x9DB6	0x651C	# <CJK>
0x9DB7	0x6505	# <CJK>
0x9DB8	0x6524	# <CJK>
0x9DB9	0x6523	# <CJK>
0x9DBA	0x652B	# <CJK>
0x9DBB	0x6534	# <CJK>
0x9DBC	0x6535	# <CJK>
0x9DBD	0x6537	# <CJK>
0x9DBE	0x6536	# <CJK>
0x9DBF	0x6538	# <CJK>
0x9DC0	0x754B	# <CJK>
0x9DC1	0x6548	# <CJK>
0x9DC2	0x6556	# <CJK>
0x9DC3	0x6555	# <CJK>
0x9DC4	0x654D	# <CJK>
0x9DC5	0x6558	# <CJK>
0x9DC6	0x655E	# <CJK>
0x9DC7	0x655D	# <CJK>
0x9DC8	0x6572	# <CJK>
0x9DC9	0x6578	# <CJK>
0x9DCA	0x6582	# <CJK>
0x9DCB	0x6583	# <CJK>
0x9DCC	0x8B8A	# <CJK>
0x9DCD	0x659B	# <CJK>
0x9DCE	0x659F	# <CJK>
0x9DCF	0x65AB	# <CJK>
0x9DD0	0x65B7	# <CJK>
0x9DD1	0x65C3	# <CJK>
0x9DD2	0x65C6	# <CJK>
0x9DD3	0x65C1	# <CJK>
0x9DD4	0x65C4	# <CJK>
0x9DD5	0x65CC	# <CJK>
0x9DD6	0x65D2	# <CJK>
0x9DD7	0x65DB	# <CJK>
0x9DD8	0x65D9	# <CJK>
0x9DD9	0x65E0	# <CJK>
0x9DDA	0x65E1	# <CJK>
0x9DDB	0x65F1	# <CJK>
0x9DDC	0x6772	# <CJK>
0x9DDD	0x660A	# <CJK>
0x9DDE	0x6603	# <CJK>
0x9DDF	0x65FB	# <CJK>
0x9DE0	0x6773	# <CJK>
0x9DE1	0x6635	# <CJK>
0x9DE2	0x6636	# <CJK>
0x9DE3	0x6634	# <CJK>
0x9DE4	0x661C	# <CJK>
0x9DE5	0x664F	# <CJK>
0x9DE6	0x6644	# <CJK>
0x9DE7	0x6649	# <CJK>
0x9DE8	0x6641	# <CJK>
0x9DE9	0x665E	# <CJK>
0x9DEA	0x665D	# <CJK>
0x9DEB	0x6664	# <CJK>
0x9DEC	0x6667	# <CJK>
0x9DED	0x6668	# <CJK>
0x9DEE	0x665F	# <CJK>
0x9DEF	0x6662	# <CJK>
0x9DF0	0x6670	# <CJK>
0x9DF1	0x6683	# <CJK>
0x9DF2	0x6688	# <CJK>
0x9DF3	0x668E	# <CJK>
0x9DF4	0x6689	# <CJK>
0x9DF5	0x6684	# <CJK>
0x9DF6	0x6698	# <CJK>
0x9DF7	0x669D	# <CJK>
0x9DF8	0x66C1	# <CJK>
0x9DF9	0x66B9	# <CJK>
0x9DFA	0x66C9	# <CJK>
0x9DFB	0x66BE	# <CJK>
0x9DFC	0x66BC	# <CJK>
0x9E40	0x66C4	# <CJK>
0x9E41	0x66B8	# <CJK>
0x9E42	0x66D6	# <CJK>
0x9E43	0x66DA	# <CJK>
0x9E44	0x66E0	# <CJK>
0x9E45	0x663F	# <CJK>
0x9E46	0x66E6	# <CJK>
0x9E47	0x66E9	# <CJK>
0x9E48	0x66F0	# <CJK>
0x9E49	0x66F5	# <CJK>
0x9E4A	0x66F7	# <CJK>
0x9E4B	0x670F	# <CJK>
0x9E4C	0x6716	# <CJK>
0x9E4D	0x671E	# <CJK>
0x9E4E	0x6726	# <CJK>
0x9E4F	0x6727	# <CJK>
0x9E50	0x9738	# <CJK>
0x9E51	0x672E	# <CJK>
0x9E52	0x673F	# <CJK>
0x9E53	0x6736	# <CJK>
0x9E54	0x6741	# <CJK>
0x9E55	0x6738	# <CJK>
0x9E56	0x6737	# <CJK>
0x9E57	0x6746	# <CJK>
0x9E58	0x675E	# <CJK>
0x9E59	0x6760	# <CJK>
0x9E5A	0x6759	# <CJK>
0x9E5B	0x6763	# <CJK>
0x9E5C	0x6764	# <CJK>
0x9E5D	0x6789	# <CJK>
0x9E5E	0x6770	# <CJK>
0x9E5F	0x67A9	# <CJK>
0x9E60	0x677C	# <CJK>
0x9E61	0x676A	# <CJK>
0x9E62	0x678C	# <CJK>
0x9E63	0x678B	# <CJK>
0x9E64	0x67A6	# <CJK>
0x9E65	0x67A1	# <CJK>
0x9E66	0x6785	# <CJK>
0x9E67	0x67B7	# <CJK>
0x9E68	0x67EF	# <CJK>
0x9E69	0x67B4	# <CJK>
0x9E6A	0x67EC	# <CJK>
0x9E6B	0x67B3	# <CJK>
0x9E6C	0x67E9	# <CJK>
0x9E6D	0x67B8	# <CJK>
0x9E6E	0x67E4	# <CJK>
0x9E6F	0x67DE	# <CJK>
0x9E70	0x67DD	# <CJK>
0x9E71	0x67E2	# <CJK>
0x9E72	0x67EE	# <CJK>
0x9E73	0x67B9	# <CJK>
0x9E74	0x67CE	# <CJK>
0x9E75	0x67C6	# <CJK>
0x9E76	0x67E7	# <CJK>
0x9E77	0x6A9C	# <CJK>
0x9E78	0x681E	# <CJK>
0x9E79	0x6846	# <CJK>
0x9E7A	0x6829	# <CJK>
0x9E7B	0x6840	# <CJK>
0x9E7C	0x684D	# <CJK>
0x9E7D	0x6832	# <CJK>
0x9E7E	0x684E	# <CJK>
0x9E80	0x68B3	# <CJK>
0x9E81	0x682B	# <CJK>
0x9E82	0x6859	# <CJK>
0x9E83	0x6863	# <CJK>
0x9E84	0x6877	# <CJK>
0x9E85	0x687F	# <CJK>
0x9E86	0x689F	# <CJK>
0x9E87	0x688F	# <CJK>
0x9E88	0x68AD	# <CJK>
0x9E89	0x6894	# <CJK>
0x9E8A	0x689D	# <CJK>
0x9E8B	0x689B	# <CJK>
0x9E8C	0x6883	# <CJK>
0x9E8D	0x6AAE	# <CJK>
0x9E8E	0x68B9	# <CJK>
0x9E8F	0x6874	# <CJK>
0x9E90	0x68B5	# <CJK>
0x9E91	0x68A0	# <CJK>
0x9E92	0x68BA	# <CJK>
0x9E93	0x690F	# <CJK>
0x9E94	0x688D	# <CJK>
0x9E95	0x687E	# <CJK>
0x9E96	0x6901	# <CJK>
0x9E97	0x68CA	# <CJK>
0x9E98	0x6908	# <CJK>
0x9E99	0x68D8	# <CJK>
0x9E9A	0x6922	# <CJK>
0x9E9B	0x6926	# <CJK>
0x9E9C	0x68E1	# <CJK>
0x9E9D	0x690C	# <CJK>
0x9E9E	0x68CD	# <CJK>
0x9E9F	0x68D4	# <CJK>
0x9EA0	0x68E7	# <CJK>
0x9EA1	0x68D5	# <CJK>
0x9EA2	0x6936	# <CJK>
0x9EA3	0x6912	# <CJK>
0x9EA4	0x6904	# <CJK>
0x9EA5	0x68D7	# <CJK>
0x9EA6	0x68E3	# <CJK>
0x9EA7	0x6925	# <CJK>
0x9EA8	0x68F9	# <CJK>
0x9EA9	0x68E0	# <CJK>
0x9EAA	0x68EF	# <CJK>
0x9EAB	0x6928	# <CJK>
0x9EAC	0x692A	# <CJK>
0x9EAD	0x691A	# <CJK>
0x9EAE	0x6923	# <CJK>
0x9EAF	0x6921	# <CJK>
0x9EB0	0x68C6	# <CJK>
0x9EB1	0x6979	# <CJK>
0x9EB2	0x6977	# <CJK>
0x9EB3	0x695C	# <CJK>
0x9EB4	0x6978	# <CJK>
0x9EB5	0x696B	# <CJK>
0x9EB6	0x6954	# <CJK>
0x9EB7	0x697E	# <CJK>
0x9EB8	0x696E	# <CJK>
0x9EB9	0x6939	# <CJK>
0x9EBA	0x6974	# <CJK>
0x9EBB	0x693D	# <CJK>
0x9EBC	0x6959	# <CJK>
0x9EBD	0x6930	# <CJK>
0x9EBE	0x6961	# <CJK>
0x9EBF	0x695E	# <CJK>
0x9EC0	0x695D	# <CJK>
0x9EC1	0x6981	# <CJK>
0x9EC2	0x696A	# <CJK>
0x9EC3	0x69B2	# <CJK>
0x9EC4	0x69AE	# <CJK>
0x9EC5	0x69D0	# <CJK>
0x9EC6	0x69BF	# <CJK>
0x9EC7	0x69C1	# <CJK>
0x9EC8	0x69D3	# <CJK>
0x9EC9	0x69BE	# <CJK>
0x9ECA	0x69CE	# <CJK>
0x9ECB	0x5BE8	# <CJK>
0x9ECC	0x69CA	# <CJK>
0x9ECD	0x69DD	# <CJK>
0x9ECE	0x69BB	# <CJK>
0x9ECF	0x69C3	# <CJK>
0x9ED0	0x69A7	# <CJK>
0x9ED1	0x6A2E	# <CJK>
0x9ED2	0x6991	# <CJK>
0x9ED3	0x69A0	# <CJK>
0x9ED4	0x699C	# <CJK>
0x9ED5	0x6995	# <CJK>
0x9ED6	0x69B4	# <CJK>
0x9ED7	0x69DE	# <CJK>
0x9ED8	0x69E8	# <CJK>
0x9ED9	0x6A02	# <CJK>
0x9EDA	0x6A1B	# <CJK>
0x9EDB	0x69FF	# <CJK>
0x9EDC	0x6B0A	# <CJK>
0x9EDD	0x69F9	# <CJK>
0x9EDE	0x69F2	# <CJK>
0x9EDF	0x69E7	# <CJK>
0x9EE0	0x6A05	# <CJK>
0x9EE1	0x69B1	# <CJK>
0x9EE2	0x6A1E	# <CJK>
0x9EE3	0x69ED	# <CJK>
0x9EE4	0x6A14	# <CJK>
0x9EE5	0x69EB	# <CJK>
0x9EE6	0x6A0A	# <CJK>
0x9EE7	0x6A12	# <CJK>
0x9EE8	0x6AC1	# <CJK>
0x9EE9	0x6A23	# <CJK>
0x9EEA	0x6A13	# <CJK>
0x9EEB	0x6A44	# <CJK>
0x9EEC	0x6A0C	# <CJK>
0x9EED	0x6A72	# <CJK>
0x9EEE	0x6A36	# <CJK>
0x9EEF	0x6A78	# <CJK>
0x9EF0	0x6A47	# <CJK>
0x9EF1	0x6A62	# <CJK>
0x9EF2	0x6A59	# <CJK>
0x9EF3	0x6A66	# <CJK>
0x9EF4	0x6A48	# <CJK>
0x9EF5	0x6A38	# <CJK>
0x9EF6	0x6A22	# <CJK>
0x9EF7	0x6A90	# <CJK>
0x9EF8	0x6A8D	# <CJK>
0x9EF9	0x6AA0	# <CJK>
0x9EFA	0x6A84	# <CJK>
0x9EFB	0x6AA2	# <CJK>
0x9EFC	0x6AA3	# <CJK>
0x9F40	0x6A97	# <CJK>
0x9F41	0x8617	# <CJK>
0x9F42	0x6ABB	# <CJK>
0x9F43	0x6AC3	# <CJK>
0x9F44	0x6AC2	# <CJK>
0x9F45	0x6AB8	# <CJK>
0x9F46	0x6AB3	# <CJK>
0x9F47	0x6AAC	# <CJK>
0x9F48	0x6ADE	# <CJK>
0x9F49	0x6AD1	# <CJK>
0x9F4A	0x6ADF	# <CJK>
0x9F4B	0x6AAA	# <CJK>
0x9F4C	0x6ADA	# <CJK>
0x9F4D	0x6AEA	# <CJK>
0x9F4E	0x6AFB	# <CJK>
0x9F4F	0x6B05	# <CJK>
0x9F50	0x8616	# <CJK>
0x9F51	0x6AFA	# <CJK>
0x9F52	0x6B12	# <CJK>
0x9F53	0x6B16	# <CJK>
0x9F54	0x9B31	# <CJK>
0x9F55	0x6B1F	# <CJK>
0x9F56	0x6B38	# <CJK>
0x9F57	0x6B37	# <CJK>
0x9F58	0x76DC	# <CJK>
0x9F59	0x6B39	# <CJK>
0x9F5A	0x98EE	# <CJK>
0x9F5B	0x6B47	# <CJK>
0x9F5C	0x6B43	# <CJK>
0x9F5D	0x6B49	# <CJK>
0x9F5E	0x6B50	# <CJK>
0x9F5F	0x6B59	# <CJK>
0x9F60	0x6B54	# <CJK>
0x9F61	0x6B5B	# <CJK>
0x9F62	0x6B5F	# <CJK>
0x9F63	0x6B61	# <CJK>
0x9F64	0x6B78	# <CJK>
0x9F65	0x6B79	# <CJK>
0x9F66	0x6B7F	# <CJK>
0x9F67	0x6B80	# <CJK>
0x9F68	0x6B84	# <CJK>
0x9F69	0x6B83	# <CJK>
0x9F6A	0x6B8D	# <CJK>
0x9F6B	0x6B98	# <CJK>
0x9F6C	0x6B95	# <CJK>
0x9F6D	0x6B9E	# <CJK>
0x9F6E	0x6BA4	# <CJK>
0x9F6F	0x6BAA	# <CJK>
0x9F70	0x6BAB	# <CJK>
0x9F71	0x6BAF	# <CJK>
0x9F72	0x6BB2	# <CJK>
0x9F73	0x6BB1	# <CJK>
0x9F74	0x6BB3	# <CJK>
0x9F75	0x6BB7	# <CJK>
0x9F76	0x6BBC	# <CJK>
0x9F77	0x6BC6	# <CJK>
0x9F78	0x6BCB	# <CJK>
0x9F79	0x6BD3	# <CJK>
0x9F7A	0x6BDF	# <CJK>
0x9F7B	0x6BEC	# <CJK>
0x9F7C	0x6BEB	# <CJK>
0x9F7D	0x6BF3	# <CJK>
0x9F7E	0x6BEF	# <CJK>
0x9F80	0x9EBE	# <CJK>
0x9F81	0x6C08	# <CJK>
0x9F82	0x6C13	# <CJK>
0x9F83	0x6C14	# <CJK>
0x9F84	0x6C1B	# <CJK>
0x9F85	0x6C24	# <CJK>
0x9F86	0x6C23	# <CJK>
0x9F87	0x6C5E	# <CJK>
0x9F88	0x6C55	# <CJK>
0x9F89	0x6C62	# <CJK>
0x9F8A	0x6C6A	# <CJK>
0x9F8B	0x6C82	# <CJK>
0x9F8C	0x6C8D	# <CJK>
0x9F8D	0x6C9A	# <CJK>
0x9F8E	0x6C81	# <CJK>
0x9F8F	0x6C9B	# <CJK>
0x9F90	0x6C7E	# <CJK>
0x9F91	0x6C68	# <CJK>
0x9F92	0x6C73	# <CJK>
0x9F93	0x6C92	# <CJK>
0x9F94	0x6C90	# <CJK>
0x9F95	0x6CC4	# <CJK>
0x9F96	0x6CF1	# <CJK>
0x9F97	0x6CD3	# <CJK>
0x9F98	0x6CBD	# <CJK>
0x9F99	0x6CD7	# <CJK>
0x9F9A	0x6CC5	# <CJK>
0x9F9B	0x6CDD	# <CJK>
0x9F9C	0x6CAE	# <CJK>
0x9F9D	0x6CB1	# <CJK>
0x9F9E	0x6CBE	# <CJK>
0x9F9F	0x6CBA	# <CJK>
0x9FA0	0x6CDB	# <CJK>
0x9FA1	0x6CEF	# <CJK>
0x9FA2	0x6CD9	# <CJK>
0x9FA3	0x6CEA	# <CJK>
0x9FA4	0x6D1F	# <CJK>
0x9FA5	0x884D	# <CJK>
0x9FA6	0x6D36	# <CJK>
0x9FA7	0x6D2B	# <CJK>
0x9FA8	0x6D3D	# <CJK>
0x9FA9	0x6D38	# <CJK>
0x9FAA	0x6D19	# <CJK>
0x9FAB	0x6D35	# <CJK>
0x9FAC	0x6D33	# <CJK>
0x9FAD	0x6D12	# <CJK>
0x9FAE	0x6D0C	# <CJK>
0x9FAF	0x6D63	# <CJK>
0x9FB0	0x6D93	# <CJK>
0x9FB1	0x6D64	# <CJK>
0x9FB2	0x6D5A	# <CJK>
0x9FB3	0x6D79	# <CJK>
0x9FB4	0x6D59	# <CJK>
0x9FB5	0x6D8E	# <CJK>
0x9FB6	0x6D95	# <CJK>
0x9FB7	0x6FE4	# <CJK>
0x9FB8	0x6D85	# <CJK>
0x9FB9	0x6DF9	# <CJK>
0x9FBA	0x6E15	# <CJK>
0x9FBB	0x6E0A	# <CJK>
0x9FBC	0x6DB5	# <CJK>
0x9FBD	0x6DC7	# <CJK>
0x9FBE	0x6DE6	# <CJK>
0x9FBF	0x6DB8	# <CJK>
0x9FC0	0x6DC6	# <CJK>
0x9FC1	0x6DEC	# <CJK>
0x9FC2	0x6DDE	# <CJK>
0x9FC3	0x6DCC	# <CJK>
0x9FC4	0x6DE8	# <CJK>
0x9FC5	0x6DD2	# <CJK>
0x9FC6	0x6DC5	# <CJK>
0x9FC7	0x6DFA	# <CJK>
0x9FC8	0x6DD9	# <CJK>
0x9FC9	0x6DE4	# <CJK>
0x9FCA	0x6DD5	# <CJK>
0x9FCB	0x6DEA	# <CJK>
0x9FCC	0x6DEE	# <CJK>
0x9FCD	0x6E2D	# <CJK>
0x9FCE	0x6E6E	# <CJK>
0x9FCF	0x6E2E	# <CJK>
0x9FD0	0x6E19	# <CJK>
0x9FD1	0x6E72	# <CJK>
0x9FD2	0x6E5F	# <CJK>
0x9FD3	0x6E3E	# <CJK>
0x9FD4	0x6E23	# <CJK>
0x9FD5	0x6E6B	# <CJK>
0x9FD6	0x6E2B	# <CJK>
0x9FD7	0x6E76	# <CJK>
0x9FD8	0x6E4D	# <CJK>
0x9FD9	0x6E1F	# <CJK>
0x9FDA	0x6E43	# <CJK>
0x9FDB	0x6E3A	# <CJK>
0x9FDC	0x6E4E	# <CJK>
0x9FDD	0x6E24	# <CJK>
0x9FDE	0x6EFF	# <CJK>
0x9FDF	0x6E1D	# <CJK>
0x9FE0	0x6E38	# <CJK>
0x9FE1	0x6E82	# <CJK>
0x9FE2	0x6EAA	# <CJK>
0x9FE3	0x6E98	# <CJK>
0x9FE4	0x6EC9	# <CJK>
0x9FE5	0x6EB7	# <CJK>
0x9FE6	0x6ED3	# <CJK>
0x9FE7	0x6EBD	# <CJK>
0x9FE8	0x6EAF	# <CJK>
0x9FE9	0x6EC4	# <CJK>
0x9FEA	0x6EB2	# <CJK>
0x9FEB	0x6ED4	# <CJK>
0x9FEC	0x6ED5	# <CJK>
0x9FED	0x6E8F	# <CJK>
0x9FEE	0x6EA5	# <CJK>
0x9FEF	0x6EC2	# <CJK>
0x9FF0	0x6E9F	# <CJK>
0x9FF1	0x6F41	# <CJK>
0x9FF2	0x6F11	# <CJK>
0x9FF3	0x704C	# <CJK>
0x9FF4	0x6EEC	# <CJK>
0x9FF5	0x6EF8	# <CJK>
0x9FF6	0x6EFE	# <CJK>
0x9FF7	0x6F3F	# <CJK>
0x9FF8	0x6EF2	# <CJK>
0x9FF9	0x6F31	# <CJK>
0x9FFA	0x6EEF	# <CJK>
0x9FFB	0x6F32	# <CJK>
0x9FFC	0x6ECC	# <CJK>
0xA1	0xFF61	# HALFWIDTH IDEOGRAPHIC FULL STOP
0xA2	0xFF62	# HALFWIDTH LEFT CORNER BRACKET
0xA3	0xFF63	# HALFWIDTH RIGHT CORNER BRACKET
0xA4	0xFF64	# HALFWIDTH IDEOGRAPHIC COMMA
0xA5	0xFF65	# HALFWIDTH KATAKANA MIDDLE DOT
0xA6	0xFF66	# HALFWIDTH KATAKANA LETTER WO
0xA7	0xFF67	# HALFWIDTH KATAKANA LETTER SMALL A
0xA8	0xFF68	# HALFWIDTH KATAKANA LETTER SMALL I
0xA9	0xFF69	# HALFWIDTH KATAKANA LETTER SMALL U
0xAA	0xFF6A	# HALFWIDTH KATAKANA LETTER SMALL E
0xAB	0xFF6B	# HALFWIDTH KATAKANA LETTER SMALL O
0xAC	0xFF6C	# HALFWIDTH KATAKANA LETTER SMALL YA
0xAD	0xFF6D	# HALFWIDTH KATAKANA LETTER SMALL YU
0xAE	0xFF6E	# HALFWIDTH KATAKANA LETTER SMALL YO
0xAF	0xFF6F	# HALFWIDTH KATAKANA LETTER SMALL TU
0xB0	0xFF70	# HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
0xB1	0xFF71	# HALFWIDTH KATAKANA LETTER A
0xB2	0xFF72	# HALFWIDTH KATAKANA LETTER I
0xB3	0xFF73	# HALFWIDTH KATAKANA LETTER U
0xB4	0xFF74	# HALFWIDTH KATAKANA LETTER E
0xB5	0xFF75	# HALFWIDTH KATAKANA LETTER O
0xB6	0xFF76	# HALFWIDTH KATAKANA LETTER KA
0xB7	0xFF77	# HALFWIDTH KATAKANA LETTER KI
0xB8	0xFF78	# HALFWIDTH KATAKANA LETTER KU
0xB9	0xFF79	# HALFWIDTH KATAKANA LETTER KE
0xBA	0xFF7A	# HALFWIDTH KATAKANA LETTER KO
0xBB	0xFF7B	# HALFWIDTH KATAKANA LETTER SA
0xBC	0xFF7C	# HALFWIDTH KATAKANA LETTER SI
0xBD	0xFF7D	# HALFWIDTH KATAKANA LETTER SU
0xBE	0xFF7E	# HALFWIDTH KATAKANA LETTER SE
0xBF	0xFF7F	# HALFWIDTH KATAKANA LETTER SO
0xC0	0xFF80	# HALFWIDTH KATAKANA LETTER TA
0xC1	0xFF81	# HALFWIDTH KATAKANA LETTER TI
0xC2	0xFF82	# HALFWIDTH KATAKANA LETTER TU
0xC3	0xFF83	# HALFWIDTH KATAKANA LETTER TE
0xC4	0xFF84	# HALFWIDTH KATAKANA LETTER TO
0xC5	0xFF85	# HALFWIDTH KATAKANA LETTER NA
0xC6	0xFF86	# HALFWIDTH KATAKANA LETTER NI
0xC7	0xFF87	# HALFWIDTH KATAKANA LETTER NU
0xC8	0xFF88	# HALFWIDTH KATAKANA LETTER NE
0xC9	0xFF89	# HALFWIDTH KATAKANA LETTER NO
0xCA	0xFF8A	# HALFWIDTH KATAKANA LETTER HA
0xCB	0xFF8B	# HALFWIDTH KATAKANA LETTER HI
0xCC	0xFF8C	# HALFWIDTH KATAKANA LETTER HU
0xCD	0xFF8D	# HALFWIDTH KATAKANA LETTER HE
0xCE	0xFF8E	# HALFWIDTH KATAKANA LETTER HO
0xCF	0xFF8F	# HALFWIDTH KATAKANA LETTER MA
0xD0	0xFF90	# HALFWIDTH KATAKANA LETTER MI
0xD1	0xFF91	# HALFWIDTH KATAKANA LETTER MU
0xD2	0xFF92	# HALFWIDTH KATAKANA LETTER ME
0xD3	0xFF93	# HALFWIDTH KATAKANA LETTER MO
0xD4	0xFF94	# HALFWIDTH KATAKANA LETTER YA
0xD5	0xFF95	# HALFWIDTH KATAKANA LETTER YU
0xD6	0xFF96	# HALFWIDTH KATAKANA LETTER YO
0xD7	0xFF97	# HALFWIDTH KATAKANA LETTER RA
0xD8	0xFF98	# HALFWIDTH KATAKANA LETTER RI
0xD9	0xFF99	# HALFWIDTH KATAKANA LETTER RU
0xDA	0xFF9A	# HALFWIDTH KATAKANA LETTER RE
0xDB	0xFF9B	# HALFWIDTH KATAKANA LETTER RO
0xDC	0xFF9C	# HALFWIDTH KATAKANA LETTER WA
0xDD	0xFF9D	# HALFWIDTH KATAKANA LETTER N
0xDE	0xFF9E	# HALFWIDTH KATAKANA VOICED SOUND MARK
0xDF	0xFF9F	# HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
0xE040	0x6F3E	# <CJK>
0xE041	0x6F13	# <CJK>
0xE042	0x6EF7	# <CJK>
0xE043	0x6F86	# <CJK>
0xE044	0x6F7A	# <CJK>
0xE045	0x6F78	# <CJK>
0xE046	0x6F81	# <CJK>
0xE047	0x6F80	# <CJK>
0xE048	0x6F6F	# <CJK>
0xE049	0x6F5B	# <CJK>
0xE04A	0x6FF3	# <CJK>
0xE04B	0x6F6D	# <CJK>
0xE04C	0x6F82	# <CJK>
0xE04D	0x6F7C	# <CJK>
0xE04E	0x6F58	# <CJK>
0xE04F	0x6F8E	# <CJK>
0xE050	0x6F91	# <CJK>
0xE051	0x6FC2	# <CJK>
0xE052	0x6F66	# <CJK>
0xE053	0x6FB3	# <CJK>
0xE054	0x6FA3	# <CJK>
0xE055	0x6FA1	# <CJK>
0xE056	0x6FA4	# <CJK>
0xE057	0x6FB9	# <CJK>
0xE058	0x6FC6	# <CJK>
0xE059	0x6FAA	# <CJK>
0xE05A	0x6FDF	# <CJK>
0xE05B	0x6FD5	# <CJK>
0xE05C	0x6FEC	# <CJK>
0xE05D	0x6FD4	# <CJK>
0xE05E	0x6FD8	# <CJK>
0xE05F	0x6FF1	# <CJK>
0xE060	0x6FEE	# <CJK>
0xE061	0x6FDB	# <CJK>
0xE062	0x7009	# <CJK>
0xE063	0x700B	# <CJK>
0xE064	0x6FFA	# <CJK>
0xE065	0x7011	# <CJK>
0xE066	0x7001	# <CJK>
0xE067	0x700F	# <CJK>
0xE068	0x6FFE	# <CJK>
0xE069	0x701B	# <CJK>
0xE06A	0x701A	# <CJK>
0xE06B	0x6F74	# <CJK>
0xE06C	0x701D	# <CJK>
0xE06D	0x7018	# <CJK>
0xE06E	0x701F	# <CJK>
0xE06F	0x7030	# <CJK>
0xE070	0x703E	# <CJK>
0xE071	0x7032	# <CJK>
0xE072	0x7051	# <CJK>
0xE073	0x7063	# <CJK>
0xE074	0x7099	# <CJK>
0xE075	0x7092	# <CJK>
0xE076	0x70AF	# <CJK>
0xE077	0x70F1	# <CJK>
0xE078	0x70AC	# <CJK>
0xE079	0x70B8	# <CJK>
0xE07A	0x70B3	# <CJK>
0xE07B	0x70AE	# <CJK>
0xE07C	0x70DF	# <CJK>
0xE07D	0x70CB	# <CJK>
0xE07E	0x70DD	# <CJK>
0xE080	0x70D9	# <CJK>
0xE081	0x7109	# <CJK>
0xE082	0x70FD	# <CJK>
0xE083	0x711C	# <CJK>
0xE084	0x7119	# <CJK>
0xE085	0x7165	# <CJK>
0xE086	0x7155	# <CJK>
0xE087	0x7188	# <CJK>
0xE088	0x7166	# <CJK>
0xE089	0x7162	# <CJK>
0xE08A	0x714C	# <CJK>
0xE08B	0x7156	# <CJK>
0xE08C	0x716C	# <CJK>
0xE08D	0x718F	# <CJK>
0xE08E	0x71FB	# <CJK>
0xE08F	0x7184	# <CJK>
0xE090	0x7195	# <CJK>
0xE091	0x71A8	# <CJK>
0xE092	0x71AC	# <CJK>
0xE093	0x71D7	# <CJK>
0xE094	0x71B9	# <CJK>
0xE095	0x71BE	# <CJK>
0xE096	0x71D2	# <CJK>
0xE097	0x71C9	# <CJK>
0xE098	0x71D4	# <CJK>
0xE099	0x71CE	# <CJK>
0xE09A	0x71E0	# <CJK>
0xE09B	0x71EC	# <CJK>
0xE09C	0x71E7	# <CJK>
0xE09D	0x71F5	# <CJK>
0xE09E	0x71FC	# <CJK>
0xE09F	0x71F9	# <CJK>
0xE0A0	0x71FF	# <CJK>
0xE0A1	0x720D	# <CJK>
0xE0A2	0x7210	# <CJK>
0xE0A3	0x721B	# <CJK>
0xE0A4	0x7228	# <CJK>
0xE0A5	0x722D	# <CJK>
0xE0A6	0x722C	# <CJK>
0xE0A7	0x7230	# <CJK>
0xE0A8	0x7232	# <CJK>
0xE0A9	0x723B	# <CJK>
0xE0AA	0x723C	# <CJK>
0xE0AB	0x723F	# <CJK>
0xE0AC	0x7240	# <CJK>
0xE0AD	0x7246	# <CJK>
0xE0AE	0x724B	# <CJK>
0xE0AF	0x7258	# <CJK>
0xE0B0	0x7274	# <CJK>
0xE0B1	0x727E	# <CJK>
0xE0B2	0x7282	# <CJK>
0xE0B3	0x7281	# <CJK>
0xE0B4	0x7287	# <CJK>
0xE0B5	0x7292	# <CJK>
0xE0B6	0x7296	# <CJK>
0xE0B7	0x72A2	# <CJK>
0xE0B8	0x72A7	# <CJK>
0xE0B9	0x72B9	# <CJK>
0xE0BA	0x72B2	# <CJK>
0xE0BB	0x72C3	# <CJK>
0xE0BC	0x72C6	# <CJK>
0xE0BD	0x72C4	# <CJK>
0xE0BE	0x72CE	# <CJK>
0xE0BF	0x72D2	# <CJK>
0xE0C0	0x72E2	# <CJK>
0xE0C1	0x72E0	# <CJK>
0xE0C2	0x72E1	# <CJK>
0xE0C3	0x72F9	# <CJK>
0xE0C4	0x72F7	# <CJK>
0xE0C5	0x500F	# <CJK>
0xE0C6	0x7317	# <CJK>
0xE0C7	0x730A	# <CJK>
0xE0C8	0x731C	# <CJK>
0xE0C9	0x7316	# <CJK>
0xE0CA	0x731D	# <CJK>
0xE0CB	0x7334	# <CJK>
0xE0CC	0x732F	# <CJK>
0xE0CD	0x7329	# <CJK>
0xE0CE	0x7325	# <CJK>
0xE0CF	0x733E	# <CJK>
0xE0D0	0x734E	# <CJK>
0xE0D1	0x734F	# <CJK>
0xE0D2	0x9ED8	# <CJK>
0xE0D3	0x7357	# <CJK>
0xE0D4	0x736A	# <CJK>
0xE0D5	0x7368	# <CJK>
0xE0D6	0x7370	# <CJK>
0xE0D7	0x7378	# <CJK>
0xE0D8	0x7375	# <CJK>
0xE0D9	0x737B	# <CJK>
0xE0DA	0x737A	# <CJK>
0xE0DB	0x73C8	# <CJK>
0xE0DC	0x73B3	# <CJK>
0xE0DD	0x73CE	# <CJK>
0xE0DE	0x73BB	# <CJK>
0xE0DF	0x73C0	# <CJK>
0xE0E0	0x73E5	# <CJK>
0xE0E1	0x73EE	# <CJK>
0xE0E2	0x73DE	# <CJK>
0xE0E3	0x74A2	# <CJK>
0xE0E4	0x7405	# <CJK>
0xE0E5	0x746F	# <CJK>
0xE0E6	0x7425	# <CJK>
0xE0E7	0x73F8	# <CJK>
0xE0E8	0x7432	# <CJK>
0xE0E9	0x743A	# <CJK>
0xE0EA	0x7455	# <CJK>
0xE0EB	0x743F	# <CJK>
0xE0EC	0x745F	# <CJK>
0xE0ED	0x7459	# <CJK>
0xE0EE	0x7441	# <CJK>
0xE0EF	0x745C	# <CJK>
0xE0F0	0x7469	# <CJK>
0xE0F1	0x7470	# <CJK>
0xE0F2	0x7463	# <CJK>
0xE0F3	0x746A	# <CJK>
0xE0F4	0x7476	# <CJK>
0xE0F5	0x747E	# <CJK>
0xE0F6	0x748B	# <CJK>
0xE0F7	0x749E	# <CJK>
0xE0F8	0x74A7	# <CJK>
0xE0F9	0x74CA	# <CJK>
0xE0FA	0x74CF	# <CJK>
0xE0FB	0x74D4	# <CJK>
0xE0FC	0x73F1	# <CJK>
0xE140	0x74E0	# <CJK>
0xE141	0x74E3	# <CJK>
0xE142	0x74E7	# <CJK>
0xE143	0x74E9	# <CJK>
0xE144	0x74EE	# <CJK>
0xE145	0x74F2	# <CJK>
0xE146	0x74F0	# <CJK>
0xE147	0x74F1	# <CJK>
0xE148	0x74F8	# <CJK>
0xE149	0x74F7	# <CJK>
0xE14A	0x7504	# <CJK>
0xE14B	0x7503	# <CJK>
0xE14C	0x7505	# <CJK>
0xE14D	0x750C	# <CJK>
0xE14E	0x750E	# <CJK>
0xE14F	0x750D	# <CJK>
0xE150	0x7515	# <CJK>
0xE151	0x7513	# <CJK>
0xE152	0x751E	# <CJK>
0xE153	0x7526	# <CJK>
0xE154	0x752C	# <CJK>
0xE155	0x753C	# <CJK>
0xE156	0x7544	# <CJK>
0xE157	0x754D	# <CJK>
0xE158	0x754A	# <CJK>
0xE159	0x7549	# <CJK>
0xE15A	0x755B	# <CJK>
0xE15B	0x7546	# <CJK>
0xE15C	0x755A	# <CJK>
0xE15D	0x7569	# <CJK>
0xE15E	0x7564	# <CJK>
0xE15F	0x7567	# <CJK>
0xE160	0x756B	# <CJK>
0xE161	0x756D	# <CJK>
0xE162	0x7578	# <CJK>
0xE163	0x7576	# <CJK>
0xE164	0x7586	# <CJK>
0xE165	0x7587	# <CJK>
0xE166	0x7574	# <CJK>
0xE167	0x758A	# <CJK>
0xE168	0x7589	# <CJK>
0xE169	0x7582	# <CJK>
0xE16A	0x7594	# <CJK>
0xE16B	0x759A	# <CJK>
0xE16C	0x759D	# <CJK>
0xE16D	0x75A5	# <CJK>
0xE16E	0x75A3	# <CJK>
0xE16F	0x75C2	# <CJK>
0xE170	0x75B3	# <CJK>
0xE171	0x75C3	# <CJK>
0xE172	0x75B5	# <CJK>
0xE173	0x75BD	# <CJK>
0xE174	0x75B8	# <CJK>
0xE175	0x75BC	# <CJK>
0xE176	0x75B1	# <CJK>
0xE177	0x75CD	# <CJK>
0xE178	0x75CA	# <CJK>
0xE179	0x75D2	# <CJK>
0xE17A	0x75D9	# <CJK>
0xE17B	0x75E3	# <CJK>
0xE17C	0x75DE	# <CJK>
0xE17D	0x75FE	# <CJK>
0xE17E	0x75FF	# <CJK>
0xE180	0x75FC	# <CJK>
0xE181	0x7601	# <CJK>
0xE182	0x75F0	# <CJK>
0xE183	0x75FA	# <CJK>
0xE184	0x75F2	# <CJK>
0xE185	0x75F3	# <CJK>
0xE186	0x760B	# <CJK>
0xE187	0x760D	# <CJK>
0xE188	0x7609	# <CJK>
0xE189	0x761F	# <CJK>
0xE18A	0x7627	# <CJK>
0xE18B	0x7620	# <CJK>
0xE18C	0x7621	# <CJK>
0xE18D	0x7622	# <CJK>
0xE18E	0x7624	# <CJK>
0xE18F	0x7634	# <CJK>
0xE190	0x7630	# <CJK>
0xE191	0x763B	# <CJK>
0xE192	0x7647	# <CJK>
0xE193	0x7648	# <CJK>
0xE194	0x7646	# <CJK>
0xE195	0x765C	# <CJK>
0xE196	0x7658	# <CJK>
0xE197	0x7661	# <CJK>
0xE198	0x7662	# <CJK>
0xE199	0x7668	# <CJK>
0xE19A	0x7669	# <CJK>
0xE19B	0x766A	# <CJK>
0xE19C	0x7667	# <CJK>
0xE19D	0x766C	# <CJK>
0xE19E	0x7670	# <CJK>
0xE19F	0x7672	# <CJK>
0xE1A0	0x7676	# <CJK>
0xE1A1	0x7678	# <CJK>
0xE1A2	0x767C	# <CJK>
0xE1A3	0x7680	# <CJK>
0xE1A4	0x7683	# <CJK>
0xE1A5	0x7688	# <CJK>
0xE1A6	0x768B	# <CJK>
0xE1A7	0x768E	# <CJK>
0xE1A8	0x7696	# <CJK>
0xE1A9	0x7693	# <CJK>
0xE1AA	0x7699	# <CJK>
0xE1AB	0x769A	# <CJK>
0xE1AC	0x76B0	# <CJK>
0xE1AD	0x76B4	# <CJK>
0xE1AE	0x76B8	# <CJK>
0xE1AF	0x76B9	# <CJK>
0xE1B0	0x76BA	# <CJK>
0xE1B1	0x76C2	# <CJK>
0xE1B2	0x76CD	# <CJK>
0xE1B3	0x76D6	# <CJK>
0xE1B4	0x76D2	# <CJK>
0xE1B5	0x76DE	# <CJK>
0xE1B6	0x76E1	# <CJK>
0xE1B7	0x76E5	# <CJK>
0xE1B8	0x76E7	# <CJK>
0xE1B9	0x76EA	# <CJK>
0xE1BA	0x862F	# <CJK>
0xE1BB	0x76FB	# <CJK>
0xE1BC	0x7708	# <CJK>
0xE1BD	0x7707	# <CJK>
0xE1BE	0x7704	# <CJK>
0xE1BF	0x7729	# <CJK>
0xE1C0	0x7724	# <CJK>
0xE1C1	0x771E	# <CJK>
0xE1C2	0x7725	# <CJK>
0xE1C3	0x7726	# <CJK>
0xE1C4	0x771B	# <CJK>
0xE1C5	0x7737	# <CJK>
0xE1C6	0x7738	# <CJK>
0xE1C7	0x7747	# <CJK>
0xE1C8	0x775A	# <CJK>
0xE1C9	0x7768	# <CJK>
0xE1CA	0x776B	# <CJK>
0xE1CB	0x775B	# <CJK>
0xE1CC	0x7765	# <CJK>
0xE1CD	0x777F	# <CJK>
0xE1CE	0x777E	# <CJK>
0xE1CF	0x7779	# <CJK>
0xE1D0	0x778E	# <CJK>
0xE1D1	0x778B	# <CJK>
0xE1D2	0x7791	# <CJK>
0xE1D3	0x77A0	# <CJK>
0xE1D4	0x779E	# <CJK>
0xE1D5	0x77B0	# <CJK>
0xE1D6	0x77B6	# <CJK>
0xE1D7	0x77B9	# <CJK>
0xE1D8	0x77BF	# <CJK>
0xE1D9	0x77BC	# <CJK>
0xE1DA	0x77BD	# <CJK>
0xE1DB	0x77BB	# <CJK>
0xE1DC	0x77C7	# <CJK>
0xE1DD	0x77CD	# <CJK>
0xE1DE	0x77D7	# <CJK>
0xE1DF	0x77DA	# <CJK>
0xE1E0	0x77DC	# <CJK>
0xE1E1	0x77E3	# <CJK>
0xE1E2	0x77EE	# <CJK>
0xE1E3	0x77FC	# <CJK>
0xE1E4	0x780C	# <CJK>
0xE1E5	0x7812	# <CJK>
0xE1E6	0x7926	# <CJK>
0xE1E7	0x7820	# <CJK>
0xE1E8	0x792A	# <CJK>
0xE1E9	0x7845	# <CJK>
0xE1EA	0x788E	# <CJK>
0xE1EB	0x7874	# <CJK>
0xE1EC	0x7886	# <CJK>
0xE1ED	0x787C	# <CJK>
0xE1EE	0x789A	# <CJK>
0xE1EF	0x788C	# <CJK>
0xE1F0	0x78A3	# <CJK>
0xE1F1	0x78B5	# <CJK>
0xE1F2	0x78AA	# <CJK>
0xE1F3	0x78AF	# <CJK>
0xE1F4	0x78D1	# <CJK>
0xE1F5	0x78C6	# <CJK>
0xE1F6	0x78CB	# <CJK>
0xE1F7	0x78D4	# <CJK>
0xE1F8	0x78BE	# <CJK>
0xE1F9	0x78BC	# <CJK>
0xE1FA	0x78C5	# <CJK>
0xE1FB	0x78CA	# <CJK>
0xE1FC	0x78EC	# <CJK>
0xE240	0x78E7	# <CJK>
0xE241	0x78DA	# <CJK>
0xE242	0x78FD	# <CJK>
0xE243	0x78F4	# <CJK>
0xE244	0x7907	# <CJK>
0xE245	0x7912	# <CJK>
0xE246	0x7911	# <CJK>
0xE247	0x7919	# <CJK>
0xE248	0x792C	# <CJK>
0xE249	0x792B	# <CJK>
0xE24A	0x7940	# <CJK>
0xE24B	0x7960	# <CJK>
0xE24C	0x7957	# <CJK>
0xE24D	0x795F	# <CJK>
0xE24E	0x795A	# <CJK>
0xE24F	0x7955	# <CJK>
0xE250	0x7953	# <CJK>
0xE251	0x797A	# <CJK>
0xE252	0x797F	# <CJK>
0xE253	0x798A	# <CJK>
0xE254	0x799D	# <CJK>
0xE255	0x79A7	# <CJK>
0xE256	0x9F4B	# <CJK>
0xE257	0x79AA	# <CJK>
0xE258	0x79AE	# <CJK>
0xE259	0x79B3	# <CJK>
0xE25A	0x79B9	# <CJK>
0xE25B	0x79BA	# <CJK>
0xE25C	0x79C9	# <CJK>
0xE25D	0x79D5	# <CJK>
0xE25E	0x79E7	# <CJK>
0xE25F	0x79EC	# <CJK>
0xE260	0x79E1	# <CJK>
0xE261	0x79E3	# <CJK>
0xE262	0x7A08	# <CJK>
0xE263	0x7A0D	# <CJK>
0xE264	0x7A18	# <CJK>
0xE265	0x7A19	# <CJK>
0xE266	0x7A20	# <CJK>
0xE267	0x7A1F	# <CJK>
0xE268	0x7980	# <CJK>
0xE269	0x7A31	# <CJK>
0xE26A	0x7A3B	# <CJK>
0xE26B	0x7A3E	# <CJK>
0xE26C	0x7A37	# <CJK>
0xE26D	0x7A43	# <CJK>
0xE26E	0x7A57	# <CJK>
0xE26F	0x7A49	# <CJK>
0xE270	0x7A61	# <CJK>
0xE271	0x7A62	# <CJK>
0xE272	0x7A69	# <CJK>
0xE273	0x9F9D	# <CJK>
0xE274	0x7A70	# <CJK>
0xE275	0x7A79	# <CJK>
0xE276	0x7A7D	# <CJK>
0xE277	0x7A88	# <CJK>
0xE278	0x7A97	# <CJK>
0xE279	0x7A95	# <CJK>
0xE27A	0x7A98	# <CJK>
0xE27B	0x7A96	# <CJK>
0xE27C	0x7AA9	# <CJK>
0xE27D	0x7AC8	# <CJK>
0xE27E	0x7AB0	# <CJK>
0xE280	0x7AB6	# <CJK>
0xE281	0x7AC5	# <CJK>
0xE282	0x7AC4	# <CJK>
0xE283	0x7ABF	# <CJK>
0xE284	0x9083	# <CJK>
0xE285	0x7AC7	# <CJK>
0xE286	0x7ACA	# <CJK>
0xE287	0x7ACD	# <CJK>
0xE288	0x7ACF	# <CJK>
0xE289	0x7AD5	# <CJK>
0xE28A	0x7AD3	# <CJK>
0xE28B	0x7AD9	# <CJK>
0xE28C	0x7ADA	# <CJK>
0xE28D	0x7ADD	# <CJK>
0xE28E	0x7AE1	# <CJK>
0xE28F	0x7AE2	# <CJK>
0xE290	0x7AE6	# <CJK>
0xE291	0x7AED	# <CJK>
0xE292	0x7AF0	# <CJK>
0xE293	0x7B02	# <CJK>
0xE294	0x7B0F	# <CJK>
0xE295	0x7B0A	# <CJK>
0xE296	0x7B06	# <CJK>
0xE297	0x7B33	# <CJK>
0xE298	0x7B18	# <CJK>
0xE299	0x7B19	# <CJK>
0xE29A	0x7B1E	# <CJK>
0xE29B	0x7B35	# <CJK>
0xE29C	0x7B28	# <CJK>
0xE29D	0x7B36	# <CJK>
0xE29E	0x7B50	# <CJK>
0xE29F	0x7B7A	# <CJK>
0xE2A0	0x7B04	# <CJK>
0xE2A1	0x7B4D	# <CJK>
0xE2A2	0x7B0B	# <CJK>
0xE2A3	0x7B4C	# <CJK>
0xE2A4	0x7B45	# <CJK>
0xE2A5	0x7B75	# <CJK>
0xE2A6	0x7B65	# <CJK>
0xE2A7	0x7B74	# <CJK>
0xE2A8	0x7B67	# <CJK>
0xE2A9	0x7B70	# <CJK>
0xE2AA	0x7B71	# <CJK>
0xE2AB	0x7B6C	# <CJK>
0xE2AC	0x7B6E	# <CJK>
0xE2AD	0x7B9D	# <CJK>
0xE2AE	0x7B98	# <CJK>
0xE2AF	0x7B9F	# <CJK>
0xE2B0	0x7B8D	# <CJK>
0xE2B1	0x7B9C	# <CJK>
0xE2B2	0x7B9A	# <CJK>
0xE2B3	0x7B8B	# <CJK>
0xE2B4	0x7B92	# <CJK>
0xE2B5	0x7B8F	# <CJK>
0xE2B6	0x7B5D	# <CJK>
0xE2B7	0x7B99	# <CJK>
0xE2B8	0x7BCB	# <CJK>
0xE2B9	0x7BC1	# <CJK>
0xE2BA	0x7BCC	# <CJK>
0xE2BB	0x7BCF	# <CJK>
0xE2BC	0x7BB4	# <CJK>
0xE2BD	0x7BC6	# <CJK>
0xE2BE	0x7BDD	# <CJK>
0xE2BF	0x7BE9	# <CJK>
0xE2C0	0x7C11	# <CJK>
0xE2C1	0x7C14	# <CJK>
0xE2C2	0x7BE6	# <CJK>
0xE2C3	0x7BE5	# <CJK>
0xE2C4	0x7C60	# <CJK>
0xE2C5	0x7C00	# <CJK>
0xE2C6	0x7C07	# <CJK>
0xE2C7	0x7C13	# <CJK>
0xE2C8	0x7BF3	# <CJK>
0xE2C9	0x7BF7	# <CJK>
0xE2CA	0x7C17	# <CJK>
0xE2CB	0x7C0D	# <CJK>
0xE2CC	0x7BF6	# <CJK>
0xE2CD	0x7C23	# <CJK>
0xE2CE	0x7C27	# <CJK>
0xE2CF	0x7C2A	# <CJK>
0xE2D0	0x7C1F	# <CJK>
0xE2D1	0x7C37	# <CJK>
0xE2D2	0x7C2B	# <CJK>
0xE2D3	0x7C3D	# <CJK>
0xE2D4	0x7C4C	# <CJK>
0xE2D5	0x7C43	# <CJK>
0xE2D6	0x7C54	# <CJK>
0xE2D7	0x7C4F	# <CJK>
0xE2D8	0x7C40	# <CJK>
0xE2D9	0x7C50	# <CJK>
0xE2DA	0x7C58	# <CJK>
0xE2DB	0x7C5F	# <CJK>
0xE2DC	0x7C64	# <CJK>
0xE2DD	0x7C56	# <CJK>
0xE2DE	0x7C65	# <CJK>
0xE2DF	0x7C6C	# <CJK>
0xE2E0	0x7C75	# <CJK>
0xE2E1	0x7C83	# <CJK>
0xE2E2	0x7C90	# <CJK>
0xE2E3	0x7CA4	# <CJK>
0xE2E4	0x7CAD	# <CJK>
0xE2E5	0x7CA2	# <CJK>
0xE2E6	0x7CAB	# <CJK>
0xE2E7	0x7CA1	# <CJK>
0xE2E8	0x7CA8	# <CJK>
0xE2E9	0x7CB3	# <CJK>
0xE2EA	0x7CB2	# <CJK>
0xE2EB	0x7CB1	# <CJK>
0xE2EC	0x7CAE	# <CJK>
0xE2ED	0x7CB9	# <CJK>
0xE2EE	0x7CBD	# <CJK>
0xE2EF	0x7CC0	# <CJK>
0xE2F0	0x7CC5	# <CJK>
0xE2F1	0x7CC2	# <CJK>
0xE2F2	0x7CD8	# <CJK>
0xE2F3	0x7CD2	# <CJK>
0xE2F4	0x7CDC	# <CJK>
0xE2F5	0x7CE2	# <CJK>
0xE2F6	0x9B3B	# <CJK>
0xE2F7	0x7CEF	# <CJK>
0xE2F8	0x7CF2	# <CJK>
0xE2F9	0x7CF4	# <CJK>
0xE2FA	0x7CF6	# <CJK>
0xE2FB	0x7CFA	# <CJK>
0xE2FC	0x7D06	# <CJK>
0xE340	0x7D02	# <CJK>
0xE341	0x7D1C	# <CJK>
0xE342	0x7D15	# <CJK>
0xE343	0x7D0A	# <CJK>
0xE344	0x7D45	# <CJK>
0xE345	0x7D4B	# <CJK>
0xE346	0x7D2E	# <CJK>
0xE347	0x7D32	# <CJK>
0xE348	0x7D3F	# <CJK>
0xE349	0x7D35	# <CJK>
0xE34A	0x7D46	# <CJK>
0xE34B	0x7D73	# <CJK>
0xE34C	0x7D56	# <CJK>
0xE34D	0x7D4E	# <CJK>
0xE34E	0x7D72	# <CJK>
0xE34F	0x7D68	# <CJK>
0xE350	0x7D6E	# <CJK>
0xE351	0x7D4F	# <CJK>
0xE352	0x7D63	# <CJK>
0xE353	0x7D93	# <CJK>
0xE354	0x7D89	# <CJK>
0xE355	0x7D5B	# <CJK>
0xE356	0x7D8F	# <CJK>
0xE357	0x7D7D	# <CJK>
0xE358	0x7D9B	# <CJK>
0xE359	0x7DBA	# <CJK>
0xE35A	0x7DAE	# <CJK>
0xE35B	0x7DA3	# <CJK>
0xE35C	0x7DB5	# <CJK>
0xE35D	0x7DC7	# <CJK>
0xE35E	0x7DBD	# <CJK>
0xE35F	0x7DAB	# <CJK>
0xE360	0x7E3D	# <CJK>
0xE361	0x7DA2	# <CJK>
0xE362	0x7DAF	# <CJK>
0xE363	0x7DDC	# <CJK>
0xE364	0x7DB8	# <CJK>
0xE365	0x7D9F	# <CJK>
0xE366	0x7DB0	# <CJK>
0xE367	0x7DD8	# <CJK>
0xE368	0x7DDD	# <CJK>
0xE369	0x7DE4	# <CJK>
0xE36A	0x7DDE	# <CJK>
0xE36B	0x7DFB	# <CJK>
0xE36C	0x7DF2	# <CJK>
0xE36D	0x7DE1	# <CJK>
0xE36E	0x7E05	# <CJK>
0xE36F	0x7E0A	# <CJK>
0xE370	0x7E23	# <CJK>
0xE371	0x7E21	# <CJK>
0xE372	0x7E12	# <CJK>
0xE373	0x7E31	# <CJK>
0xE374	0x7E1F	# <CJK>
0xE375	0x7E09	# <CJK>
0xE376	0x7E0B	# <CJK>
0xE377	0x7E22	# <CJK>
0xE378	0x7E46	# <CJK>
0xE379	0x7E66	# <CJK>
0xE37A	0x7E3B	# <CJK>
0xE37B	0x7E35	# <CJK>
0xE37C	0x7E39	# <CJK>
0xE37D	0x7E43	# <CJK>
0xE37E	0x7E37	# <CJK>
0xE380	0x7E32	# <CJK>
0xE381	0x7E3A	# <CJK>
0xE382	0x7E67	# <CJK>
0xE383	0x7E5D	# <CJK>
0xE384	0x7E56	# <CJK>
0xE385	0x7E5E	# <CJK>
0xE386	0x7E59	# <CJK>
0xE387	0x7E5A	# <CJK>
0xE388	0x7E79	# <CJK>
0xE389	0x7E6A	# <CJK>
0xE38A	0x7E69	# <CJK>
0xE38B	0x7E7C	# <CJK>
0xE38C	0x7E7B	# <CJK>
0xE38D	0x7E83	# <CJK>
0xE38E	0x7DD5	# <CJK>
0xE38F	0x7E7D	# <CJK>
0xE390	0x8FAE	# <CJK>
0xE391	0x7E7F	# <CJK>
0xE392	0x7E88	# <CJK>
0xE393	0x7E89	# <CJK>
0xE394	0x7E8C	# <CJK>
0xE395	0x7E92	# <CJK>
0xE396	0x7E90	# <CJK>
0xE397	0x7E93	# <CJK>
0xE398	0x7E94	# <CJK>
0xE399	0x7E96	# <CJK>
0xE39A	0x7E8E	# <CJK>
0xE39B	0x7E9B	# <CJK>
0xE39C	0x7E9C	# <CJK>
0xE39D	0x7F38	# <CJK>
0xE39E	0x7F3A	# <CJK>
0xE39F	0x7F45	# <CJK>
0xE3A0	0x7F4C	# <CJK>
0xE3A1	0x7F4D	# <CJK>
0xE3A2	0x7F4E	# <CJK>
0xE3A3	0x7F50	# <CJK>
0xE3A4	0x7F51	# <CJK>
0xE3A5	0x7F55	# <CJK>
0xE3A6	0x7F54	# <CJK>
0xE3A7	0x7F58	# <CJK>
0xE3A8	0x7F5F	# <CJK>
0xE3A9	0x7F60	# <CJK>
0xE3AA	0x7F68	# <CJK>
0xE3AB	0x7F69	# <CJK>
0xE3AC	0x7F67	# <CJK>
0xE3AD	0x7F78	# <CJK>
0xE3AE	0x7F82	# <CJK>
0xE3AF	0x7F86	# <CJK>
0xE3B0	0x7F83	# <CJK>
0xE3B1	0x7F88	# <CJK>
0xE3B2	0x7F87	# <CJK>
0xE3B3	0x7F8C	# <CJK>
0xE3B4	0x7F94	# <CJK>
0xE3B5	0x7F9E	# <CJK>
0xE3B6	0x7F9D	# <CJK>
0xE3B7	0x7F9A	# <CJK>
0xE3B8	0x7FA3	# <CJK>
0xE3B9	0x7FAF	# <CJK>
0xE3BA	0x7FB2	# <CJK>
0xE3BB	0x7FB9	# <CJK>
0xE3BC	0x7FAE	# <CJK>
0xE3BD	0x7FB6	# <CJK>
0xE3BE	0x7FB8	# <CJK>
0xE3BF	0x8B71	# <CJK>
0xE3C0	0x7FC5	# <CJK>
0xE3C1	0x7FC6	# <CJK>
0xE3C2	0x7FCA	# <CJK>
0xE3C3	0x7FD5	# <CJK>
0xE3C4	0x7FD4	# <CJK>
0xE3C5	0x7FE1	# <CJK>
0xE3C6	0x7FE6	# <CJK>
0xE3C7	0x7FE9	# <CJK>
0xE3C8	0x7FF3	# <CJK>
0xE3C9	0x7FF9	# <CJK>
0xE3CA	0x98DC	# <CJK>
0xE3CB	0x8006	# <CJK>
0xE3CC	0x8004	# <CJK>
0xE3CD	0x800B	# <CJK>
0xE3CE	0x8012	# <CJK>
0xE3CF	0x8018	# <CJK>
0xE3D0	0x8019	# <CJK>
0xE3D1	0x801C	# <CJK>
0xE3D2	0x8021	# <CJK>
0xE3D3	0x8028	# <CJK>
0xE3D4	0x803F	# <CJK>
0xE3D5	0x803B	# <CJK>
0xE3D6	0x804A	# <CJK>
0xE3D7	0x8046	# <CJK>
0xE3D8	0x8052	# <CJK>
0xE3D9	0x8058	# <CJK>
0xE3DA	0x805A	# <CJK>
0xE3DB	0x805F	# <CJK>
0xE3DC	0x8062	# <CJK>
0xE3DD	0x8068	# <CJK>
0xE3DE	0x8073	# <CJK>
0xE3DF	0x8072	# <CJK>
0xE3E0	0x8070	# <CJK>
0xE3E1	0x8076	# <CJK>
0xE3E2	0x8079	# <CJK>
0xE3E3	0x807D	# <CJK>
0xE3E4	0x807F	# <CJK>
0xE3E5	0x8084	# <CJK>
0xE3E6	0x8086	# <CJK>
0xE3E7	0x8085	# <CJK>
0xE3E8	0x809B	# <CJK>
0xE3E9	0x8093	# <CJK>
0xE3EA	0x809A	# <CJK>
0xE3EB	0x80AD	# <CJK>
0xE3EC	0x5190	# <CJK>
0xE3ED	0x80AC	# <CJK>
0xE3EE	0x80DB	# <CJK>
0xE3EF	0x80E5	# <CJK>
0xE3F0	0x80D9	# <CJK>
0xE3F1	0x80DD	# <CJK>
0xE3F2	0x80C4	# <CJK>
0xE3F3	0x80DA	# <CJK>
0xE3F4	0x80D6	# <CJK>
0xE3F5	0x8109	# <CJK>
0xE3F6	0x80EF	# <CJK>
0xE3F7	0x80F1	# <CJK>
0xE3F8	0x811B	# <CJK>
0xE3F9	0x8129	# <CJK>
0xE3FA	0x8123	# <CJK>
0xE3FB	0x812F	# <CJK>
0xE3FC	0x814B	# <CJK>
0xE440	0x968B	# <CJK>
0xE441	0x8146	# <CJK>
0xE442	0x813E	# <CJK>
0xE443	0x8153	# <CJK>
0xE444	0x8151	# <CJK>
0xE445	0x80FC	# <CJK>
0xE446	0x8171	# <CJK>
0xE447	0x816E	# <CJK>
0xE448	0x8165	# <CJK>
0xE449	0x8166	# <CJK>
0xE44A	0x8174	# <CJK>
0xE44B	0x8183	# <CJK>
0xE44C	0x8188	# <CJK>
0xE44D	0x818A	# <CJK>
0xE44E	0x8180	# <CJK>
0xE44F	0x8182	# <CJK>
0xE450	0x81A0	# <CJK>
0xE451	0x8195	# <CJK>
0xE452	0x81A4	# <CJK>
0xE453	0x81A3	# <CJK>
0xE454	0x815F	# <CJK>
0xE455	0x8193	# <CJK>
0xE456	0x81A9	# <CJK>
0xE457	0x81B0	# <CJK>
0xE458	0x81B5	# <CJK>
0xE459	0x81BE	# <CJK>
0xE45A	0x81B8	# <CJK>
0xE45B	0x81BD	# <CJK>
0xE45C	0x81C0	# <CJK>
0xE45D	0x81C2	# <CJK>
0xE45E	0x81BA	# <CJK>
0xE45F	0x81C9	# <CJK>
0xE460	0x81CD	# <CJK>
0xE461	0x81D1	# <CJK>
0xE462	0x81D9	# <CJK>
0xE463	0x81D8	# <CJK>
0xE464	0x81C8	# <CJK>
0xE465	0x81DA	# <CJK>
0xE466	0x81DF	# <CJK>
0xE467	0x81E0	# <CJK>
0xE468	0x81E7	# <CJK>
0xE469	0x81FA	# <CJK>
0xE46A	0x81FB	# <CJK>
0xE46B	0x81FE	# <CJK>
0xE46C	0x8201	# <CJK>
0xE46D	0x8202	# <CJK>
0xE46E	0x8205	# <CJK>
0xE46F	0x8207	# <CJK>
0xE470	0x820A	# <CJK>
0xE471	0x820D	# <CJK>
0xE472	0x8210	# <CJK>
0xE473	0x8216	# <CJK>
0xE474	0x8229	# <CJK>
0xE475	0x822B	# <CJK>
0xE476	0x8238	# <CJK>
0xE477	0x8233	# <CJK>
0xE478	0x8240	# <CJK>
0xE479	0x8259	# <CJK>
0xE47A	0x8258	# <CJK>
0xE47B	0x825D	# <CJK>
0xE47C	0x825A	# <CJK>
0xE47D	0x825F	# <CJK>
0xE47E	0x8264	# <CJK>
0xE480	0x8262	# <CJK>
0xE481	0x8268	# <CJK>
0xE482	0x826A	# <CJK>
0xE483	0x826B	# <CJK>
0xE484	0x822E	# <CJK>
0xE485	0x8271	# <CJK>
0xE486	0x8277	# <CJK>
0xE487	0x8278	# <CJK>
0xE488	0x827E	# <CJK>
0xE489	0x828D	# <CJK>
0xE48A	0x8292	# <CJK>
0xE48B	0x82AB	# <CJK>
0xE48C	0x829F	# <CJK>
0xE48D	0x82BB	# <CJK>
0xE48E	0x82AC	# <CJK>
0xE48F	0x82E1	# <CJK>
0xE490	0x82E3	# <CJK>
0xE491	0x82DF	# <CJK>
0xE492	0x82D2	# <CJK>
0xE493	0x82F4	# <CJK>
0xE494	0x82F3	# <CJK>
0xE495	0x82FA	# <CJK>
0xE496	0x8393	# <CJK>
0xE497	0x8303	# <CJK>
0xE498	0x82FB	# <CJK>
0xE499	0x82F9	# <CJK>
0xE49A	0x82DE	# <CJK>
0xE49B	0x8306	# <CJK>
0xE49C	0x82DC	# <CJK>
0xE49D	0x8309	# <CJK>
0xE49E	0x82D9	# <CJK>
0xE49F	0x8335	# <CJK>
0xE4A0	0x8334	# <CJK>
0xE4A1	0x8316	# <CJK>
0xE4A2	0x8332	# <CJK>
0xE4A3	0x8331	# <CJK>
0xE4A4	0x8340	# <CJK>
0xE4A5	0x8339	# <CJK>
0xE4A6	0x8350	# <CJK>
0xE4A7	0x8345	# <CJK>
0xE4A8	0x832F	# <CJK>
0xE4A9	0x832B	# <CJK>
0xE4AA	0x8317	# <CJK>
0xE4AB	0x8318	# <CJK>
0xE4AC	0x8385	# <CJK>
0xE4AD	0x839A	# <CJK>
0xE4AE	0x83AA	# <CJK>
0xE4AF	0x839F	# <CJK>
0xE4B0	0x83A2	# <CJK>
0xE4B1	0x8396	# <CJK>
0xE4B2	0x8323	# <CJK>
0xE4B3	0x838E	# <CJK>
0xE4B4	0x8387	# <CJK>
0xE4B5	0x838A	# <CJK>
0xE4B6	0x837C	# <CJK>
0xE4B7	0x83B5	# <CJK>
0xE4B8	0x8373	# <CJK>
0xE4B9	0x8375	# <CJK>
0xE4BA	0x83A0	# <CJK>
0xE4BB	0x8389	# <CJK>
0xE4BC	0x83A8	# <CJK>
0xE4BD	0x83F4	# <CJK>
0xE4BE	0x8413	# <CJK>
0xE4BF	0x83EB	# <CJK>
0xE4C0	0x83CE	# <CJK>
0xE4C1	0x83FD	# <CJK>
0xE4C2	0x8403	# <CJK>
0xE4C3	0x83D8	# <CJK>
0xE4C4	0x840B	# <CJK>
0xE4C5	0x83C1	# <CJK>
0xE4C6	0x83F7	# <CJK>
0xE4C7	0x8407	# <CJK>
0xE4C8	0x83E0	# <CJK>
0xE4C9	0x83F2	# <CJK>
0xE4CA	0x840D	# <CJK>
0xE4CB	0x8422	# <CJK>
0xE4CC	0x8420	# <CJK>
0xE4CD	0x83BD	# <CJK>
0xE4CE	0x8438	# <CJK>
0xE4CF	0x8506	# <CJK>
0xE4D0	0x83FB	# <CJK>
0xE4D1	0x846D	# <CJK>
0xE4D2	0x842A	# <CJK>
0xE4D3	0x843C	# <CJK>
0xE4D4	0x855A	# <CJK>
0xE4D5	0x8484	# <CJK>
0xE4D6	0x8477	# <CJK>
0xE4D7	0x846B	# <CJK>
0xE4D8	0x84AD	# <CJK>
0xE4D9	0x846E	# <CJK>
0xE4DA	0x8482	# <CJK>
0xE4DB	0x8469	# <CJK>
0xE4DC	0x8446	# <CJK>
0xE4DD	0x842C	# <CJK>
0xE4DE	0x846F	# <CJK>
0xE4DF	0x8479	# <CJK>
0xE4E0	0x8435	# <CJK>
0xE4E1	0x84CA	# <CJK>
0xE4E2	0x8462	# <CJK>
0xE4E3	0x84B9	# <CJK>
0xE4E4	0x84BF	# <CJK>
0xE4E5	0x849F	# <CJK>
0xE4E6	0x84D9	# <CJK>
0xE4E7	0x84CD	# <CJK>
0xE4E8	0x84BB	# <CJK>
0xE4E9	0x84DA	# <CJK>
0xE4EA	0x84D0	# <CJK>
0xE4EB	0x84C1	# <CJK>
0xE4EC	0x84C6	# <CJK>
0xE4ED	0x84D6	# <CJK>
0xE4EE	0x84A1	# <CJK>
0xE4EF	0x8521	# <CJK>
0xE4F0	0x84FF	# <CJK>
0xE4F1	0x84F4	# <CJK>
0xE4F2	0x8517	# <CJK>
0xE4F3	0x8518	# <CJK>
0xE4F4	0x852C	# <CJK>
0xE4F5	0x851F	# <CJK>
0xE4F6	0x8515	# <CJK>
0xE4F7	0x8514	# <CJK>
0xE4F8	0x84FC	# <CJK>
0xE4F9	0x8540	# <CJK>
0xE4FA	0x8563	# <CJK>
0xE4FB	0x8558	# <CJK>
0xE4FC	0x8548	# <CJK>
0xE540	0x8541	# <CJK>
0xE541	0x8602	# <CJK>
0xE542	0x854B	# <CJK>
0xE543	0x8555	# <CJK>
0xE544	0x8580	# <CJK>
0xE545	0x85A4	# <CJK>
0xE546	0x8588	# <CJK>
0xE547	0x8591	# <CJK>
0xE548	0x858A	# <CJK>
0xE549	0x85A8	# <CJK>
0xE54A	0x856D	# <CJK>
0xE54B	0x8594	# <CJK>
0xE54C	0x859B	# <CJK>
0xE54D	0x85EA	# <CJK>
0xE54E	0x8587	# <CJK>
0xE54F	0x859C	# <CJK>
0xE550	0x8577	# <CJK>
0xE551	0x857E	# <CJK>
0xE552	0x8590	# <CJK>
0xE553	0x85C9	# <CJK>
0xE554	0x85BA	# <CJK>
0xE555	0x85CF	# <CJK>
0xE556	0x85B9	# <CJK>
0xE557	0x85D0	# <CJK>
0xE558	0x85D5	# <CJK>
0xE559	0x85DD	# <CJK>
0xE55A	0x85E5	# <CJK>
0xE55B	0x85DC	# <CJK>
0xE55C	0x85F9	# <CJK>
0xE55D	0x860A	# <CJK>
0xE55E	0x8613	# <CJK>
0xE55F	0x860B	# <CJK>
0xE560	0x85FE	# <CJK>
0xE561	0x85FA	# <CJK>
0xE562	0x8606	# <CJK>
0xE563	0x8622	# <CJK>
0xE564	0x861A	# <CJK>
0xE565	0x8630	# <CJK>
0xE566	0x863F	# <CJK>
0xE567	0x864D	# <CJK>
0xE568	0x4E55	# <CJK>
0xE569	0x8654	# <CJK>
0xE56A	0x865F	# <CJK>
0xE56B	0x8667	# <CJK>
0xE56C	0x8671	# <CJK>
0xE56D	0x8693	# <CJK>
0xE56E	0x86A3	# <CJK>
0xE56F	0x86A9	# <CJK>
0xE570	0x86AA	# <CJK>
0xE571	0x868B	# <CJK>
0xE572	0x868C	# <CJK>
0xE573	0x86B6	# <CJK>
0xE574	0x86AF	# <CJK>
0xE575	0x86C4	# <CJK>
0xE576	0x86C6	# <CJK>
0xE577	0x86B0	# <CJK>
0xE578	0x86C9	# <CJK>
0xE579	0x8823	# <CJK>
0xE57A	0x86AB	# <CJK>
0xE57B	0x86D4	# <CJK>
0xE57C	0x86DE	# <CJK>
0xE57D	0x86E9	# <CJK>
0xE57E	0x86EC	# <CJK>
0xE580	0x86DF	# <CJK>
0xE581	0x86DB	# <CJK>
0xE582	0x86EF	# <CJK>
0xE583	0x8712	# <CJK>
0xE584	0x8706	# <CJK>
0xE585	0x8708	# <CJK>
0xE586	0x8700	# <CJK>
0xE587	0x8703	# <CJK>
0xE588	0x86FB	# <CJK>
0xE589	0x8711	# <CJK>
0xE58A	0x8709	# <CJK>
0xE58B	0x870D	# <CJK>
0xE58C	0x86F9	# <CJK>
0xE58D	0x870A	# <CJK>
0xE58E	0x8734	# <CJK>
0xE58F	0x873F	# <CJK>
0xE590	0x8737	# <CJK>
0xE591	0x873B	# <CJK>
0xE592	0x8725	# <CJK>
0xE593	0x8729	# <CJK>
0xE594	0x871A	# <CJK>
0xE595	0x8760	# <CJK>
0xE596	0x875F	# <CJK>
0xE597	0x8778	# <CJK>
0xE598	0x874C	# <CJK>
0xE599	0x874E	# <CJK>
0xE59A	0x8774	# <CJK>
0xE59B	0x8757	# <CJK>
0xE59C	0x8768	# <CJK>
0xE59D	0x876E	# <CJK>
0xE59E	0x8759	# <CJK>
0xE59F	0x8753	# <CJK>
0xE5A0	0x8763	# <CJK>
0xE5A1	0x876A	# <CJK>
0xE5A2	0x8805	# <CJK>
0xE5A3	0x87A2	# <CJK>
0xE5A4	0x879F	# <CJK>
0xE5A5	0x8782	# <CJK>
0xE5A6	0x87AF	# <CJK>
0xE5A7	0x87CB	# <CJK>
0xE5A8	0x87BD	# <CJK>
0xE5A9	0x87C0	# <CJK>
0xE5AA	0x87D0	# <CJK>
0xE5AB	0x96D6	# <CJK>
0xE5AC	0x87AB	# <CJK>
0xE5AD	0x87C4	# <CJK>
0xE5AE	0x87B3	# <CJK>
0xE5AF	0x87C7	# <CJK>
0xE5B0	0x87C6	# <CJK>
0xE5B1	0x87BB	# <CJK>
0xE5B2	0x87EF	# <CJK>
0xE5B3	0x87F2	# <CJK>
0xE5B4	0x87E0	# <CJK>
0xE5B5	0x880F	# <CJK>
0xE5B6	0x880D	# <CJK>
0xE5B7	0x87FE	# <CJK>
0xE5B8	0x87F6	# <CJK>
0xE5B9	0x87F7	# <CJK>
0xE5BA	0x880E	# <CJK>
0xE5BB	0x87D2	# <CJK>
0xE5BC	0x8811	# <CJK>
0xE5BD	0x8816	# <CJK>
0xE5BE	0x8815	# <CJK>
0xE5BF	0x8822	# <CJK>
0xE5C0	0x8821	# <CJK>
0xE5C1	0x8831	# <CJK>
0xE5C2	0x8836	# <CJK>
0xE5C3	0x8839	# <CJK>
0xE5C4	0x8827	# <CJK>
0xE5C5	0x883B	# <CJK>
0xE5C6	0x8844	# <CJK>
0xE5C7	0x8842	# <CJK>
0xE5C8	0x8852	# <CJK>
0xE5C9	0x8859	# <CJK>
0xE5CA	0x885E	# <CJK>
0xE5CB	0x8862	# <CJK>
0xE5CC	0x886B	# <CJK>
0xE5CD	0x8881	# <CJK>
0xE5CE	0x887E	# <CJK>
0xE5CF	0x889E	# <CJK>
0xE5D0	0x8875	# <CJK>
0xE5D1	0x887D	# <CJK>
0xE5D2	0x88B5	# <CJK>
0xE5D3	0x8872	# <CJK>
0xE5D4	0x8882	# <CJK>
0xE5D5	0x8897	# <CJK>
0xE5D6	0x8892	# <CJK>
0xE5D7	0x88AE	# <CJK>
0xE5D8	0x8899	# <CJK>
0xE5D9	0x88A2	# <CJK>
0xE5DA	0x888D	# <CJK>
0xE5DB	0x88A4	# <CJK>
0xE5DC	0x88B0	# <CJK>
0xE5DD	0x88BF	# <CJK>
0xE5DE	0x88B1	# <CJK>
0xE5DF	0x88C3	# <CJK>
0xE5E0	0x88C4	# <CJK>
0xE5E1	0x88D4	# <CJK>
0xE5E2	0x88D8	# <CJK>
0xE5E3	0x88D9	# <CJK>
0xE5E4	0x88DD	# <CJK>
0xE5E5	0x88F9	# <CJK>
0xE5E6	0x8902	# <CJK>
0xE5E7	0x88FC	# <CJK>
0xE5E8	0x88F4	# <CJK>
0xE5E9	0x88E8	# <CJK>
0xE5EA	0x88F2	# <CJK>
0xE5EB	0x8904	# <CJK>
0xE5EC	0x890C	# <CJK>
0xE5ED	0x890A	# <CJK>
0xE5EE	0x8913	# <CJK>
0xE5EF	0x8943	# <CJK>
0xE5F0	0x891E	# <CJK>
0xE5F1	0x8925	# <CJK>
0xE5F2	0x892A	# <CJK>
0xE5F3	0x892B	# <CJK>
0xE5F4	0x8941	# <CJK>
0xE5F5	0x8944	# <CJK>
0xE5F6	0x893B	# <CJK>
0xE5F7	0x8936	# <CJK>
0xE5F8	0x8938	# <CJK>
0xE5F9	0x894C	# <CJK>
0xE5FA	0x891D	# <CJK>
0xE5FB	0x8960	# <CJK>
0xE5FC	0x895E	# <CJK>
0xE640	0x8966	# <CJK>
0xE641	0x8964	# <CJK>
0xE642	0x896D	# <CJK>
0xE643	0x896A	# <CJK>
0xE644	0x896F	# <CJK>
0xE645	0x8974	# <CJK>
0xE646	0x8977	# <CJK>
0xE647	0x897E	# <CJK>
0xE648	0x8983	# <CJK>
0xE649	0x8988	# <CJK>
0xE64A	0x898A	# <CJK>
0xE64B	0x8993	# <CJK>
0xE64C	0x8998	# <CJK>
0xE64D	0x89A1	# <CJK>
0xE64E	0x89A9	# <CJK>
0xE64F	0x89A6	# <CJK>
0xE650	0x89AC	# <CJK>
0xE651	0x89AF	# <CJK>
0xE652	0x89B2	# <CJK>
0xE653	0x89BA	# <CJK>
0xE654	0x89BD	# <CJK>
0xE655	0x89BF	# <CJK>
0xE656	0x89C0	# <CJK>
0xE657	0x89DA	# <CJK>
0xE658	0x89DC	# <CJK>
0xE659	0x89DD	# <CJK>
0xE65A	0x89E7	# <CJK>
0xE65B	0x89F4	# <CJK>
0xE65C	0x89F8	# <CJK>
0xE65D	0x8A03	# <CJK>
0xE65E	0x8A16	# <CJK>
0xE65F	0x8A10	# <CJK>
0xE660	0x8A0C	# <CJK>
0xE661	0x8A1B	# <CJK>
0xE662	0x8A1D	# <CJK>
0xE663	0x8A25	# <CJK>
0xE664	0x8A36	# <CJK>
0xE665	0x8A41	# <CJK>
0xE666	0x8A5B	# <CJK>
0xE667	0x8A52	# <CJK>
0xE668	0x8A46	# <CJK>
0xE669	0x8A48	# <CJK>
0xE66A	0x8A7C	# <CJK>
0xE66B	0x8A6D	# <CJK>
0xE66C	0x8A6C	# <CJK>
0xE66D	0x8A62	# <CJK>
0xE66E	0x8A85	# <CJK>
0xE66F	0x8A82	# <CJK>
0xE670	0x8A84	# <CJK>
0xE671	0x8AA8	# <CJK>
0xE672	0x8AA1	# <CJK>
0xE673	0x8A91	# <CJK>
0xE674	0x8AA5	# <CJK>
0xE675	0x8AA6	# <CJK>
0xE676	0x8A9A	# <CJK>
0xE677	0x8AA3	# <CJK>
0xE678	0x8AC4	# <CJK>
0xE679	0x8ACD	# <CJK>
0xE67A	0x8AC2	# <CJK>
0xE67B	0x8ADA	# <CJK>
0xE67C	0x8AEB	# <CJK>
0xE67D	0x8AF3	# <CJK>
0xE67E	0x8AE7	# <CJK>
0xE680	0x8AE4	# <CJK>
0xE681	0x8AF1	# <CJK>
0xE682	0x8B14	# <CJK>
0xE683	0x8AE0	# <CJK>
0xE684	0x8AE2	# <CJK>
0xE685	0x8AF7	# <CJK>
0xE686	0x8ADE	# <CJK>
0xE687	0x8ADB	# <CJK>
0xE688	0x8B0C	# <CJK>
0xE689	0x8B07	# <CJK>
0xE68A	0x8B1A	# <CJK>
0xE68B	0x8AE1	# <CJK>
0xE68C	0x8B16	# <CJK>
0xE68D	0x8B10	# <CJK>
0xE68E	0x8B17	# <CJK>
0xE68F	0x8B20	# <CJK>
0xE690	0x8B33	# <CJK>
0xE691	0x97AB	# <CJK>
0xE692	0x8B26	# <CJK>
0xE693	0x8B2B	# <CJK>
0xE694	0x8B3E	# <CJK>
0xE695	0x8B28	# <CJK>
0xE696	0x8B41	# <CJK>
0xE697	0x8B4C	# <CJK>
0xE698	0x8B4F	# <CJK>
0xE699	0x8B4E	# <CJK>
0xE69A	0x8B49	# <CJK>
0xE69B	0x8B56	# <CJK>
0xE69C	0x8B5B	# <CJK>
0xE69D	0x8B5A	# <CJK>
0xE69E	0x8B6B	# <CJK>
0xE69F	0x8B5F	# <CJK>
0xE6A0	0x8B6C	# <CJK>
0xE6A1	0x8B6F	# <CJK>
0xE6A2	0x8B74	# <CJK>
0xE6A3	0x8B7D	# <CJK>
0xE6A4	0x8B80	# <CJK>
0xE6A5	0x8B8C	# <CJK>
0xE6A6	0x8B8E	# <CJK>
0xE6A7	0x8B92	# <CJK>
0xE6A8	0x8B93	# <CJK>
0xE6A9	0x8B96	# <CJK>
0xE6AA	0x8B99	# <CJK>
0xE6AB	0x8B9A	# <CJK>
0xE6AC	0x8C3A	# <CJK>
0xE6AD	0x8C41	# <CJK>
0xE6AE	0x8C3F	# <CJK>
0xE6AF	0x8C48	# <CJK>
0xE6B0	0x8C4C	# <CJK>
0xE6B1	0x8C4E	# <CJK>
0xE6B2	0x8C50	# <CJK>
0xE6B3	0x8C55	# <CJK>
0xE6B4	0x8C62	# <CJK>
0xE6B5	0x8C6C	# <CJK>
0xE6B6	0x8C78	# <CJK>
0xE6B7	0x8C7A	# <CJK>
0xE6B8	0x8C82	# <CJK>
0xE6B9	0x8C89	# <CJK>
0xE6BA	0x8C85	# <CJK>
0xE6BB	0x8C8A	# <CJK>
0xE6BC	0x8C8D	# <CJK>
0xE6BD	0x8C8E	# <CJK>
0xE6BE	0x8C94	# <CJK>
0xE6BF	0x8C7C	# <CJK>
0xE6C0	0x8C98	# <CJK>
0xE6C1	0x621D	# <CJK>
0xE6C2	0x8CAD	# <CJK>
0xE6C3	0x8CAA	# <CJK>
0xE6C4	0x8CBD	# <CJK>
0xE6C5	0x8CB2	# <CJK>
0xE6C6	0x8CB3	# <CJK>
0xE6C7	0x8CAE	# <CJK>
0xE6C8	0x8CB6	# <CJK>
0xE6C9	0x8CC8	# <CJK>
0xE6CA	0x8CC1	# <CJK>
0xE6CB	0x8CE4	# <CJK>
0xE6CC	0x8CE3	# <CJK>
0xE6CD	0x8CDA	# <CJK>
0xE6CE	0x8CFD	# <CJK>
0xE6CF	0x8CFA	# <CJK>
0xE6D0	0x8CFB	# <CJK>
0xE6D1	0x8D04	# <CJK>
0xE6D2	0x8D05	# <CJK>
0xE6D3	0x8D0A	# <CJK>
0xE6D4	0x8D07	# <CJK>
0xE6D5	0x8D0F	# <CJK>
0xE6D6	0x8D0D	# <CJK>
0xE6D7	0x8D10	# <CJK>
0xE6D8	0x9F4E	# <CJK>
0xE6D9	0x8D13	# <CJK>
0xE6DA	0x8CCD	# <CJK>
0xE6DB	0x8D14	# <CJK>
0xE6DC	0x8D16	# <CJK>
0xE6DD	0x8D67	# <CJK>
0xE6DE	0x8D6D	# <CJK>
0xE6DF	0x8D71	# <CJK>
0xE6E0	0x8D73	# <CJK>
0xE6E1	0x8D81	# <CJK>
0xE6E2	0x8D99	# <CJK>
0xE6E3	0x8DC2	# <CJK>
0xE6E4	0x8DBE	# <CJK>
0xE6E5	0x8DBA	# <CJK>
0xE6E6	0x8DCF	# <CJK>
0xE6E7	0x8DDA	# <CJK>
0xE6E8	0x8DD6	# <CJK>
0xE6E9	0x8DCC	# <CJK>
0xE6EA	0x8DDB	# <CJK>
0xE6EB	0x8DCB	# <CJK>
0xE6EC	0x8DEA	# <CJK>
0xE6ED	0x8DEB	# <CJK>
0xE6EE	0x8DDF	# <CJK>
0xE6EF	0x8DE3	# <CJK>
0xE6F0	0x8DFC	# <CJK>
0xE6F1	0x8E08	# <CJK>
0xE6F2	0x8E09	# <CJK>
0xE6F3	0x8DFF	# <CJK>
0xE6F4	0x8E1D	# <CJK>
0xE6F5	0x8E1E	# <CJK>
0xE6F6	0x8E10	# <CJK>
0xE6F7	0x8E1F	# <CJK>
0xE6F8	0x8E42	# <CJK>
0xE6F9	0x8E35	# <CJK>
0xE6FA	0x8E30	# <CJK>
0xE6FB	0x8E34	# <CJK>
0xE6FC	0x8E4A	# <CJK>
0xE740	0x8E47	# <CJK>
0xE741	0x8E49	# <CJK>
0xE742	0x8E4C	# <CJK>
0xE743	0x8E50	# <CJK>
0xE744	0x8E48	# <CJK>
0xE745	0x8E59	# <CJK>
0xE746	0x8E64	# <CJK>
0xE747	0x8E60	# <CJK>
0xE748	0x8E2A	# <CJK>
0xE749	0x8E63	# <CJK>
0xE74A	0x8E55	# <CJK>
0xE74B	0x8E76	# <CJK>
0xE74C	0x8E72	# <CJK>
0xE74D	0x8E7C	# <CJK>
0xE74E	0x8E81	# <CJK>
0xE74F	0x8E87	# <CJK>
0xE750	0x8E85	# <CJK>
0xE751	0x8E84	# <CJK>
0xE752	0x8E8B	# <CJK>
0xE753	0x8E8A	# <CJK>
0xE754	0x8E93	# <CJK>
0xE755	0x8E91	# <CJK>
0xE756	0x8E94	# <CJK>
0xE757	0x8E99	# <CJK>
0xE758	0x8EAA	# <CJK>
0xE759	0x8EA1	# <CJK>
0xE75A	0x8EAC	# <CJK>
0xE75B	0x8EB0	# <CJK>
0xE75C	0x8EC6	# <CJK>
0xE75D	0x8EB1	# <CJK>
0xE75E	0x8EBE	# <CJK>
0xE75F	0x8EC5	# <CJK>
0xE760	0x8EC8	# <CJK>
0xE761	0x8ECB	# <CJK>
0xE762	0x8EDB	# <CJK>
0xE763	0x8EE3	# <CJK>
0xE764	0x8EFC	# <CJK>
0xE765	0x8EFB	# <CJK>
0xE766	0x8EEB	# <CJK>
0xE767	0x8EFE	# <CJK>
0xE768	0x8F0A	# <CJK>
0xE769	0x8F05	# <CJK>
0xE76A	0x8F15	# <CJK>
0xE76B	0x8F12	# <CJK>
0xE76C	0x8F19	# <CJK>
0xE76D	0x8F13	# <CJK>
0xE76E	0x8F1C	# <CJK>
0xE76F	0x8F1F	# <CJK>
0xE770	0x8F1B	# <CJK>
0xE771	0x8F0C	# <CJK>
0xE772	0x8F26	# <CJK>
0xE773	0x8F33	# <CJK>
0xE774	0x8F3B	# <CJK>
0xE775	0x8F39	# <CJK>
0xE776	0x8F45	# <CJK>
0xE777	0x8F42	# <CJK>
0xE778	0x8F3E	# <CJK>
0xE779	0x8F4C	# <CJK>
0xE77A	0x8F49	# <CJK>
0xE77B	0x8F46	# <CJK>
0xE77C	0x8F4E	# <CJK>
0xE77D	0x8F57	# <CJK>
0xE77E	0x8F5C	# <CJK>
0xE780	0x8F62	# <CJK>
0xE781	0x8F63	# <CJK>
0xE782	0x8F64	# <CJK>
0xE783	0x8F9C	# <CJK>
0xE784	0x8F9F	# <CJK>
0xE785	0x8FA3	# <CJK>
0xE786	0x8FAD	# <CJK>
0xE787	0x8FAF	# <CJK>
0xE788	0x8FB7	# <CJK>
0xE789	0x8FDA	# <CJK>
0xE78A	0x8FE5	# <CJK>
0xE78B	0x8FE2	# <CJK>
0xE78C	0x8FEA	# <CJK>
0xE78D	0x8FEF	# <CJK>
0xE78E	0x9087	# <CJK>
0xE78F	0x8FF4	# <CJK>
0xE790	0x9005	# <CJK>
0xE791	0x8FF9	# <CJK>
0xE792	0x8FFA	# <CJK>
0xE793	0x9011	# <CJK>
0xE794	0x9015	# <CJK>
0xE795	0x9021	# <CJK>
0xE796	0x900D	# <CJK>
0xE797	0x901E	# <CJK>
0xE798	0x9016	# <CJK>
0xE799	0x900B	# <CJK>
0xE79A	0x9027	# <CJK>
0xE79B	0x9036	# <CJK>
0xE79C	0x9035	# <CJK>
0xE79D	0x9039	# <CJK>
0xE79E	0x8FF8	# <CJK>
0xE79F	0x904F	# <CJK>
0xE7A0	0x9050	# <CJK>
0xE7A1	0x9051	# <CJK>
0xE7A2	0x9052	# <CJK>
0xE7A3	0x900E	# <CJK>
0xE7A4	0x9049	# <CJK>
0xE7A5	0x903E	# <CJK>
0xE7A6	0x9056	# <CJK>
0xE7A7	0x9058	# <CJK>
0xE7A8	0x905E	# <CJK>
0xE7A9	0x9068	# <CJK>
0xE7AA	0x906F	# <CJK>
0xE7AB	0x9076	# <CJK>
0xE7AC	0x96A8	# <CJK>
0xE7AD	0x9072	# <CJK>
0xE7AE	0x9082	# <CJK>
0xE7AF	0x907D	# <CJK>
0xE7B0	0x9081	# <CJK>
0xE7B1	0x9080	# <CJK>
0xE7B2	0x908A	# <CJK>
0xE7B3	0x9089	# <CJK>
0xE7B4	0x908F	# <CJK>
0xE7B5	0x90A8	# <CJK>
0xE7B6	0x90AF	# <CJK>
0xE7B7	0x90B1	# <CJK>
0xE7B8	0x90B5	# <CJK>
0xE7B9	0x90E2	# <CJK>
0xE7BA	0x90E4	# <CJK>
0xE7BB	0x6248	# <CJK>
0xE7BC	0x90DB	# <CJK>
0xE7BD	0x9102	# <CJK>
0xE7BE	0x9112	# <CJK>
0xE7BF	0x9119	# <CJK>
0xE7C0	0x9132	# <CJK>
0xE7C1	0x9130	# <CJK>
0xE7C2	0x914A	# <CJK>
0xE7C3	0x9156	# <CJK>
0xE7C4	0x9158	# <CJK>
0xE7C5	0x9163	# <CJK>
0xE7C6	0x9165	# <CJK>
0xE7C7	0x9169	# <CJK>
0xE7C8	0x9173	# <CJK>
0xE7C9	0x9172	# <CJK>
0xE7CA	0x918B	# <CJK>
0xE7CB	0x9189	# <CJK>
0xE7CC	0x9182	# <CJK>
0xE7CD	0x91A2	# <CJK>
0xE7CE	0x91AB	# <CJK>
0xE7CF	0x91AF	# <CJK>
0xE7D0	0x91AA	# <CJK>
0xE7D1	0x91B5	# <CJK>
0xE7D2	0x91B4	# <CJK>
0xE7D3	0x91BA	# <CJK>
0xE7D4	0x91C0	# <CJK>
0xE7D5	0x91C1	# <CJK>
0xE7D6	0x91C9	# <CJK>
0xE7D7	0x91CB	# <CJK>
0xE7D8	0x91D0	# <CJK>
0xE7D9	0x91D6	# <CJK>
0xE7DA	0x91DF	# <CJK>
0xE7DB	0x91E1	# <CJK>
0xE7DC	0x91DB	# <CJK>
0xE7DD	0x91FC	# <CJK>
0xE7DE	0x91F5	# <CJK>
0xE7DF	0x91F6	# <CJK>
0xE7E0	0x921E	# <CJK>
0xE7E1	0x91FF	# <CJK>
0xE7E2	0x9214	# <CJK>
0xE7E3	0x922C	# <CJK>
0xE7E4	0x9215	# <CJK>
0xE7E5	0x9211	# <CJK>
0xE7E6	0x925E	# <CJK>
0xE7E7	0x9257	# <CJK>
0xE7E8	0x9245	# <CJK>
0xE7E9	0x9249	# <CJK>
0xE7EA	0x9264	# <CJK>
0xE7EB	0x9248	# <CJK>
0xE7EC	0x9295	# <CJK>
0xE7ED	0x923F	# <CJK>
0xE7EE	0x924B	# <CJK>
0xE7EF	0x9250	# <CJK>
0xE7F0	0x929C	# <CJK>
0xE7F1	0x9296	# <CJK>
0xE7F2	0x9293	# <CJK>
0xE7F3	0x929B	# <CJK>
0xE7F4	0x925A	# <CJK>
0xE7F5	0x92CF	# <CJK>
0xE7F6	0x92B9	# <CJK>
0xE7F7	0x92B7	# <CJK>
0xE7F8	0x92E9	# <CJK>
0xE7F9	0x930F	# <CJK>
0xE7FA	0x92FA	# <CJK>
0xE7FB	0x9344	# <CJK>
0xE7FC	0x932E	# <CJK>
0xE840	0x9319	# <CJK>
0xE841	0x9322	# <CJK>
0xE842	0x931A	# <CJK>
0xE843	0x9323	# <CJK>
0xE844	0x933A	# <CJK>
0xE845	0x9335	# <CJK>
0xE846	0x933B	# <CJK>
0xE847	0x935C	# <CJK>
0xE848	0x9360	# <CJK>
0xE849	0x937C	# <CJK>
0xE84A	0x936E	# <CJK>
0xE84B	0x9356	# <CJK>
0xE84C	0x93B0	# <CJK>
0xE84D	0x93AC	# <CJK>
0xE84E	0x93AD	# <CJK>
0xE84F	0x9394	# <CJK>
0xE850	0x93B9	# <CJK>
0xE851	0x93D6	# <CJK>
0xE852	0x93D7	# <CJK>
0xE853	0x93E8	# <CJK>
0xE854	0x93E5	# <CJK>
0xE855	0x93D8	# <CJK>
0xE856	0x93C3	# <CJK>
0xE857	0x93DD	# <CJK>
0xE858	0x93D0	# <CJK>
0xE859	0x93C8	# <CJK>
0xE85A	0x93E4	# <CJK>
0xE85B	0x941A	# <CJK>
0xE85C	0x9414	# <CJK>
0xE85D	0x9413	# <CJK>
0xE85E	0x9403	# <CJK>
0xE85F	0x9407	# <CJK>
0xE860	0x9410	# <CJK>
0xE861	0x9436	# <CJK>
0xE862	0x942B	# <CJK>
0xE863	0x9435	# <CJK>
0xE864	0x9421	# <CJK>
0xE865	0x943A	# <CJK>
0xE866	0x9441	# <CJK>
0xE867	0x9452	# <CJK>
0xE868	0x9444	# <CJK>
0xE869	0x945B	# <CJK>
0xE86A	0x9460	# <CJK>
0xE86B	0x9462	# <CJK>
0xE86C	0x945E	# <CJK>
0xE86D	0x946A	# <CJK>
0xE86E	0x9229	# <CJK>
0xE86F	0x9470	# <CJK>
0xE870	0x9475	# <CJK>
0xE871	0x9477	# <CJK>
0xE872	0x947D	# <CJK>
0xE873	0x945A	# <CJK>
0xE874	0x947C	# <CJK>
0xE875	0x947E	# <CJK>
0xE876	0x9481	# <CJK>
0xE877	0x947F	# <CJK>
0xE878	0x9582	# <CJK>
0xE879	0x9587	# <CJK>
0xE87A	0x958A	# <CJK>
0xE87B	0x9594	# <CJK>
0xE87C	0x9596	# <CJK>
0xE87D	0x9598	# <CJK>
0xE87E	0x9599	# <CJK>
0xE880	0x95A0	# <CJK>
0xE881	0x95A8	# <CJK>
0xE882	0x95A7	# <CJK>
0xE883	0x95AD	# <CJK>
0xE884	0x95BC	# <CJK>
0xE885	0x95BB	# <CJK>
0xE886	0x95B9	# <CJK>
0xE887	0x95BE	# <CJK>
0xE888	0x95CA	# <CJK>
0xE889	0x6FF6	# <CJK>
0xE88A	0x95C3	# <CJK>
0xE88B	0x95CD	# <CJK>
0xE88C	0x95CC	# <CJK>
0xE88D	0x95D5	# <CJK>
0xE88E	0x95D4	# <CJK>
0xE88F	0x95D6	# <CJK>
0xE890	0x95DC	# <CJK>
0xE891	0x95E1	# <CJK>
0xE892	0x95E5	# <CJK>
0xE893	0x95E2	# <CJK>
0xE894	0x9621	# <CJK>
0xE895	0x9628	# <CJK>
0xE896	0x962E	# <CJK>
0xE897	0x962F	# <CJK>
0xE898	0x9642	# <CJK>
0xE899	0x964C	# <CJK>
0xE89A	0x964F	# <CJK>
0xE89B	0x964B	# <CJK>
0xE89C	0x9677	# <CJK>
0xE89D	0x965C	# <CJK>
0xE89E	0x965E	# <CJK>
0xE89F	0x965D	# <CJK>
0xE8A0	0x965F	# <CJK>
0xE8A1	0x9666	# <CJK>
0xE8A2	0x9672	# <CJK>
0xE8A3	0x966C	# <CJK>
0xE8A4	0x968D	# <CJK>
0xE8A5	0x9698	# <CJK>
0xE8A6	0x9695	# <CJK>
0xE8A7	0x9697	# <CJK>
0xE8A8	0x96AA	# <CJK>
0xE8A9	0x96A7	# <CJK>
0xE8AA	0x96B1	# <CJK>
0xE8AB	0x96B2	# <CJK>
0xE8AC	0x96B0	# <CJK>
0xE8AD	0x96B4	# <CJK>
0xE8AE	0x96B6	# <CJK>
0xE8AF	0x96B8	# <CJK>
0xE8B0	0x96B9	# <CJK>
0xE8B1	0x96CE	# <CJK>
0xE8B2	0x96CB	# <CJK>
0xE8B3	0x96C9	# <CJK>
0xE8B4	0x96CD	# <CJK>
0xE8B5	0x894D	# <CJK>
0xE8B6	0x96DC	# <CJK>
0xE8B7	0x970D	# <CJK>
0xE8B8	0x96D5	# <CJK>
0xE8B9	0x96F9	# <CJK>
0xE8BA	0x9704	# <CJK>
0xE8BB	0x9706	# <CJK>
0xE8BC	0x9708	# <CJK>
0xE8BD	0x9713	# <CJK>
0xE8BE	0x970E	# <CJK>
0xE8BF	0x9711	# <CJK>
0xE8C0	0x970F	# <CJK>
0xE8C1	0x9716	# <CJK>
0xE8C2	0x9719	# <CJK>
0xE8C3	0x9724	# <CJK>
0xE8C4	0x972A	# <CJK>
0xE8C5	0x9730	# <CJK>
0xE8C6	0x9739	# <CJK>
0xE8C7	0x973D	# <CJK>
0xE8C8	0x973E	# <CJK>
0xE8C9	0x9744	# <CJK>
0xE8CA	0x9746	# <CJK>
0xE8CB	0x9748	# <CJK>
0xE8CC	0x9742	# <CJK>
0xE8CD	0x9749	# <CJK>
0xE8CE	0x975C	# <CJK>
0xE8CF	0x9760	# <CJK>
0xE8D0	0x9764	# <CJK>
0xE8D1	0x9766	# <CJK>
0xE8D2	0x9768	# <CJK>
0xE8D3	0x52D2	# <CJK>
0xE8D4	0x976B	# <CJK>
0xE8D5	0x9771	# <CJK>
0xE8D6	0x9779	# <CJK>
0xE8D7	0x9785	# <CJK>
0xE8D8	0x977C	# <CJK>
0xE8D9	0x9781	# <CJK>
0xE8DA	0x977A	# <CJK>
0xE8DB	0x9786	# <CJK>
0xE8DC	0x978B	# <CJK>
0xE8DD	0x978F	# <CJK>
0xE8DE	0x9790	# <CJK>
0xE8DF	0x979C	# <CJK>
0xE8E0	0x97A8	# <CJK>
0xE8E1	0x97A6	# <CJK>
0xE8E2	0x97A3	# <CJK>
0xE8E3	0x97B3	# <CJK>
0xE8E4	0x97B4	# <CJK>
0xE8E5	0x97C3	# <CJK>
0xE8E6	0x97C6	# <CJK>
0xE8E7	0x97C8	# <CJK>
0xE8E8	0x97CB	# <CJK>
0xE8E9	0x97DC	# <CJK>
0xE8EA	0x97ED	# <CJK>
0xE8EB	0x9F4F	# <CJK>
0xE8EC	0x97F2	# <CJK>
0xE8ED	0x7ADF	# <CJK>
0xE8EE	0x97F6	# <CJK>
0xE8EF	0x97F5	# <CJK>
0xE8F0	0x980F	# <CJK>
0xE8F1	0x980C	# <CJK>
0xE8F2	0x9838	# <CJK>
0xE8F3	0x9824	# <CJK>
0xE8F4	0x9821	# <CJK>
0xE8F5	0x9837	# <CJK>
0xE8F6	0x983D	# <CJK>
0xE8F7	0x9846	# <CJK>
0xE8F8	0x984F	# <CJK>
0xE8F9	0x984B	# <CJK>
0xE8FA	0x986B	# <CJK>
0xE8FB	0x986F	# <CJK>
0xE8FC	0x9870	# <CJK>
0xE940	0x9871	# <CJK>
0xE941	0x9874	# <CJK>
0xE942	0x9873	# <CJK>
0xE943	0x98AA	# <CJK>
0xE944	0x98AF	# <CJK>
0xE945	0x98B1	# <CJK>
0xE946	0x98B6	# <CJK>
0xE947	0x98C4	# <CJK>
0xE948	0x98C3	# <CJK>
0xE949	0x98C6	# <CJK>
0xE94A	0x98E9	# <CJK>
0xE94B	0x98EB	# <CJK>
0xE94C	0x9903	# <CJK>
0xE94D	0x9909	# <CJK>
0xE94E	0x9912	# <CJK>
0xE94F	0x9914	# <CJK>
0xE950	0x9918	# <CJK>
0xE951	0x9921	# <CJK>
0xE952	0x991D	# <CJK>
0xE953	0x991E	# <CJK>
0xE954	0x9924	# <CJK>
0xE955	0x9920	# <CJK>
0xE956	0x992C	# <CJK>
0xE957	0x992E	# <CJK>
0xE958	0x993D	# <CJK>
0xE959	0x993E	# <CJK>
0xE95A	0x9942	# <CJK>
0xE95B	0x9949	# <CJK>
0xE95C	0x9945	# <CJK>
0xE95D	0x9950	# <CJK>
0xE95E	0x994B	# <CJK>
0xE95F	0x9951	# <CJK>
0xE960	0x9952	# <CJK>
0xE961	0x994C	# <CJK>
0xE962	0x9955	# <CJK>
0xE963	0x9997	# <CJK>
0xE964	0x9998	# <CJK>
0xE965	0x99A5	# <CJK>
0xE966	0x99AD	# <CJK>
0xE967	0x99AE	# <CJK>
0xE968	0x99BC	# <CJK>
0xE969	0x99DF	# <CJK>
0xE96A	0x99DB	# <CJK>
0xE96B	0x99DD	# <CJK>
0xE96C	0x99D8	# <CJK>
0xE96D	0x99D1	# <CJK>
0xE96E	0x99ED	# <CJK>
0xE96F	0x99EE	# <CJK>
0xE970	0x99F1	# <CJK>
0xE971	0x99F2	# <CJK>
0xE972	0x99FB	# <CJK>
0xE973	0x99F8	# <CJK>
0xE974	0x9A01	# <CJK>
0xE975	0x9A0F	# <CJK>
0xE976	0x9A05	# <CJK>
0xE977	0x99E2	# <CJK>
0xE978	0x9A19	# <CJK>
0xE979	0x9A2B	# <CJK>
0xE97A	0x9A37	# <CJK>
0xE97B	0x9A45	# <CJK>
0xE97C	0x9A42	# <CJK>
0xE97D	0x9A40	# <CJK>
0xE97E	0x9A43	# <CJK>
0xE980	0x9A3E	# <CJK>
0xE981	0x9A55	# <CJK>
0xE982	0x9A4D	# <CJK>
0xE983	0x9A5B	# <CJK>
0xE984	0x9A57	# <CJK>
0xE985	0x9A5F	# <CJK>
0xE986	0x9A62	# <CJK>
0xE987	0x9A65	# <CJK>
0xE988	0x9A64	# <CJK>
0xE989	0x9A69	# <CJK>
0xE98A	0x9A6B	# <CJK>
0xE98B	0x9A6A	# <CJK>
0xE98C	0x9AAD	# <CJK>
0xE98D	0x9AB0	# <CJK>
0xE98E	0x9ABC	# <CJK>
0xE98F	0x9AC0	# <CJK>
0xE990	0x9ACF	# <CJK>
0xE991	0x9AD1	# <CJK>
0xE992	0x9AD3	# <CJK>
0xE993	0x9AD4	# <CJK>
0xE994	0x9ADE	# <CJK>
0xE995	0x9ADF	# <CJK>
0xE996	0x9AE2	# <CJK>
0xE997	0x9AE3	# <CJK>
0xE998	0x9AE6	# <CJK>
0xE999	0x9AEF	# <CJK>
0xE99A	0x9AEB	# <CJK>
0xE99B	0x9AEE	# <CJK>
0xE99C	0x9AF4	# <CJK>
0xE99D	0x9AF1	# <CJK>
0xE99E	0x9AF7	# <CJK>
0xE99F	0x9AFB	# <CJK>
0xE9A0	0x9B06	# <CJK>
0xE9A1	0x9B18	# <CJK>
0xE9A2	0x9B1A	# <CJK>
0xE9A3	0x9B1F	# <CJK>
0xE9A4	0x9B22	# <CJK>
0xE9A5	0x9B23	# <CJK>
0xE9A6	0x9B25	# <CJK>
0xE9A7	0x9B27	# <CJK>
0xE9A8	0x9B28	# <CJK>
0xE9A9	0x9B29	# <CJK>
0xE9AA	0x9B2A	# <CJK>
0xE9AB	0x9B2E	# <CJK>
0xE9AC	0x9B2F	# <CJK>
0xE9AD	0x9B32	# <CJK>
0xE9AE	0x9B44	# <CJK>
0xE9AF	0x9B43	# <CJK>
0xE9B0	0x9B4F	# <CJK>
0xE9B1	0x9B4D	# <CJK>
0xE9B2	0x9B4E	# <CJK>
0xE9B3	0x9B51	# <CJK>
0xE9B4	0x9B58	# <CJK>
0xE9B5	0x9B74	# <CJK>
0xE9B6	0x9B93	# <CJK>
0xE9B7	0x9B83	# <CJK>
0xE9B8	0x9B91	# <CJK>
0xE9B9	0x9B96	# <CJK>
0xE9BA	0x9B97	# <CJK>
0xE9BB	0x9B9F	# <CJK>
0xE9BC	0x9BA0	# <CJK>
0xE9BD	0x9BA8	# <CJK>
0xE9BE	0x9BB4	# <CJK>
0xE9BF	0x9BC0	# <CJK>
0xE9C0	0x9BCA	# <CJK>
0xE9C1	0x9BB9	# <CJK>
0xE9C2	0x9BC6	# <CJK>
0xE9C3	0x9BCF	# <CJK>
0xE9C4	0x9BD1	# <CJK>
0xE9C5	0x9BD2	# <CJK>
0xE9C6	0x9BE3	# <CJK>
0xE9C7	0x9BE2	# <CJK>
0xE9C8	0x9BE4	# <CJK>
0xE9C9	0x9BD4	# <CJK>
0xE9CA	0x9BE1	# <CJK>
0xE9CB	0x9C3A	# <CJK>
0xE9CC	0x9BF2	# <CJK>
0xE9CD	0x9BF1	# <CJK>
0xE9CE	0x9BF0	# <CJK>
0xE9CF	0x9C15	# <CJK>
0xE9D0	0x9C14	# <CJK>
0xE9D1	0x9C09	# <CJK>
0xE9D2	0x9C13	# <CJK>
0xE9D3	0x9C0C	# <CJK>
0xE9D4	0x9C06	# <CJK>
0xE9D5	0x9C08	# <CJK>
0xE9D6	0x9C12	# <CJK>
0xE9D7	0x9C0A	# <CJK>
0xE9D8	0x9C04	# <CJK>
0xE9D9	0x9C2E	# <CJK>
0xE9DA	0x9C1B	# <CJK>
0xE9DB	0x9C25	# <CJK>
0xE9DC	0x9C24	# <CJK>
0xE9DD	0x9C21	# <CJK>
0xE9DE	0x9C30	# <CJK>
0xE9DF	0x9C47	# <CJK>
0xE9E0	0x9C32	# <CJK>
0xE9E1	0x9C46	# <CJK>
0xE9E2	0x9C3E	# <CJK>
0xE9E3	0x9C5A	# <CJK>
0xE9E4	0x9C60	# <CJK>
0xE9E5	0x9C67	# <CJK>
0xE9E6	0x9C76	# <CJK>
0xE9E7	0x9C78	# <CJK>
0xE9E8	0x9CE7	# <CJK>
0xE9E9	0x9CEC	# <CJK>
0xE9EA	0x9CF0	# <CJK>
0xE9EB	0x9D09	# <CJK>
0xE9EC	0x9D08	# <CJK>
0xE9ED	0x9CEB	# <CJK>
0xE9EE	0x9D03	# <CJK>
0xE9EF	0x9D06	# <CJK>
0xE9F0	0x9D2A	# <CJK>
0xE9F1	0x9D26	# <CJK>
0xE9F2	0x9DAF	# <CJK>
0xE9F3	0x9D23	# <CJK>
0xE9F4	0x9D1F	# <CJK>
0xE9F5	0x9D44	# <CJK>
0xE9F6	0x9D15	# <CJK>
0xE9F7	0x9D12	# <CJK>
0xE9F8	0x9D41	# <CJK>
0xE9F9	0x9D3F	# <CJK>
0xE9FA	0x9D3E	# <CJK>
0xE9FB	0x9D46	# <CJK>
0xE9FC	0x9D48	# <CJK>
0xEA40	0x9D5D	# <CJK>
0xEA41	0x9D5E	# <CJK>
0xEA42	0x9D64	# <CJK>
0xEA43	0x9D51	# <CJK>
0xEA44	0x9D50	# <CJK>
0xEA45	0x9D59	# <CJK>
0xEA46	0x9D72	# <CJK>
0xEA47	0x9D89	# <CJK>
0xEA48	0x9D87	# <CJK>
0xEA49	0x9DAB	# <CJK>
0xEA4A	0x9D6F	# <CJK>
0xEA4B	0x9D7A	# <CJK>
0xEA4C	0x9D9A	# <CJK>
0xEA4D	0x9DA4	# <CJK>
0xEA4E	0x9DA9	# <CJK>
0xEA4F	0x9DB2	# <CJK>
0xEA50	0x9DC4	# <CJK>
0xEA51	0x9DC1	# <CJK>
0xEA52	0x9DBB	# <CJK>
0xEA53	0x9DB8	# <CJK>
0xEA54	0x9DBA	# <CJK>
0xEA55	0x9DC6	# <CJK>
0xEA56	0x9DCF	# <CJK>
0xEA57	0x9DC2	# <CJK>
0xEA58	0x9DD9	# <CJK>
0xEA59	0x9DD3	# <CJK>
0xEA5A	0x9DF8	# <CJK>
0xEA5B	0x9DE6	# <CJK>
0xEA5C	0x9DED	# <CJK>
0xEA5D	0x9DEF	# <CJK>
0xEA5E	0x9DFD	# <CJK>
0xEA5F	0x9E1A	# <CJK>
0xEA60	0x9E1B	# <CJK>
0xEA61	0x9E1E	# <CJK>
0xEA62	0x9E75	# <CJK>
0xEA63	0x9E79	# <CJK>
0xEA64	0x9E7D	# <CJK>
0xEA65	0x9E81	# <CJK>
0xEA66	0x9E88	# <CJK>
0xEA67	0x9E8B	# <CJK>
0xEA68	0x9E8C	# <CJK>
0xEA69	0x9E92	# <CJK>
0xEA6A	0x9E95	# <CJK>
0xEA6B	0x9E91	# <CJK>
0xEA6C	0x9E9D	# <CJK>
0xEA6D	0x9EA5	# <CJK>
0xEA6E	0x9EA9	# <CJK>
0xEA6F	0x9EB8	# <CJK>
0xEA70	0x9EAA	# <CJK>
0xEA71	0x9EAD	# <CJK>
0xEA72	0x9761	# <CJK>
0xEA73	0x9ECC	# <CJK>
0xEA74	0x9ECE	# <CJK>
0xEA75	0x9ECF	# <CJK>
0xEA76	0x9ED0	# <CJK>
0xEA77	0x9ED4	# <CJK>
0xEA78	0x9EDC	# <CJK>
0xEA79	0x9EDE	# <CJK>
0xEA7A	0x9EDD	# <CJK>
0xEA7B	0x9EE0	# <CJK>
0xEA7C	0x9EE5	# <CJK>
0xEA7D	0x9EE8	# <CJK>
0xEA7E	0x9EEF	# <CJK>
0xEA80	0x9EF4	# <CJK>
0xEA81	0x9EF6	# <CJK>
0xEA82	0x9EF7	# <CJK>
0xEA83	0x9EF9	# <CJK>
0xEA84	0x9EFB	# <CJK>
0xEA85	0x9EFC	# <CJK>
0xEA86	0x9EFD	# <CJK>
0xEA87	0x9F07	# <CJK>
0xEA88	0x9F08	# <CJK>
0xEA89	0x76B7	# <CJK>
0xEA8A	0x9F15	# <CJK>
0xEA8B	0x9F21	# <CJK>
0xEA8C	0x9F2C	# <CJK>
0xEA8D	0x9F3E	# <CJK>
0xEA8E	0x9F4A	# <CJK>
0xEA8F	0x9F52	# <CJK>
0xEA90	0x9F54	# <CJK>
0xEA91	0x9F63	# <CJK>
0xEA92	0x9F5F	# <CJK>
0xEA93	0x9F60	# <CJK>
0xEA94	0x9F61	# <CJK>
0xEA95	0x9F66	# <CJK>
0xEA96	0x9F67	# <CJK>
0xEA97	0x9F6C	# <CJK>
0xEA98	0x9F6A	# <CJK>
0xEA99	0x9F77	# <CJK>
0xEA9A	0x9F72	# <CJK>
0xEA9B	0x9F76	# <CJK>
0xEA9C	0x9F95	# <CJK>
0xEA9D	0x9F9C	# <CJK>
0xEA9E	0x9FA0	# <CJK>
0xEA9F	0x582F	# <CJK>
0xEAA0	0x69C7	# <CJK>
0xEAA1	0x9059	# <CJK>
0xEAA2	0x7464	# <CJK>
0xEAA3	0x51DC	# <CJK>
0xEAA4	0x7199	# <CJK>
Added jni/zint/backend/tests/tools/gen_test_tab.php.












































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php
/* Generate lookup table from unicode.org mapping file (SHIFTJIS.TXT by default). */
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>
*/
/* To create backend/tests/test_sjis_tab.h (from backend/tests/build directory):
 *
 *   php ../tools/gen_test_tab.php
 *
 * To create backend/tests/test_gb2312_tab.h;
 *
 *   php ../tools/gen_test_tab.php -f GB2312.TXT -s gb2312_tab
 *
 * To create backend/tests/test_gb18030_tab.h (note that backend/tests/tools/data/GB18030.TXT
 * will have to be downloaded first from https://haible.de/bruno/charsets/conversion-tables/GB18030.html
 * using the version libiconv-1.11/GB18030.TXT):
 *
 *   php ../tools/gen_test_tab.php -f GB18030.TXT -s gb18030_tab
 */
/* vim: set ts=4 sw=4 et : */

$basename = basename(__FILE__);
$dirname = dirname(__FILE__);

$opts = getopt('d:f:o:s:');
$data_dirname = isset($opts['d']) ? $opts['d'] : ($dirname . '/data'); // Where to load file from.
$file_name = isset($opts['f']) ? $opts['f'] : 'SHIFTJIS.TXT'; // Name of file.
$out_dirname = isset($opts['o']) ? $opts['o'] : ($dirname . '/..'); // Where to put output.
$suffix_name = isset($opts['s']) ? $opts['s'] : 'sjis_tab'; // Suffix of table and output file.

$file = $data_dirname . '/' . $file_name;

// Read the file.

if (($get = file_get_contents($file)) === false) {
    error_log($error = "$basename: ERROR: Could not read mapping file \"$file\"");
    exit($error . PHP_EOL);
}

$lines = explode("\n", $get);

// Parse the file.

$tab_lines = array();
$sort = array();
foreach ($lines as $line) {
    $line = trim($line);
    if ($line === '' || strncmp($line, '0x', 2) !== 0) {
        continue;
    }
    if (preg_match('/^0x([0-9A-F]{2,8})[ \t]+0x([0-9A-F]{5})/', $line)) { // Exclude U+10000..10FFFF to save space
        continue;
    }
    $tab_lines[] = preg_replace_callback('/^0x([0-9A-F]{2,8})[ \t]+0x([0-9A-F]{4}).*$/', function ($matches) {
        global $sort;
        $mb = hexdec($matches[1]);
        $unicode = hexdec($matches[2]);
        $sort[] = $unicode;
        return sprintf("    0x%04X, 0x%04X,", $mb, $unicode);
    }, $line);
}

array_multisort($sort, $tab_lines);

// Output.

$out = array();
$out[] = '/* Generated by ' . $basename . ' from ' . $file_name . ' */';
$out[] = 'static const unsigned int test_' . $suffix_name . '[] = {';
$out = array_merge($out, $tab_lines);
$out[] = '};';

$out[] = '';
$out[] = 'static const unsigned int test_' . $suffix_name . '_ind[] = {';
$first = 0;
foreach ($sort as $ind => $unicode) {
    $div = (int)($unicode / 0x1000);
    while ($div >= $first) {
        $out[] = ($ind * 2) . ',';
        $first++;
    }
}
$out[] = '};';

file_put_contents($out_dirname . '/test_' . $suffix_name . '.h', implode("\n", $out) . "\n");
Changes to jni/zint/backend/tif.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "common.h"
#include "tif.h"
#ifdef _MSC_VER
#include <io.h>
#include <fcntl.h>
#include <malloc.h>
#endif

int tbump_up(int input) {
    /* Strings length must be a multiple of 4 bytes */
    if ((input % 2) == 1) {
        input++;
    }
    return input;
}

int tif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int i;
    int rows_per_strip, strip_count;
    int free_memory;
    int row, column, strip, bytes_put;
    FILE *tif_file;
#ifdef _MSC_VER







>













<
<
<
<
<
<
<
<
|







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45








46
47
48
49
50
51
52
53
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "common.h"
#include "tif.h"
#ifdef _MSC_VER
#include <io.h>
#include <fcntl.h>
#include <malloc.h>
#endif









INTERNAL int tif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) {
    int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
    int i;
    int rows_per_strip, strip_count;
    int free_memory;
    int row, column, strip, bytes_put;
    FILE *tif_file;
#ifdef _MSC_VER
Added jni/zint/backend/tools/cnv_gb2312.php.


















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
/* Convert libiconv-1.16/lib/gb2312.h to EUC-CN values (+ 0x8080). */
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>
*/
/* vim: set ts=4 sw=4 et : */

$in = false;
while ($line = fgets(STDIN)) {
    if ($in) {
        if (strncmp($line, '};', 2) === 0) {
            echo $line;
            break;
        }
        echo preg_replace_callback('/0x([0-9a-f]{4})/', function ($matches) {
            return '0x' . dechex(hexdec($matches[1]) + 0x8080);
        }, $line);
    } else {
        if (strpos($line, 'short gb2312_2charset') !== false) {
            echo $line;
            $in = true;
        }
    }
}
Added jni/zint/backend/tools/cnv_sjis.php.






























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
/* Convert libiconv-1.16/lib/jisx0208.h to Shift JIS values. */
/*
    libzint - the open source barcode library
    Copyright (C) 2008-2019 Robin Stuart <rstuart114@gmail.com>
*/
/* vim: set ts=4 sw=4 et : */

$in = false;
while ($line = fgets(STDIN)) {
    if ($in) {
        if (strncmp($line, '};', 2) === 0) {
            echo $line;
            break;
        }
        echo preg_replace_callback('/0x([0-9a-f]{4})/', function ($matches) {
            $dec = hexdec($matches[1]);
            $c1 = $dec >> 8;
            $c2 = ($dec & 0xFF);
            $t1 = ($c1 - 0x21) >> 1;
            $t2 = ((($c1 - 0x21) & 1) ? 0x5e : 0) + ($c2 - 0x21);
            $r = (($t1 < 0x1f ? ($t1 + 0x81) : ($t1 + 0xc1)) << 8) | ($t2 < 0x3f ? ($t2 + 0x40) : ($t2 + 0x41));
            return '0x' . dechex($r);
        }, $line);
    } else {
        if (strpos($line, 'jisx0208_2charset') !== false) {
            echo $line;
            $in = true;
        }
    }
}
Changes to jni/zint/backend/ultra.c.
29
30
31
32
33
34
35
36
37
38
39
40
41
    SUCH DAMAGE.
 */

#include <stdio.h>
#include <string.h>
#include "common.h"

int ultracode(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) {


    strcpy(symbol->errtxt, "1000: Ultracode has not been implemented - yet!");
    return ZINT_ERROR_INVALID_OPTION;
}







|





29
30
31
32
33
34
35
36
37
38
39
40
41
    SUCH DAMAGE.
 */

#include <stdio.h>
#include <string.h>
#include "common.h"

INTERNAL int ultracode(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) {


    strcpy(symbol->errtxt, "1000: Ultracode has not been implemented - yet!");
    return ZINT_ERROR_INVALID_OPTION;
}
Changes to jni/zint/backend/upcean.c.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#define SODIUM	"0123456789+"
#define EAN2	102
#define EAN5	105

#include <stdio.h>
#include <string.h>







>







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#define SODIUM	"0123456789+"
#define EAN2	102
#define EAN5	105

#include <stdio.h>
#include <string.h>
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

static const char *EANsetB[10] = {
    /* Representation set B (EN Table 1) */
    "1123", "1222", "2212", "1141", "2311", "1321", "4111", "2131", "3121", "2113"
};

/* Calculate the correct check digit for a UPC barcode */
char upc_check(char source[]) {
    unsigned int i, count, check_digit;

    count = 0;

    for (i = 0; i < strlen(source); i++) {
        count += ctoi(source[i]);

        if (!(i & 1)) {
            count += 2 * (ctoi(source[i]));
        }
    }

    check_digit = 10 - (count % 10);
    if (check_digit == 10) {
        check_digit = 0;
    }
    return itoc(check_digit);
}

/* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */
void upca_draw(char source[], char dest[]) {
    unsigned int i, half_way;

    half_way = strlen(source) / 2;

    /* start character */
    strcat(dest, "111");








|




















|







77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

static const char *EANsetB[10] = {
    /* Representation set B (EN Table 1) */
    "1123", "1222", "2212", "1141", "2311", "1321", "4111", "2131", "3121", "2113"
};

/* Calculate the correct check digit for a UPC barcode */
static char upc_check(char source[]) {
    unsigned int i, count, check_digit;

    count = 0;

    for (i = 0; i < strlen(source); i++) {
        count += ctoi(source[i]);

        if (!(i & 1)) {
            count += 2 * (ctoi(source[i]));
        }
    }

    check_digit = 10 - (count % 10);
    if (check_digit == 10) {
        check_digit = 0;
    }
    return itoc(check_digit);
}

/* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */
static void upca_draw(char source[], char dest[]) {
    unsigned int i, half_way;

    half_way = strlen(source) / 2;

    /* start character */
    strcat(dest, "111");

120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
    }

    /* stop character */
    strcat(dest, "111");
}

/* Make a UPC A barcode when we haven't been given the check digit */
int upca(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    int length;
    char gtin[15];

    strcpy(gtin, (char*) source);
    length = strlen(gtin);

    if (length == 11) {







|







121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
    }

    /* stop character */
    strcat(dest, "111");
}

/* Make a UPC A barcode when we haven't been given the check digit */
static int upca(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    int length;
    char gtin[15];

    strcpy(gtin, (char*) source);
    length = strlen(gtin);

    if (length == 11) {
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
    }
    upca_draw(gtin, dest);
    ustrcpy(symbol->text, (unsigned char*) gtin);
    return 0;
}

/* UPC E is a zero-compressed version of UPC A */
int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    unsigned int i, num_system;
    char emode, equivalent[12], check_digit, parity[8], temp[9];
    char hrt[9];

    /* Two number systems can be used - system 0 and system 1 */
    if (symbol->symbology != BARCODE_UPCE_CHK) {
        /* No check digit in input data */







|







145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
    }
    upca_draw(gtin, dest);
    ustrcpy(symbol->text, (unsigned char*) gtin);
    return 0;
}

/* UPC E is a zero-compressed version of UPC A */
static int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    unsigned int i, num_system;
    char emode, equivalent[12], check_digit, parity[8], temp[9];
    char hrt[9];

    /* Two number systems can be used - system 0 and system 1 */
    if (symbol->symbology != BARCODE_UPCE_CHK) {
        /* No check digit in input data */
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
        }
    }
    ustrcpy(symbol->text, (unsigned char*) hrt);
    return 0;
}

/* EAN-2 and EAN-5 add-on codes */
void add_on(unsigned char source[], char dest[], int mode) {
    char parity[6];
    unsigned int i, code_type;

    /* If an add-on then append with space */
    if (mode != 0) {
        strcat(dest, "9");
    }







|







299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
        }
    }
    ustrcpy(symbol->text, (unsigned char*) hrt);
    return 0;
}

/* EAN-2 and EAN-5 add-on codes */
static void add_on(unsigned char source[], char dest[], int mode) {
    char parity[6];
    unsigned int i, code_type;

    /* If an add-on then append with space */
    if (mode != 0) {
        strcat(dest, "9");
    }
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
        }
    }
}

/* ************************ EAN-13 ****************** */

/* Calculate the correct check digit for a EAN-13 barcode */
char ean_check(char source[]) {
    int i;
    unsigned int h, count, check_digit;

    count = 0;

    h = strlen(source);
    for (i = h - 1; i >= 0; i--) {
        count += ctoi(source[i]);

        if (i & 1) {
            count += 2 * ctoi(source[i]);
        }
    }
    check_digit = 10 - (count % 10);
    if (check_digit == 10) {
        check_digit = 0;
    }
    return itoc(check_digit);
}

int ean13(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    unsigned int length, i, half_way;
    char parity[6];
    char gtin[15];

    strcpy(parity, "");
    strcpy(gtin, (char*) source);








|




















|







359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
        }
    }
}

/* ************************ EAN-13 ****************** */

/* Calculate the correct check digit for a EAN-13 barcode */
static char ean_check(char source[]) {
    int i;
    unsigned int h, count, check_digit;

    count = 0;

    h = strlen(source);
    for (i = h - 1; i >= 0; i--) {
        count += ctoi(source[i]);

        if (i & 1) {
            count += 2 * ctoi(source[i]);
        }
    }
    check_digit = 10 - (count % 10);
    if (check_digit == 10) {
        check_digit = 0;
    }
    return itoc(check_digit);
}

static int ean13(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    unsigned int length, i, half_way;
    char parity[6];
    char gtin[15];

    strcpy(parity, "");
    strcpy(gtin, (char*) source);

433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
    strcat(dest, "111");

    ustrcpy(symbol->text, (unsigned char*) gtin);
    return 0;
}

/* Make an EAN-8 barcode when we haven't been given the check digit */
int ean8(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    /* EAN-8 is basically the same as UPC-A but with fewer digits */
    int length;
    char gtin[10];

    strcpy(gtin, (char*) source);
    length = strlen(gtin);








|







434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
    strcat(dest, "111");

    ustrcpy(symbol->text, (unsigned char*) gtin);
    return 0;
}

/* Make an EAN-8 barcode when we haven't been given the check digit */
static int ean8(struct zint_symbol *symbol, unsigned char source[], char dest[]) {
    /* EAN-8 is basically the same as UPC-A but with fewer digits */
    int length;
    char gtin[10];

    strcpy(gtin, (char*) source);
    length = strlen(gtin);

459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
    upca_draw(gtin, dest);
    ustrcpy(symbol->text, (unsigned char*) gtin);

    return 0;
}

/* For ISBN(13) only */
char isbn13_check(unsigned char source[]) {
    unsigned int i, weight, sum, check, h;

    sum = 0;
    weight = 1;
    h = ustrlen(source) - 1;

    for (i = 0; i < h; i++) {
        sum += ctoi(source[i]) * weight;
        if (weight == 1) weight = 3;
        else weight = 1;
    }

    check = sum % 10;
    check = 10 - check;
    if (check == 10) check = 0;
    return itoc(check);
}

/* For ISBN(10) and SBN only */
char isbn_check(unsigned char source[]) {
    unsigned int i, weight, sum, check, h;
    char check_char;

    sum = 0;
    weight = 1;
    h = ustrlen(source) - 1;








|



















|







460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
    upca_draw(gtin, dest);
    ustrcpy(symbol->text, (unsigned char*) gtin);

    return 0;
}

/* For ISBN(13) only */
static char isbn13_check(unsigned char source[]) {
    unsigned int i, weight, sum, check, h;

    sum = 0;
    weight = 1;
    h = ustrlen(source) - 1;

    for (i = 0; i < h; i++) {
        sum += ctoi(source[i]) * weight;
        if (weight == 1) weight = 3;
        else weight = 1;
    }

    check = sum % 10;
    check = 10 - check;
    if (check == 10) check = 0;
    return itoc(check);
}

/* For ISBN(10) and SBN only */
static char isbn_check(unsigned char source[]) {
    unsigned int i, weight, sum, check, h;
    char check_char;

    sum = 0;
    weight = 1;
    h = ustrlen(source) - 1;

560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
        source[12] = '\0';
    }

    return ean13(symbol, source, dest);
}

/* Add leading zeroes to EAN and UPC strings */
void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[]) {
    unsigned char first_part[20], second_part[20], zfirst_part[20], zsecond_part[20];
    int with_addon = 0;
    int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h;

    h = ustrlen(source);
    for (i = 0; i < h; i++) {
        if (source[i] == '+') {







|







561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
        source[12] = '\0';
    }

    return ean13(symbol, source, dest);
}

/* Add leading zeroes to EAN and UPC strings */
INTERNAL void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[]) {
    unsigned char first_part[20], second_part[20], zfirst_part[20], zsecond_part[20];
    int with_addon = 0;
    int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h;

    h = ustrlen(source);
    for (i = 0; i < h; i++) {
        if (source[i] == '+') {
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
        case BARCODE_EANX_CC:
            if (first_len <= 12) {
                zfirst_len = 12;
            }
            if (first_len <= 7) {
                zfirst_len = 7;
            }
            if (second_len == 0) {
                if (first_len <= 5) {
                    zfirst_len = 5;
                }
                if (first_len <= 2) {
                    zfirst_len = 2;
                }
            }







|







614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
        case BARCODE_EANX_CC:
            if (first_len <= 12) {
                zfirst_len = 12;
            }
            if (first_len <= 7) {
                zfirst_len = 7;
            }
            if (second_len == 0 && symbol->symbology == BARCODE_EANX) { /* No composite EAN-2/5 */
                if (first_len <= 5) {
                    zfirst_len = 5;
                }
                if (first_len <= 2) {
                    zfirst_len = 2;
                }
            }
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
    for (i = 0; i < (zsecond_len - second_len); i++) {
        strcat((char*) zsecond_part, "0");
    }
    strcat((char*) zsecond_part, (char*) second_part);

    /* Copy adjusted data back to local_source */
    strcat((char*) local_source, (char*) zfirst_part);
    if (zsecond_len != 0) {
        strcat((char*) local_source, "+");
        strcat((char*) local_source, (char*) zsecond_part);
    }
}

/* splits string to parts before and after '+' parts */
int eanx(struct zint_symbol *symbol, unsigned char source[], int src_len) {
    unsigned char first_part[20] = {0}, second_part[20] = {0}, dest[1000] = {0};
    unsigned char local_source[20] = {0};
    unsigned int latch, reader, writer, with_addon;
    int error_number, i;


    with_addon = FALSE;







|






|







683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
    for (i = 0; i < (zsecond_len - second_len); i++) {
        strcat((char*) zsecond_part, "0");
    }
    strcat((char*) zsecond_part, (char*) second_part);

    /* Copy adjusted data back to local_source */
    strcat((char*) local_source, (char*) zfirst_part);
    if (ustrlen(zsecond_part)) {
        strcat((char*) local_source, "+");
        strcat((char*) local_source, (char*) zsecond_part);
    }
}

/* splits string to parts before and after '+' parts */
INTERNAL int eanx(struct zint_symbol *symbol, unsigned char source[], int src_len) {
    unsigned char first_part[20] = {0}, second_part[20] = {0}, dest[1000] = {0};
    unsigned char local_source[20] = {0};
    unsigned int latch, reader, writer, with_addon;
    int error_number, i;


    with_addon = FALSE;
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
        /* ISBN has it's own checking routine */
        error_number = is_sane("0123456789+", source, src_len);
        if (error_number == ZINT_ERROR_INVALID_DATA) {
            strcpy(symbol->errtxt, "284: Invalid characters in data");
            return error_number;
        }
    } else {
        error_number = is_sane("0123456789Xx", source, src_len);
        if (error_number == ZINT_ERROR_INVALID_DATA) {
            strcpy(symbol->errtxt, "285: Invalid characters in input");
            return error_number;
        }
    }

    /* Add leading zeroes */







|







713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
        /* ISBN has it's own checking routine */
        error_number = is_sane("0123456789+", source, src_len);
        if (error_number == ZINT_ERROR_INVALID_DATA) {
            strcpy(symbol->errtxt, "284: Invalid characters in data");
            return error_number;
        }
    } else {
        error_number = is_sane("0123456789Xx+", source, src_len);
        if (error_number == ZINT_ERROR_INVALID_DATA) {
            strcpy(symbol->errtxt, "285: Invalid characters in input");
            return error_number;
        }
    }

    /* Add leading zeroes */
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
        case BARCODE_EANX_CC:
            switch (ustrlen(first_part)) { /* Adds vertical separator bars according to ISO/IEC 24723 section 11.4 */
                case 7: set_module(symbol, symbol->rows, 1);
                    set_module(symbol, symbol->rows, 67);
                    set_module(symbol, symbol->rows + 1, 0);
                    set_module(symbol, symbol->rows + 1, 68);
                    set_module(symbol, symbol->rows + 2, 1);
                    set_module(symbol, symbol->rows + 1, 67);
                    symbol->row_height[symbol->rows] = 2;
                    symbol->row_height[symbol->rows + 1] = 2;
                    symbol->row_height[symbol->rows + 2] = 2;
                    symbol->rows += 3;
                    error_number = ean8(symbol, first_part, (char*) dest);
                    break;
                case 12:set_module(symbol, symbol->rows, 1);







|







785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
        case BARCODE_EANX_CC:
            switch (ustrlen(first_part)) { /* Adds vertical separator bars according to ISO/IEC 24723 section 11.4 */
                case 7: set_module(symbol, symbol->rows, 1);
                    set_module(symbol, symbol->rows, 67);
                    set_module(symbol, symbol->rows + 1, 0);
                    set_module(symbol, symbol->rows + 1, 68);
                    set_module(symbol, symbol->rows + 2, 1);
                    set_module(symbol, symbol->rows + 2, 67);
                    symbol->row_height[symbol->rows] = 2;
                    symbol->row_height[symbol->rows + 1] = 2;
                    symbol->row_height[symbol->rows + 2] = 2;
                    symbol->rows += 3;
                    error_number = ean8(symbol, first_part, (char*) dest);
                    break;
                case 12:set_module(symbol, symbol->rows, 1);
908
909
910
911
912
913
914
915
            unset_module(symbol, symbol->rows - 1, 0);
            symbol->width += 2;
            break;
    }

    return 0;
}








<
909
910
911
912
913
914
915

            unset_module(symbol, symbol->rows - 1, 0);
            symbol->width += 2;
            break;
    }

    return 0;
}

Changes to jni/zint/backend/vector.c.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

#ifdef _MSC_VER
#include <malloc.h>
#endif

#include "common.h"

#define SSET "0123456789ABCDEF"

extern int ps_plot(struct zint_symbol *symbol);
extern int svg_plot(struct zint_symbol *symbol);
extern int emf_plot(struct zint_symbol *symbol);

struct zint_vector_rect *vector_plot_create_rect(float x, float y, float width, float height) {
    struct zint_vector_rect *rect;

    rect = (struct zint_vector_rect*) malloc(sizeof (struct zint_vector_rect));
    if (!rect) return NULL;

    rect->next = NULL;
    rect->x = x;
    rect->y = y;
    rect->width = width;
    rect->height = height;
    rect->colour = -1; // Default colour

    return rect;
}

int vector_plot_add_rect(struct zint_symbol *symbol, struct zint_vector_rect *rect, struct zint_vector_rect **last_rect) {
    if (!rect) return ZINT_ERROR_MEMORY;
    if (*last_rect)
        (*last_rect)->next = rect;
    else
        symbol->vector->rectangles = rect; // first rectangle

    *last_rect = rect;
    return 1;
}

struct zint_vector_hexagon *vector_plot_create_hexagon(float x, float y, float diameter) {
    struct zint_vector_hexagon *hexagon;

    hexagon = (struct zint_vector_hexagon*) malloc(sizeof (struct zint_vector_hexagon));
    if (!hexagon) return NULL;
    hexagon->next = NULL;
    hexagon->x = x;
    hexagon->y = y;
    hexagon->diameter = (float)((diameter * 5.0) / 4.0); // Ugly kludge for legacy support

    return hexagon;
}

int vector_plot_add_hexagon(struct zint_symbol *symbol, struct zint_vector_hexagon *hexagon, struct zint_vector_hexagon **last_hexagon) {
    if (!hexagon) return ZINT_ERROR_MEMORY;
    if (*last_hexagon)
        (*last_hexagon)->next = hexagon;
    else
        symbol->vector->hexagons = hexagon; // first hexagon

    *last_hexagon = hexagon;
    return 1;
}

struct zint_vector_circle *vector_plot_create_circle(float x, float y, float diameter, int colour) {
    struct zint_vector_circle *circle;

    circle = (struct zint_vector_circle *) malloc(sizeof (struct zint_vector_circle));
    if (!circle) return NULL;
    circle->next = NULL;
    circle->x = x;
    circle->y = y;
    circle->diameter = diameter;
    circle->colour = colour;

    return circle;
}

int vector_plot_add_circle(struct zint_symbol *symbol, struct zint_vector_circle *circle, struct zint_vector_circle **last_circle) {
    if (!circle) return ZINT_ERROR_MEMORY;
    if (*last_circle)
        (*last_circle)->next = circle;
    else
        symbol->vector->circles = circle; // first circle

    *last_circle = circle;
    return 1;
}

int vector_plot_add_string(struct zint_symbol *symbol,
        unsigned char *text, float x, float y, float fsize, float width,
        struct zint_vector_string **last_string) {
    struct zint_vector_string *string;

    string = (struct zint_vector_string*) malloc(sizeof (struct zint_vector_string));
    string->next = NULL;
    string->x = x;







>














|
|
|

|















|










|












|










|













|










|







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>

#ifdef _MSC_VER
#include <malloc.h>
#endif

#include "common.h"

#define SSET "0123456789ABCDEF"

INTERNAL int ps_plot(struct zint_symbol *symbol);
INTERNAL int svg_plot(struct zint_symbol *symbol);
INTERNAL int emf_plot(struct zint_symbol *symbol);

static struct zint_vector_rect *vector_plot_create_rect(float x, float y, float width, float height) {
    struct zint_vector_rect *rect;

    rect = (struct zint_vector_rect*) malloc(sizeof (struct zint_vector_rect));
    if (!rect) return NULL;

    rect->next = NULL;
    rect->x = x;
    rect->y = y;
    rect->width = width;
    rect->height = height;
    rect->colour = -1; // Default colour

    return rect;
}

static int vector_plot_add_rect(struct zint_symbol *symbol, struct zint_vector_rect *rect, struct zint_vector_rect **last_rect) {
    if (!rect) return ZINT_ERROR_MEMORY;
    if (*last_rect)
        (*last_rect)->next = rect;
    else
        symbol->vector->rectangles = rect; // first rectangle

    *last_rect = rect;
    return 1;
}

static struct zint_vector_hexagon *vector_plot_create_hexagon(float x, float y, float diameter) {
    struct zint_vector_hexagon *hexagon;

    hexagon = (struct zint_vector_hexagon*) malloc(sizeof (struct zint_vector_hexagon));
    if (!hexagon) return NULL;
    hexagon->next = NULL;
    hexagon->x = x;
    hexagon->y = y;
    hexagon->diameter = (float)((diameter * 5.0) / 4.0); // Ugly kludge for legacy support

    return hexagon;
}

static int vector_plot_add_hexagon(struct zint_symbol *symbol, struct zint_vector_hexagon *hexagon, struct zint_vector_hexagon **last_hexagon) {
    if (!hexagon) return ZINT_ERROR_MEMORY;
    if (*last_hexagon)
        (*last_hexagon)->next = hexagon;
    else
        symbol->vector->hexagons = hexagon; // first hexagon

    *last_hexagon = hexagon;
    return 1;
}

static struct zint_vector_circle *vector_plot_create_circle(float x, float y, float diameter, int colour) {
    struct zint_vector_circle *circle;

    circle = (struct zint_vector_circle *) malloc(sizeof (struct zint_vector_circle));
    if (!circle) return NULL;
    circle->next = NULL;
    circle->x = x;
    circle->y = y;
    circle->diameter = diameter;
    circle->colour = colour;

    return circle;
}

static int vector_plot_add_circle(struct zint_symbol *symbol, struct zint_vector_circle *circle, struct zint_vector_circle **last_circle) {
    if (!circle) return ZINT_ERROR_MEMORY;
    if (*last_circle)
        (*last_circle)->next = circle;
    else
        symbol->vector->circles = circle; // first circle

    *last_circle = circle;
    return 1;
}

static int vector_plot_add_string(struct zint_symbol *symbol,
        unsigned char *text, float x, float y, float fsize, float width,
        struct zint_vector_string **last_string) {
    struct zint_vector_string *string;

    string = (struct zint_vector_string*) malloc(sizeof (struct zint_vector_string));
    string->next = NULL;
    string->x = x;
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
    else
        symbol->vector->strings = string; // First text portion
    *last_string = string;

    return 1;
}

void vector_free(struct zint_symbol *symbol) {
    if (symbol->vector != NULL) {
        struct zint_vector_rect *rect;
        struct zint_vector_hexagon *hex;
        struct zint_vector_circle *circle;
        struct zint_vector_string *string;

        // Free Rectangles







|







143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
    else
        symbol->vector->strings = string; // First text portion
    *last_string = string;

    return 1;
}

INTERNAL void vector_free(struct zint_symbol *symbol) {
    if (symbol->vector != NULL) {
        struct zint_vector_rect *rect;
        struct zint_vector_hexagon *hex;
        struct zint_vector_circle *circle;
        struct zint_vector_string *string;

        // Free Rectangles
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202

        // Free vector
        free(symbol->vector);
        symbol->vector = NULL;
    }
}

void vector_scale(struct zint_symbol *symbol) {
    struct zint_vector_rect *rect;
    struct zint_vector_hexagon *hex;
    struct zint_vector_circle *circle;
    struct zint_vector_string *string;
    float scale = symbol->scale * 2.0f;

    symbol->vector->width *= scale;







|







189
190
191
192
193
194
195
196
197
198
199
200
201
202
203

        // Free vector
        free(symbol->vector);
        symbol->vector = NULL;
    }
}

static void vector_scale(struct zint_symbol *symbol) {
    struct zint_vector_rect *rect;
    struct zint_vector_hexagon *hex;
    struct zint_vector_circle *circle;
    struct zint_vector_string *string;
    float scale = symbol->scale * 2.0f;

    symbol->vector->width *= scale;
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279

280
281
282
283
284
285

286
287
288
289
290

291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
        string->width *= scale;
        string->fsize *= scale;
        string = string->next;
    }
    return;
}

void delete_last_rect(struct zint_vector_rect *rect) {
    struct zint_vector_rect *local;
    
    local = rect;
    
    if (local->next == NULL) {
        free(local);
        return;
    }
    
    while (local->next->next != NULL) {
        local = local->next;
    }
    
    free(local->next);
    local->next = NULL;
}

void bump_up_rect(struct zint_vector_rect *rect) {
    struct zint_vector_rect *local;
    
    local = rect;
    
    while (local->next) {
        local->x = local->next->x;
        local->y = local->next->y;
        local->height = local->next->height;
        local->width = local->next->width;
        local = local->next;
    }
    
}

void vector_reduce_rectangles(struct zint_symbol *symbol) {
    // Looks for vertically aligned rectangles and merges them together
    struct zint_vector_rect *rect, *target = NULL;

    rect = symbol->vector->rectangles;
    while (rect) {

        target = rect->next;
        
        while (target) {
            
            if ((rect->x == target->x) && (rect->width == target->width) && ((rect->y + rect->height) == target->y)) {
                rect->height += target->height;

                bump_up_rect(target);
                delete_last_rect(symbol->vector->rectangles);
            } else {
                target = target->next;
            }

        }

        rect = rect->next;
    }

    return;
}

int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_type) {
    int error_number;
    struct zint_vector *vector;
    struct zint_vector_rect *rectangle, *rect, *last_rectangle = NULL;
    struct zint_vector_hexagon *last_hexagon = NULL;
    struct zint_vector_string *last_string = NULL;
    struct zint_vector_circle *last_circle = NULL;








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|

|



>
|





>
|
<

|

>








|







235
236
237
238
239
240
241

































242
243
244
245
246
247
248
249
250
251
252
253
254
255
256

257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
        string->width *= scale;
        string->fsize *= scale;
        string = string->next;
    }
    return;
}


































static void vector_reduce_rectangles(struct zint_symbol *symbol) {
    // Looks for vertically aligned rectangles and merges them together
    struct zint_vector_rect *rect, *target, *prev;

    rect = symbol->vector->rectangles;
    while (rect) {
        prev = rect;
        target = prev->next;
        
        while (target) {
            
            if ((rect->x == target->x) && (rect->width == target->width) && ((rect->y + rect->height) == target->y)) {
                rect->height += target->height;
                prev->next = target->next;
                free(target);

            } else {
                prev = target;
            }
            target = prev->next;
        }

        rect = rect->next;
    }

    return;
}

INTERNAL int plot_vector(struct zint_symbol *symbol, int rotate_angle, int file_type) {
    int error_number;
    struct zint_vector *vector;
    struct zint_vector_rect *rectangle, *rect, *last_rectangle = NULL;
    struct zint_vector_hexagon *last_hexagon = NULL;
    struct zint_vector_string *last_string = NULL;
    struct zint_vector_circle *last_circle = NULL;

383
384
385
386
387
388
389

390
391

392
393
394
395
396
397
398
399
400
401
402
403


    /*
     * Calculate the width of the barcode, especially if there are any extra
     * borders or white space to add.
     */


    while (!(module_is_set(symbol, symbol->rows - 1, symbol_lead_in))) {
        symbol_lead_in++;

    }

    /* Certain symbols need whitespace otherwise characters get chopped off the sides */
    if ((((symbol->symbology == BARCODE_EANX || symbol->symbology == BARCODE_EANX_CHK) && (symbol->rows == 1)) ||
            (symbol->symbology == BARCODE_EANX_CC)) || (symbol->symbology == BARCODE_ISBNX)) {
        switch (ustrlen(symbol->text)) {
            case 13: /* EAN 13 */
            case 16:
            case 19:
                if (symbol->whitespace_width == 0) {
                    symbol->whitespace_width = 10;
                }







>
|
|
>



|
|







353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375


    /*
     * Calculate the width of the barcode, especially if there are any extra
     * borders or white space to add.
     */

    if (is_composite(symbol->symbology)) {
        while (!(module_is_set(symbol, symbol->rows - 1, symbol_lead_in))) {
            symbol_lead_in++;
        }
    }

    /* Certain symbols need whitespace otherwise characters get chopped off the sides */
    if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CHK)
            || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) {
        switch (ustrlen(symbol->text)) {
            case 13: /* EAN 13 */
            case 16:
            case 19:
                if (symbol->whitespace_width == 0) {
                    symbol->whitespace_width = 10;
                }
412
413
414
415
416
417
418
419
420
421
422
423
424
425

426
427
428
429
430
431
432

433
434
435
436
437
438
439
                main_symbol_width_x = 49 + symbol_lead_in;
                upceanflag = 5;
                break;
            default:
                main_symbol_width_x = 68 + symbol_lead_in;
                upceanflag = 8;
        }
    } else if (((symbol->symbology == BARCODE_UPCA || symbol->symbology == BARCODE_UPCA_CHK) && (symbol->rows == 1))
            || (symbol->symbology == BARCODE_UPCA_CC)) {
        upceanflag = 12;
        if (symbol->whitespace_width < 10) {
            symbol->whitespace_width = 10;
            main_symbol_width_x = 96 + symbol_lead_in;
        }

    } else if (((symbol->symbology == BARCODE_UPCE || symbol->symbology == BARCODE_UPCE_CHK) && (symbol->rows == 1))
            || (symbol->symbology == BARCODE_UPCE_CC)) {
        upceanflag = 6;
        if (symbol->whitespace_width == 0) {
            symbol->whitespace_width = 10;
            main_symbol_width_x = 51 + symbol_lead_in;
        }

    }

    if ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)) {
        hide_text = 1;
        text_height = 0.0;
        text_offset = upceanflag ? 9.0f : 0.0f;
    } else {







|


|

<

>
|




<

>







384
385
386
387
388
389
390
391
392
393
394
395

396
397
398
399
400
401
402

403
404
405
406
407
408
409
410
411
                main_symbol_width_x = 49 + symbol_lead_in;
                upceanflag = 5;
                break;
            default:
                main_symbol_width_x = 68 + symbol_lead_in;
                upceanflag = 8;
        }
    } else if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CHK)
            || (symbol->symbology == BARCODE_UPCA_CC)) {
        upceanflag = 12;
        if (symbol->whitespace_width == 0) {
            symbol->whitespace_width = 10;

        }
        main_symbol_width_x = 96 + symbol_lead_in;
    } else if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CHK)
            || (symbol->symbology == BARCODE_UPCE_CC)) {
        upceanflag = 6;
        if (symbol->whitespace_width == 0) {
            symbol->whitespace_width = 10;

        }
        main_symbol_width_x = 51 + symbol_lead_in;
    }

    if ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)) {
        hide_text = 1;
        text_height = 0.0;
        text_offset = upceanflag ? 9.0f : 0.0f;
    } else {
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
            large_bar_count++;
        }
    }

    vector->width = (float)ceil(symbol->width + (2.0f * xoffset));
    vector->height = (float)ceil(symbol->height + text_offset + (2.0f * yoffset));

    large_bar_height = (symbol->height - preset_height) / large_bar_count;

    if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) {
        default_text_posn = symbol->height + text_offset + symbol->border_width + symbol->border_width;
    } else {
        default_text_posn = symbol->height + text_offset + symbol->border_width;
    }








|







428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
            large_bar_count++;
        }
    }

    vector->width = (float)ceil(symbol->width + (2.0f * xoffset));
    vector->height = (float)ceil(symbol->height + text_offset + (2.0f * yoffset));

    large_bar_height = large_bar_count ? (symbol->height - preset_height) / large_bar_count : 0 /*Not used if large_bar_count zero*/;

    if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) {
        default_text_posn = symbol->height + text_offset + symbol->border_width + symbol->border_width;
    } else {
        default_text_posn = symbol->height + text_offset + symbol->border_width;
    }

495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
                latch = 0;
            }

            do {
                int block_width = 0;
                do {
                    block_width++;
                } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
                if ((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_symbol_width_x)) {
                    addon_text_posn = row_posn + 8.0f;
                    addon_latch = 1;
                }
                if (latch == 1) {
                    /* a bar */
                    if (addon_latch == 0) {







|







467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
                latch = 0;
            }

            do {
                int block_width = 0;
                do {
                    block_width++;
                } while (i + block_width < symbol->width && module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i));
                if ((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_symbol_width_x)) {
                    addon_text_posn = row_posn + 8.0f;
                    addon_latch = 1;
                }
                if (latch == 1) {
                    /* a bar */
                    if (addon_latch == 0) {
639
640
641
642
643
644
645
646
647
648
649
650
651



652
653
654
655
656
657
658
                    break;
            }
            i++;
        }
    }
    
    /* Add the text */
    xoffset += symbol_lead_in;
    row_posn = row_posn + large_bar_height;
    
    if (!hide_text) {
        char textpart[10];
        float textwidth;



        if (upceanflag == 8) {
            for (i = 0; i < 4; i++) {
                textpart[i] = symbol->text[i];
            }
            textpart[4] = '\0';
            textpos = 17;
            textwidth = 4.0 * 8.5;







<
<
|



>
>
>







611
612
613
614
615
616
617


618
619
620
621
622
623
624
625
626
627
628
629
630
631
                    break;
            }
            i++;
        }
    }
    
    /* Add the text */



    if (!hide_text) {
        char textpart[10];
        float textwidth;

        xoffset += symbol_lead_in;

        if (upceanflag == 8) {
            for (i = 0; i < 4; i++) {
                textpart[i] = symbol->text[i];
            }
            textpart[4] = '\0';
            textpos = 17;
            textwidth = 4.0 * 8.5;
786
787
788
789
790
791
792


793
794
795
796
797
798
799
        }

        /* Put normal human readable text at the bottom (and centered) */
        if (textdone == 0) {
            // caculate start xoffset to center text
            vector_plot_add_string(symbol, symbol->text, (symbol->width / 2.0f) + xoffset, default_text_posn, text_height, (float)symbol->width, &last_string);
        }


    }

    //Remove control characters from readable text
    // This only applies to Code 128
    string = symbol->vector->strings;
    if (string) {
        for (i = 0; i < string->length; i++) {







>
>







759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
        }

        /* Put normal human readable text at the bottom (and centered) */
        if (textdone == 0) {
            // caculate start xoffset to center text
            vector_plot_add_string(symbol, symbol->text, (symbol->width / 2.0f) + xoffset, default_text_posn, text_height, (float)symbol->width, &last_string);
        }

        xoffset -= symbol_lead_in; // Restore xoffset
    }

    //Remove control characters from readable text
    // This only applies to Code 128
    string = symbol->vector->strings;
    if (string) {
        for (i = 0; i < string->length; i++) {
Changes to jni/zint/backend/zint.h.
1
2
3
4
5
6
7
8
9
10
11
/*  zint.h - definitions for libzint

    libzint - the open source barcode library
    Copyright (C) 2009-2018 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.



|







1
2
3
4
5
6
7
8
9
10
11
/*  zint.h - definitions for libzint

    libzint - the open source barcode library
    Copyright (C) 2009-2019 Robin Stuart <rstuart114@gmail.com>

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

    1. Redistributions of source code must retain the above copyright
       notice, this list of conditions and the following disclaimer.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */


#ifndef ZINT_H
#define ZINT_H

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

    struct zint_render_line {
        float x, y, length, width;
        struct zint_render_line *next; /* Pointer to next line */
    };
    
    struct zint_vector_rect {
        float x, y, height, width;
        int colour;
        struct zint_vector_rect *next;
    };

    struct zint_render_string {
        float x, y, fsize;
        float width; /* Suggested string width, may be 0 if none recommended */
        int length;
        unsigned char *text;
        struct zint_render_string *next; /* Pointer to next character */
    };
    
    struct zint_vector_string {
        float x, y, fsize;
        float width; /* Suggested string width, may be 0 if none recommended */
        int length;
        unsigned char *text;
        struct zint_vector_string *next; /* Pointer to next character */
    };

    struct zint_render_ring {
        float x, y, radius, line_width;
        struct zint_render_ring *next; /* Pointer to next ring */
    };

    struct zint_vector_circle {
        float x, y, diameter;
        int colour;
        struct zint_vector_circle *next; /* Pointer to next circle */
    };
    
    struct zint_render_hexagon {
        float x, y, height;
        struct zint_render_hexagon *next; /* Pointer to next hexagon */
    };

    struct zint_vector_hexagon {
        float x, y, diameter;
        struct zint_vector_hexagon *next; /* Pointer to next hexagon */
    };
    
    struct zint_render {
        float width, height;
        struct zint_render_line *lines; /* Pointer to first line */
        struct zint_render_string *strings; /* Pointer to first string */
        struct zint_render_ring *rings; /* Pointer to first ring */
        struct zint_render_hexagon *hexagons; /* Pointer to first hexagon */
    };
    
    struct zint_vector {
        float width, height;
        struct zint_vector_rect *rectangles; /* Pointer to first rectangle */
        struct zint_vector_hexagon *hexagons; /* Pointer to first hexagon */
        struct zint_vector_string *strings; /* Points to first string */
        struct zint_vector_circle *circles; /* Points to first circle */
    };







>












|













|


















|









|







|







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    SUCH DAMAGE.
 */
/* vim: set ts=4 sw=4 et : */

#ifndef ZINT_H
#define ZINT_H

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

    struct zint_render_line {
        float x, y, length, width;
        struct zint_render_line *next; /* Pointer to next line */
    };

    struct zint_vector_rect {
        float x, y, height, width;
        int colour;
        struct zint_vector_rect *next;
    };

    struct zint_render_string {
        float x, y, fsize;
        float width; /* Suggested string width, may be 0 if none recommended */
        int length;
        unsigned char *text;
        struct zint_render_string *next; /* Pointer to next character */
    };

    struct zint_vector_string {
        float x, y, fsize;
        float width; /* Suggested string width, may be 0 if none recommended */
        int length;
        unsigned char *text;
        struct zint_vector_string *next; /* Pointer to next character */
    };

    struct zint_render_ring {
        float x, y, radius, line_width;
        struct zint_render_ring *next; /* Pointer to next ring */
    };

    struct zint_vector_circle {
        float x, y, diameter;
        int colour;
        struct zint_vector_circle *next; /* Pointer to next circle */
    };

    struct zint_render_hexagon {
        float x, y, height;
        struct zint_render_hexagon *next; /* Pointer to next hexagon */
    };

    struct zint_vector_hexagon {
        float x, y, diameter;
        struct zint_vector_hexagon *next; /* Pointer to next hexagon */
    };

    struct zint_render {
        float width, height;
        struct zint_render_line *lines; /* Pointer to first line */
        struct zint_render_string *strings; /* Pointer to first string */
        struct zint_render_ring *rings; /* Pointer to first ring */
        struct zint_render_hexagon *hexagons; /* Pointer to first hexagon */
    };

    struct zint_vector {
        float width, height;
        struct zint_vector_rect *rectangles; /* Pointer to first rectangle */
        struct zint_vector_hexagon *hexagons; /* Pointer to first hexagon */
        struct zint_vector_string *strings; /* Points to first string */
        struct zint_vector_circle *circles; /* Points to first circle */
    };
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244

245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289




290
291
292
293
294
295
296
        float dot_size;
        struct zint_vector *vector;
        struct zint_render *rendered;
        int debug;
    };

#define ZINT_VERSION_MAJOR      2
#define ZINT_VERSION_MINOR      6
#define ZINT_VERSION_RELEASE    5

    /* Tbarcode 7 codes */
#define BARCODE_CODE11		1
#define BARCODE_C25MATRIX	2
#define BARCODE_C25INTER	3
#define BARCODE_C25IATA		4
#define BARCODE_C25LOGIC	6
#define BARCODE_C25IND		7
#define BARCODE_CODE39		8
#define BARCODE_EXCODE39	9
#define BARCODE_EANX		13
#define BARCODE_EANX_CHK        14
#define BARCODE_EAN128		16
#define BARCODE_CODABAR		18
#define BARCODE_CODE128		20
#define BARCODE_DPLEIT		21
#define BARCODE_DPIDENT		22
#define BARCODE_CODE16K		23
#define BARCODE_CODE49		24
#define BARCODE_CODE93		25
#define BARCODE_FLAT		28
#define BARCODE_RSS14		29
#define BARCODE_RSS_LTD		30
#define BARCODE_RSS_EXP		31
#define BARCODE_TELEPEN		32
#define BARCODE_UPCA		34
#define BARCODE_UPCA_CHK        35
#define BARCODE_UPCE		37
#define BARCODE_UPCE_CHK        38
#define BARCODE_POSTNET		40
#define BARCODE_MSI_PLESSEY	47
#define BARCODE_FIM		49
#define BARCODE_LOGMARS		50
#define BARCODE_PHARMA		51
#define BARCODE_PZN		52
#define BARCODE_PHARMA_TWO	53
#define BARCODE_PDF417		55
#define BARCODE_PDF417TRUNC	56
#define BARCODE_MAXICODE	57
#define BARCODE_QRCODE		58
#define BARCODE_CODE128B	60
#define BARCODE_AUSPOST		63
#define BARCODE_AUSREPLY	66
#define BARCODE_AUSROUTE	67
#define BARCODE_AUSREDIRECT	68
#define BARCODE_ISBNX		69
#define BARCODE_RM4SCC		70
#define BARCODE_DATAMATRIX	71
#define BARCODE_EAN14		72
#define BARCODE_VIN             73
#define BARCODE_CODABLOCKF	74
#define BARCODE_NVE18		75
#define BARCODE_JAPANPOST	76
#define BARCODE_KOREAPOST	77
#define BARCODE_RSS14STACK	79
#define BARCODE_RSS14STACK_OMNI	80
#define BARCODE_RSS_EXPSTACK	81
#define BARCODE_PLANET		82
#define BARCODE_MICROPDF417	84
#define BARCODE_ONECODE		85
#define BARCODE_PLESSEY		86

    /* Tbarcode 8 codes */
#define BARCODE_TELEPEN_NUM	87
#define BARCODE_ITF14		89
#define BARCODE_KIX		90
#define BARCODE_AZTEC		92
#define BARCODE_DAFT		93
#define BARCODE_MICROQR		97

    /* Tbarcode 9 codes */
#define BARCODE_HIBC_128	98
#define BARCODE_HIBC_39		99
#define BARCODE_HIBC_DM		102
#define BARCODE_HIBC_QR		104
#define BARCODE_HIBC_PDF	106
#define BARCODE_HIBC_MICPDF	108
#define BARCODE_HIBC_BLOCKF	110
#define BARCODE_HIBC_AZTEC	112

    /* Tbarcode 10 codes */
#define BARCODE_DOTCODE         115
#define BARCODE_HANXIN          116
    
    /*Tbarcode 11 codes*/
#define BARCODE_MAILMARK        121

    /* Zint specific */
#define BARCODE_AZRUNE		128
#define BARCODE_CODE32		129
#define BARCODE_EANX_CC		130
#define BARCODE_EAN128_CC	131
#define BARCODE_RSS14_CC	132
#define BARCODE_RSS_LTD_CC	133
#define BARCODE_RSS_EXP_CC	134
#define BARCODE_UPCA_CC		135
#define BARCODE_UPCE_CC		136
#define BARCODE_RSS14STACK_CC	137
#define BARCODE_RSS14_OMNI_CC	138
#define BARCODE_RSS_EXPSTACK_CC	139
#define BARCODE_CHANNEL		140
#define BARCODE_CODEONE		141
#define BARCODE_GRIDMATRIX	142
#define BARCODE_UPNQR           143
#define BARCODE_ULTRA       144


// Output options
#define BARCODE_NO_ASCII	1
#define BARCODE_BIND		2
#define BARCODE_BOX		4
#define BARCODE_STDOUT		8
#define READER_INIT		16
#define SMALL_TEXT		32
#define BOLD_TEXT               64
#define CMYK_COLOUR             128
#define BARCODE_DOTTY_MODE      256
#define GS1_GS_SEPARATOR        512

// Input data types
#define DATA_MODE	0
#define UNICODE_MODE	1
#define GS1_MODE	2
#define ESCAPE_MODE     8

// Data Matrix specific options
#define DM_SQUARE	100
#define DM_DMRE	        101

// Warning and error conditions
#define ZINT_WARN_INVALID_OPTION	2
#define ZINT_WARN_USES_ECI              3
#define ZINT_ERROR_TOO_LONG		5
#define ZINT_ERROR_INVALID_DATA	        6
#define ZINT_ERROR_INVALID_CHECK	7
#define ZINT_ERROR_INVALID_OPTION	8
#define ZINT_ERROR_ENCODING_PROBLEM	9
#define ZINT_ERROR_FILE_ACCESS	        10
#define ZINT_ERROR_MEMORY		11

// Raster file types
#define OUT_BUFFER          0
#define OUT_SVG_FILE        10
#define OUT_EPS_FILE        20
#define OUT_EMF_FILE        30
#define	OUT_PNG_FILE        100
#define	OUT_BMP_FILE        120
#define OUT_GIF_FILE        140
#define OUT_PCX_FILE        160
#define OUT_JPG_FILE        180
#define OUT_TIF_FILE        200





#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_MSC_VER)
#if defined (DLL_EXPORT) || defined(PIC) || defined(_USRDLL)
#define ZINT_EXTERN __declspec(dllexport)
#elif defined(ZINT_DLL)
#define ZINT_EXTERN __declspec(dllimport)
#else







|
|


|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|

|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|


|
|
|
|
|
|


|
|
|
|
|
|
|
|




|




|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
>


|
|
|
|
|
|






|
|
|
|


|
|


|

|

|
|
|
|
|


|
|
|
|
|
|
|
|
|
|
>
>
>
>







132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
        float dot_size;
        struct zint_vector *vector;
        struct zint_render *rendered;
        int debug;
    };

#define ZINT_VERSION_MAJOR      2
#define ZINT_VERSION_MINOR      7
#define ZINT_VERSION_RELEASE    0

    /* Tbarcode 7 codes */
#define BARCODE_CODE11          1
#define BARCODE_C25MATRIX       2
#define BARCODE_C25INTER        3
#define BARCODE_C25IATA         4
#define BARCODE_C25LOGIC        6
#define BARCODE_C25IND          7
#define BARCODE_CODE39          8
#define BARCODE_EXCODE39        9
#define BARCODE_EANX            13
#define BARCODE_EANX_CHK        14
#define BARCODE_EAN128          16
#define BARCODE_CODABAR         18
#define BARCODE_CODE128         20
#define BARCODE_DPLEIT          21
#define BARCODE_DPIDENT         22
#define BARCODE_CODE16K         23
#define BARCODE_CODE49          24
#define BARCODE_CODE93          25
#define BARCODE_FLAT            28
#define BARCODE_RSS14           29
#define BARCODE_RSS_LTD         30
#define BARCODE_RSS_EXP         31
#define BARCODE_TELEPEN         32
#define BARCODE_UPCA            34
#define BARCODE_UPCA_CHK        35
#define BARCODE_UPCE            37
#define BARCODE_UPCE_CHK        38
#define BARCODE_POSTNET         40
#define BARCODE_MSI_PLESSEY     47
#define BARCODE_FIM             49
#define BARCODE_LOGMARS         50
#define BARCODE_PHARMA          51
#define BARCODE_PZN             52
#define BARCODE_PHARMA_TWO      53
#define BARCODE_PDF417          55
#define BARCODE_PDF417TRUNC     56
#define BARCODE_MAXICODE        57
#define BARCODE_QRCODE          58
#define BARCODE_CODE128B        60
#define BARCODE_AUSPOST         63
#define BARCODE_AUSREPLY        66
#define BARCODE_AUSROUTE        67
#define BARCODE_AUSREDIRECT     68
#define BARCODE_ISBNX           69
#define BARCODE_RM4SCC          70
#define BARCODE_DATAMATRIX      71
#define BARCODE_EAN14           72
#define BARCODE_VIN             73
#define BARCODE_CODABLOCKF      74
#define BARCODE_NVE18           75
#define BARCODE_JAPANPOST       76
#define BARCODE_KOREAPOST       77
#define BARCODE_RSS14STACK      79
#define BARCODE_RSS14STACK_OMNI 80
#define BARCODE_RSS_EXPSTACK    81
#define BARCODE_PLANET          82
#define BARCODE_MICROPDF417     84
#define BARCODE_ONECODE         85
#define BARCODE_PLESSEY         86

    /* Tbarcode 8 codes */
#define BARCODE_TELEPEN_NUM     87
#define BARCODE_ITF14           89
#define BARCODE_KIX             90
#define BARCODE_AZTEC           92
#define BARCODE_DAFT            93
#define BARCODE_MICROQR         97

    /* Tbarcode 9 codes */
#define BARCODE_HIBC_128        98
#define BARCODE_HIBC_39         99
#define BARCODE_HIBC_DM         102
#define BARCODE_HIBC_QR         104
#define BARCODE_HIBC_PDF        106
#define BARCODE_HIBC_MICPDF     108
#define BARCODE_HIBC_BLOCKF     110
#define BARCODE_HIBC_AZTEC      112

    /* Tbarcode 10 codes */
#define BARCODE_DOTCODE         115
#define BARCODE_HANXIN          116

    /*Tbarcode 11 codes*/
#define BARCODE_MAILMARK        121

    /* Zint specific */
#define BARCODE_AZRUNE          128
#define BARCODE_CODE32          129
#define BARCODE_EANX_CC         130
#define BARCODE_EAN128_CC       131
#define BARCODE_RSS14_CC        132
#define BARCODE_RSS_LTD_CC      133
#define BARCODE_RSS_EXP_CC      134
#define BARCODE_UPCA_CC         135
#define BARCODE_UPCE_CC         136
#define BARCODE_RSS14STACK_CC   137
#define BARCODE_RSS14_OMNI_CC   138
#define BARCODE_RSS_EXPSTACK_CC 139
#define BARCODE_CHANNEL         140
#define BARCODE_CODEONE         141
#define BARCODE_GRIDMATRIX      142
#define BARCODE_UPNQR           143
#define BARCODE_ULTRA           144
#define BARCODE_RMQR            145

// Output options
#define BARCODE_NO_ASCII        1
#define BARCODE_BIND            2
#define BARCODE_BOX             4
#define BARCODE_STDOUT          8
#define READER_INIT             16
#define SMALL_TEXT              32
#define BOLD_TEXT               64
#define CMYK_COLOUR             128
#define BARCODE_DOTTY_MODE      256
#define GS1_GS_SEPARATOR        512

// Input data types
#define DATA_MODE               0
#define UNICODE_MODE            1
#define GS1_MODE                2
#define ESCAPE_MODE             8

// Data Matrix specific options
#define DM_SQUARE               100
#define DM_DMRE                 101

// Warning and error conditions
#define ZINT_WARN_INVALID_OPTION        2
#define ZINT_WARN_USES_ECI              3
#define ZINT_ERROR_TOO_LONG             5
#define ZINT_ERROR_INVALID_DATA	        6
#define ZINT_ERROR_INVALID_CHECK        7
#define ZINT_ERROR_INVALID_OPTION       8
#define ZINT_ERROR_ENCODING_PROBLEM     9
#define ZINT_ERROR_FILE_ACCESS          10
#define ZINT_ERROR_MEMORY               11

// Raster file types
#define OUT_BUFFER              0
#define OUT_SVG_FILE            10
#define OUT_EPS_FILE            20
#define OUT_EMF_FILE            30
#define OUT_PNG_FILE            100
#define OUT_BMP_FILE            120
#define OUT_GIF_FILE            140
#define OUT_PCX_FILE            160
#define OUT_JPG_FILE            180
#define OUT_TIF_FILE            200

// Debug flags
#define ZINT_DEBUG_PRINT    1
#define ZINT_DEBUG_TEST     2

#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_MSC_VER)
#if defined (DLL_EXPORT) || defined(PIC) || defined(_USRDLL)
#define ZINT_EXTERN __declspec(dllexport)
#elif defined(ZINT_DLL)
#define ZINT_EXTERN __declspec(dllimport)
#else
Changes to jni/zint/backend_qt/backend_qt.pro.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
}

TARGET = QtZint

INCLUDEPATH += ../backend

#EDIT THIS !!!!
DEFINES += ZINT_VERSION="\\\"2.6.5\\\""

!contains(DEFINES, NO_PNG) {
    INCLUDEPATH += ../../lpng
    INCLUDEPATH += ../../zlib
}

contains(DEFINES, QR_SYSTEM){







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
}

TARGET = QtZint

INCLUDEPATH += ../backend

#EDIT THIS !!!!
DEFINES += ZINT_VERSION="\\\"2.7.0\\\""

!contains(DEFINES, NO_PNG) {
    INCLUDEPATH += ../../lpng
    INCLUDEPATH += ../../zlib
}

contains(DEFINES, QR_SYSTEM){
56
57
58
59
60
61
62


63
64
65
66
67
68
69
            ../backend/bmp.h \
            ../backend/code49.h \
            ../backend/common.h \
            ../backend/composite.h \
            ../backend/dmatrix.h \
            ../backend/eci.h \
            ../backend/font.h \


            ../backend/gridmtx.h \
            ../backend/gs1.h \
            ../backend/hanxin.h \
            ../backend/large.h \
            ../backend/maxicode.h \
            ../backend/pcx.h \
            ../backend/pdf417.h \







>
>







56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
            ../backend/bmp.h \
            ../backend/code49.h \
            ../backend/common.h \
            ../backend/composite.h \
            ../backend/dmatrix.h \
            ../backend/eci.h \
            ../backend/font.h \
            ../backend/gb18030.h \
            ../backend/gb2312.h \
            ../backend/gridmtx.h \
            ../backend/gs1.h \
            ../backend/hanxin.h \
            ../backend/large.h \
            ../backend/maxicode.h \
            ../backend/pcx.h \
            ../backend/pdf417.h \
85
86
87
88
89
90
91



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
           ../backend/code49.c \
           ../backend/common.c \
           ../backend/composite.c \
           ../backend/dmatrix.c \
           ../backend/dotcode.c \
           ../backend/eci.c \
           ../backend/emf.c \



           ../backend/gif.c \
           ../backend/gridmtx.c \
           ../backend/gs1.c \
           ../backend/hanxin.c \
           ../backend/imail.c \
           ../backend/large.c \
           ../backend/library.c \
           ../backend/mailmark.c \
           ../backend/maxicode.c \
           ../backend/medical.c \
           ../backend/pcx.c \
           ../backend/pdf417.c \
           ../backend/plessey.c \
           ../backend/postal.c \
           ../backend/ps.c \
           ../backend/raster.c \
           ../backend/reedsol.c \
            ../backend/render.c \
           ../backend/rss.c \
           ../backend/svg.c \
           ../backend/telepen.c \
           ../backend/tif.c \
           ../backend/ultra.c \
           ../backend/upcean.c \
           ../backend/vector.c \
           ../backend/qr.c \
           ../backend/dllversion.c \
           ../backend/code1.c \
           ../backend/png.c \
           qzint.cpp

VERSION = 2.6.5

#DESTDIR = .

#include.path = $$[ZINT_INSTALL_HEADERS]
include.path = inst/include
include.files = ../backend/zint.h qzint.h

#target.path = $$[ZINT_INSTALL_LIBS]
target.path = inst/lib

INSTALLS += target include








>
>
>

















|
|












|












87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
           ../backend/code49.c \
           ../backend/common.c \
           ../backend/composite.c \
           ../backend/dmatrix.c \
           ../backend/dotcode.c \
           ../backend/eci.c \
           ../backend/emf.c \
           ../backend/gb18030.c \
           ../backend/gb2312.c \
           ../backend/general_field.c \
           ../backend/gif.c \
           ../backend/gridmtx.c \
           ../backend/gs1.c \
           ../backend/hanxin.c \
           ../backend/imail.c \
           ../backend/large.c \
           ../backend/library.c \
           ../backend/mailmark.c \
           ../backend/maxicode.c \
           ../backend/medical.c \
           ../backend/pcx.c \
           ../backend/pdf417.c \
           ../backend/plessey.c \
           ../backend/postal.c \
           ../backend/ps.c \
           ../backend/raster.c \
           ../backend/reedsol.c \
           ../backend/rss.c \
           ../backend/sjis.c \
           ../backend/svg.c \
           ../backend/telepen.c \
           ../backend/tif.c \
           ../backend/ultra.c \
           ../backend/upcean.c \
           ../backend/vector.c \
           ../backend/qr.c \
           ../backend/dllversion.c \
           ../backend/code1.c \
           ../backend/png.c \
           qzint.cpp

VERSION = 2.7.0

#DESTDIR = .

#include.path = $$[ZINT_INSTALL_HEADERS]
include.path = inst/include
include.files = ../backend/zint.h qzint.h

#target.path = $$[ZINT_INSTALL_LIBS]
target.path = inst/lib

INSTALLS += target include

Changes to jni/zint/backend_qt/backend_vc8.pro.
20
21
22
23
24
25
26

27
28
29
30
31
32
33
HEADERS +=  ../backend/aztec.h \
            ../backend/code1.h \
            ../backend/code49.h \
            ../backend/common.h \
            ../backend/composite.h \
            ../backend/dmatrix.h \
            ../backend/font.h \

            ../backend/gb2312.h \
            ../backend/gridmtx.h \
            ../backend/gs1.h \
            ../backend/large.h \
            ../backend/maxicode.h \
            ../backend/maxihex.h \
            ../backend/ms_stdint.h \







>







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
HEADERS +=  ../backend/aztec.h \
            ../backend/code1.h \
            ../backend/code49.h \
            ../backend/common.h \
            ../backend/composite.h \
            ../backend/dmatrix.h \
            ../backend/font.h \
            ../backend/gb18030.h \
            ../backend/gb2312.h \
            ../backend/gridmtx.h \
            ../backend/gs1.h \
            ../backend/large.h \
            ../backend/maxicode.h \
            ../backend/maxihex.h \
            ../backend/ms_stdint.h \
46
47
48
49
50
51
52


53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
           ../backend/code1.c \
           ../backend/code128.c \
           ../backend/code16k.c \
           ../backend/code49.c \
           ../backend/common.c \
           ../backend/composite.c \
           ../backend/dmatrix.c \


           ../backend/gridmtx.c \
           ../backend/gs1.c \
           ../backend/imail.c \
           ../backend/large.c \
           ../backend/library.c \
           ../backend/maxicode.c \
           ../backend/medical.c \
           ../backend/pdf417.c \
           ../backend/plessey.c \
           ../backend/postal.c \
           ../backend/ps.c \
           ../backend/qr.c \
           ../backend/reedsol.c \
           ../backend/render.c \
           ../backend/rss.c \
           ../backend/svg.c \
           ../backend/telepen.c \
           ../backend/upcean.c \
           qzint.cpp







>
>













<





47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

69
70
71
72
73
           ../backend/code1.c \
           ../backend/code128.c \
           ../backend/code16k.c \
           ../backend/code49.c \
           ../backend/common.c \
           ../backend/composite.c \
           ../backend/dmatrix.c \
           ../backend/gb18030.c \
           ../backend/gb2312.c \
           ../backend/gridmtx.c \
           ../backend/gs1.c \
           ../backend/imail.c \
           ../backend/large.c \
           ../backend/library.c \
           ../backend/maxicode.c \
           ../backend/medical.c \
           ../backend/pdf417.c \
           ../backend/plessey.c \
           ../backend/postal.c \
           ../backend/ps.c \
           ../backend/qr.c \
           ../backend/reedsol.c \

           ../backend/rss.c \
           ../backend/svg.c \
           ../backend/telepen.c \
           ../backend/upcean.c \
           qzint.cpp
Changes to jni/zint/backend_qt/qzint.cpp.
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
namespace Zint {
    static const char* fontstyle = "Arial";
    static const int fontPixelSizeSmall = 8;
    static const int fontPixelSizeLarge = 12;

    QZint::QZint() {
        m_symbol = BARCODE_CODE128;
        m_height = 50;
        m_border = NO_BORDER;
        m_borderWidth = 0;
        m_securityLevel = -1;
        m_pdf417CodeWords = 928;
        m_fgColor = Qt::black;
        m_bgColor = Qt::white;
        m_zintSymbol = 0;
        m_error = 0;
        m_input_mode = UNICODE_MODE + ESCAPE_MODE;
        m_scale = 1.0;
        m_option_3 = 0;







|



<







23
24
25
26
27
28
29
30
31
32
33

34
35
36
37
38
39
40
namespace Zint {
    static const char* fontstyle = "Arial";
    static const int fontPixelSizeSmall = 8;
    static const int fontPixelSizeLarge = 12;

    QZint::QZint() {
        m_symbol = BARCODE_CODE128;
        m_height = 0;
        m_border = NO_BORDER;
        m_borderWidth = 0;
        m_securityLevel = -1;

        m_fgColor = Qt::black;
        m_bgColor = Qt::white;
        m_zintSymbol = 0;
        m_error = 0;
        m_input_mode = UNICODE_MODE + ESCAPE_MODE;
        m_scale = 1.0;
        m_option_3 = 0;
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
        m_zintSymbol->option_2 = m_width;
        m_zintSymbol->dot_size = m_dot_size;
        if (m_hidetext) {
            m_zintSymbol->show_hrt = 0;
        } else {
            m_zintSymbol->show_hrt = 1;
        }
        if (m_symbol == BARCODE_PDF417) {
            m_zintSymbol->option_3 = m_pdf417CodeWords;
        } else {
            m_zintSymbol->option_3 = m_option_3;
        }
        QByteArray bstr = m_text.toUtf8();
        QByteArray pstr = m_primaryMessage.left(99).toLatin1();
        strcpy(m_zintSymbol->primary, pstr.data());
        m_error = ZBarcode_Encode_and_Buffer_Vector(m_zintSymbol, (unsigned char*) bstr.data(), bstr.length(), 0);
        m_lastError = m_zintSymbol->errtxt;

        switch (m_zintSymbol->output_options) {







<
<
<
|
<







67
68
69
70
71
72
73



74

75
76
77
78
79
80
81
        m_zintSymbol->option_2 = m_width;
        m_zintSymbol->dot_size = m_dot_size;
        if (m_hidetext) {
            m_zintSymbol->show_hrt = 0;
        } else {
            m_zintSymbol->show_hrt = 1;
        }



		m_zintSymbol->option_3 = m_option_3;

        QByteArray bstr = m_text.toUtf8();
        QByteArray pstr = m_primaryMessage.left(99).toLatin1();
        strcpy(m_zintSymbol->primary, pstr.data());
        m_error = ZBarcode_Encode_and_Buffer_Vector(m_zintSymbol, (unsigned char*) bstr.data(), bstr.length(), 0);
        m_lastError = m_zintSymbol->errtxt;

        switch (m_zintSymbol->output_options) {
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
        m_borderWidth = boderWidth;
    }

    void QZint::setWhitespace(int whitespace) {
        m_whitespace = whitespace;
    }

    int QZint::pdf417CodeWords() const {
        return m_pdf417CodeWords;
    }

    void QZint::setPdf417CodeWords(int pdf417CodeWords) {
        m_pdf417CodeWords = pdf417CodeWords;
    }

    int QZint::securityLevel() const {
        return m_securityLevel;
    }

    void QZint::setSecurityLevel(int securityLevel) {
        m_securityLevel = securityLevel;
    }







<
<
<
<
<
<
<
<







181
182
183
184
185
186
187








188
189
190
191
192
193
194
        m_borderWidth = boderWidth;
    }

    void QZint::setWhitespace(int whitespace) {
        m_whitespace = whitespace;
    }









    int QZint::securityLevel() const {
        return m_securityLevel;
    }

    void QZint::setSecurityLevel(int securityLevel) {
        m_securityLevel = securityLevel;
    }
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
        m_zintSymbol->option_2 = m_width;
        m_zintSymbol->dot_size = m_dot_size;
        if (m_hidetext) {
            m_zintSymbol->show_hrt = 0;
        } else {
            m_zintSymbol->show_hrt = 1;
        }
        if (m_symbol == BARCODE_PDF417) {
            m_zintSymbol->option_3 = m_pdf417CodeWords;
        } else {
            m_zintSymbol->option_3 = m_option_3;
        }
        m_zintSymbol->scale = m_scale;
        QByteArray bstr = m_text.toUtf8();
        QByteArray pstr = m_primaryMessage.left(99).toLatin1();
        QByteArray fstr = filename.left(255).toLatin1();
        strcpy(m_zintSymbol->primary, pstr.data());
        strcpy(m_zintSymbol->outfile, fstr.data());
        QByteArray fgcol = fg_colour_hash.right(6).toLatin1();







<
<
<
|
<







232
233
234
235
236
237
238



239

240
241
242
243
244
245
246
        m_zintSymbol->option_2 = m_width;
        m_zintSymbol->dot_size = m_dot_size;
        if (m_hidetext) {
            m_zintSymbol->show_hrt = 0;
        } else {
            m_zintSymbol->show_hrt = 1;
        }



		m_zintSymbol->option_3 = m_option_3;

        m_zintSymbol->scale = m_scale;
        QByteArray bstr = m_text.toUtf8();
        QByteArray pstr = m_primaryMessage.left(99).toLatin1();
        QByteArray fstr = filename.left(255).toLatin1();
        strcpy(m_zintSymbol->primary, pstr.data());
        strcpy(m_zintSymbol->outfile, fstr.data());
        QByteArray fgcol = fg_colour_hash.right(6).toLatin1();
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
        qreal ytr = paintRect.y();
        qreal scale;
        
        qreal gwidth = m_zintSymbol->vector->width;
        qreal gheight = m_zintSymbol->vector->height;

        if (paintRect.width() / gwidth < paintRect.height() / gheight) {
            scale = (qreal) floor(paintRect.width() / gwidth);
        } else {
            scale = (qreal) floor(paintRect.height() / gheight);
        }
        
        xtr += (qreal) (paintRect.width() - gwidth * scale) / 2.0;
        ytr += (qreal) (paintRect.height() - gheight * scale) / 2.0;

        painter.setBackground(QBrush(m_bgColor));
        painter.fillRect(paintRect, QBrush(m_bgColor));







|

|







285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
        qreal ytr = paintRect.y();
        qreal scale;
        
        qreal gwidth = m_zintSymbol->vector->width;
        qreal gheight = m_zintSymbol->vector->height;

        if (paintRect.width() / gwidth < paintRect.height() / gheight) {
            scale = paintRect.width() / gwidth;
        } else {
            scale = paintRect.height() / gheight;
        }
        
        xtr += (qreal) (paintRect.width() - gwidth * scale) / 2.0;
        ytr += (qreal) (paintRect.height() - gheight * scale) / 2.0;

        painter.setBackground(QBrush(m_bgColor));
        painter.fillRect(paintRect, QBrush(m_bgColor));
Changes to jni/zint/backend_qt/qzint.h.
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

    BorderType borderType() const;
	void setBorderType(BorderType border);

    int borderWidth() const;
	void setBorderWidth(int boderWidth);

    int pdf417CodeWords() const;
	void setPdf417CodeWords(int pdf417CodeWords);

    int securityLevel() const;
	void setSecurityLevel(int securityLevel);
        
        int getError();

    float scale() const;
	void setScale(float scale);







<
<
<







61
62
63
64
65
66
67



68
69
70
71
72
73
74

    BorderType borderType() const;
	void setBorderType(BorderType border);

    int borderWidth() const;
	void setBorderWidth(int boderWidth);




    int securityLevel() const;
	void setSecurityLevel(int securityLevel);
        
        int getError();

    float scale() const;
	void setScale(float scale);
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
	QString m_text;
	QString m_primaryMessage;
	int m_height;
	BorderType m_border;
	int m_borderWidth;
	int m_width;
	int m_securityLevel;
	int m_pdf417CodeWords;
	int m_input_mode;
	QColor m_fgColor;
	QColor m_bgColor;
	QString m_lastError;
	int m_error;
	int m_whitespace;
	zint_symbol * m_zintSymbol;







<







104
105
106
107
108
109
110

111
112
113
114
115
116
117
	QString m_text;
	QString m_primaryMessage;
	int m_height;
	BorderType m_border;
	int m_borderWidth;
	int m_width;
	int m_securityLevel;

	int m_input_mode;
	QColor m_fgColor;
	QColor m_bgColor;
	QString m_lastError;
	int m_error;
	int m_whitespace;
	zint_symbol * m_zintSymbol;
Changes to jni/zint/backend_tcl/configure.
1
2
3
4
5
6
7
8
9
10
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.63 for zint 2.6.5.
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## --------------------- ##
## M4sh Initialization.  ##


|







1
2
3
4
5
6
7
8
9
10
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.63 for zint 2.7.0.
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## --------------------- ##
## M4sh Initialization.  ##
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
MFLAGS=
MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}

# Identity of this package.
PACKAGE_NAME='zint'
PACKAGE_TARNAME='zint'
PACKAGE_VERSION='2.6.5'
PACKAGE_STRING='zint 2.6.5'
PACKAGE_BUGREPORT=''

# Factoring default headers for most tests.
ac_includes_default="\
#include <stdio.h>
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>







|
|







590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
MFLAGS=
MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}

# Identity of this package.
PACKAGE_NAME='zint'
PACKAGE_TARNAME='zint'
PACKAGE_VERSION='2.7.0'
PACKAGE_STRING='zint 2.7.0'
PACKAGE_BUGREPORT=''

# Factoring default headers for most tests.
ac_includes_default="\
#include <stdio.h>
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
  # Omit some internal or obsolete options to make the list less imposing.
  # This message is too long to be a string in the A/UX 3.1 sh.
  cat <<_ACEOF
\`configure' configures zint 2.6.5 to adapt to many kinds of systems.

Usage: $0 [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.







|







1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
  # Omit some internal or obsolete options to make the list less imposing.
  # This message is too long to be a string in the A/UX 3.1 sh.
  cat <<_ACEOF
\`configure' configures zint 2.7.0 to adapt to many kinds of systems.

Usage: $0 [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405

  cat <<\_ACEOF
_ACEOF
fi

if test -n "$ac_init_help"; then
  case $ac_init_help in
     short | recursive ) echo "Configuration of zint 2.6.5:";;
   esac
  cat <<\_ACEOF

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]







|







1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405

  cat <<\_ACEOF
_ACEOF
fi

if test -n "$ac_init_help"; then
  case $ac_init_help in
     short | recursive ) echo "Configuration of zint 2.7.0:";;
   esac
  cat <<\_ACEOF

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
    cd "$ac_pwd" || { ac_status=$?; break; }
  done
fi

test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
  cat <<\_ACEOF
zint configure 2.6.5
generated by GNU Autoconf 2.63

Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
  exit
fi
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by zint $as_me 2.6.5, which was
generated by GNU Autoconf 2.63.  Invocation command line was

  $ $0 $@

_ACEOF
exec 5>>config.log
{







|













|







1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
    cd "$ac_pwd" || { ac_status=$?; break; }
  done
fi

test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
  cat <<\_ACEOF
zint configure 2.7.0
generated by GNU Autoconf 2.63

Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
  exit
fi
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by zint $as_me 2.7.0, which was
generated by GNU Autoconf 2.63.  Invocation command line was

  $ $0 $@

_ACEOF
exec 5>>config.log
{
7885
7886
7887
7888
7889
7890
7891

7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904


7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932


    vars="
	../backend/2of5.c
	../backend/auspost.c
	../backend/aztec.c
	../backend/bmp.c

	../backend/codablock.c
	../backend/code128.c
	../backend/code16k.c
	../backend/code1.c
	../backend/code49.c
	../backend/code.c
	../backend/common.c
	../backend/composite.c
	../backend/dllversion.c
	../backend/dmatrix.c
	../backend/dotcode.c
	../backend/eci.c
	../backend/emf.c


	../backend/gif.c
	../backend/gridmtx.c
	../backend/gs1.c
	../backend/hanxin.c
	../backend/imail.c
	../backend/large.c
	../backend/library.c
	../backend/mailmark.c
	../backend/maxicode.c
	../backend/medical.c
	../backend/pcx.c
	../backend/pdf417.c
	../backend/plessey.c
	../backend/png.c
	../backend/postal.c
	../backend/ps.c
	../backend/qr.c
	../backend/raster.c
	../backend/reedsol.c
	../backend/render.c
	../backend/rss.c
	../backend/svg.c
	../backend/telepen.c
	../backend/tif.c
	../backend/upcean.c
	../backend/ultra.c
	../backend/vector.c
	zint.c







>












|
>
>



















|
|







7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935


    vars="
	../backend/2of5.c
	../backend/auspost.c
	../backend/aztec.c
	../backend/bmp.c
	../backend/emf.c
	../backend/codablock.c
	../backend/code128.c
	../backend/code16k.c
	../backend/code1.c
	../backend/code49.c
	../backend/code.c
	../backend/common.c
	../backend/composite.c
	../backend/dllversion.c
	../backend/dmatrix.c
	../backend/dotcode.c
	../backend/eci.c
	../backend/gb18030.c
	../backend/gb2312.c
	../backend/general_field.c
	../backend/gif.c
	../backend/gridmtx.c
	../backend/gs1.c
	../backend/hanxin.c
	../backend/imail.c
	../backend/large.c
	../backend/library.c
	../backend/mailmark.c
	../backend/maxicode.c
	../backend/medical.c
	../backend/pcx.c
	../backend/pdf417.c
	../backend/plessey.c
	../backend/png.c
	../backend/postal.c
	../backend/ps.c
	../backend/qr.c
	../backend/raster.c
	../backend/reedsol.c
	../backend/rss.c
	../backend/sjis.c
	../backend/svg.c
	../backend/telepen.c
	../backend/tif.c
	../backend/upcean.c
	../backend/ultra.c
	../backend/vector.c
	zint.c
12970
12971
12972
12973
12974
12975
12976
12977
12978
12979
12980
12981
12982
12983
12984

exec 6>&1

# Save the log message, to keep $[0] and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by zint $as_me 2.6.5, which was
generated by GNU Autoconf 2.63.  Invocation command line was

  CONFIG_FILES    = $CONFIG_FILES
  CONFIG_HEADERS  = $CONFIG_HEADERS
  CONFIG_LINKS    = $CONFIG_LINKS
  CONFIG_COMMANDS = $CONFIG_COMMANDS
  $ $0 $@







|







12973
12974
12975
12976
12977
12978
12979
12980
12981
12982
12983
12984
12985
12986
12987

exec 6>&1

# Save the log message, to keep $[0] and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by zint $as_me 2.7.0, which was
generated by GNU Autoconf 2.63.  Invocation command line was

  CONFIG_FILES    = $CONFIG_FILES
  CONFIG_HEADERS  = $CONFIG_HEADERS
  CONFIG_LINKS    = $CONFIG_LINKS
  CONFIG_COMMANDS = $CONFIG_COMMANDS
  $ $0 $@
13020
13021
13022
13023
13024
13025
13026
13027
13028
13029
13030
13031
13032
13033
13034
$config_files

Report bugs to <bug-autoconf@gnu.org>."

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
zint config.status 2.6.5
configured by $0, generated by GNU Autoconf 2.63,
  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"

Copyright (C) 2008 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."








|







13023
13024
13025
13026
13027
13028
13029
13030
13031
13032
13033
13034
13035
13036
13037
$config_files

Report bugs to <bug-autoconf@gnu.org>."

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
zint config.status 2.7.0
configured by $0, generated by GNU Autoconf 2.63,
  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"

Copyright (C) 2008 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."

Changes to jni/zint/backend_tcl/configure.in.
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Set your package name and version numbers here.
#
# This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION
# set as provided.  These will also be added as -D defs in your Makefile
# so you can encode the package version directly into the source files.
#-----------------------------------------------------------------------

AC_INIT([zint], [2.6.5])

#--------------------------------------------------------------------
# Call TEA_INIT as the first TEA_ macro to set up initial vars.
# This will define a ${TEA_PLATFORM} variable == "unix" or "windows"
# as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE.
#--------------------------------------------------------------------








|







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Set your package name and version numbers here.
#
# This initializes the environment with PACKAGE_NAME and PACKAGE_VERSION
# set as provided.  These will also be added as -D defs in your Makefile
# so you can encode the package version directly into the source files.
#-----------------------------------------------------------------------

AC_INIT([zint], [2.7.0])

#--------------------------------------------------------------------
# Call TEA_INIT as the first TEA_ macro to set up initial vars.
# This will define a ${TEA_PLATFORM} variable == "unix" or "windows"
# as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE.
#--------------------------------------------------------------------

67
68
69
70
71
72
73

74
75
76
77
78
79
80
81
82
83
84
85
86


87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#-----------------------------------------------------------------------

TEA_ADD_SOURCES([
	../backend/2of5.c
	../backend/auspost.c
	../backend/aztec.c
	../backend/bmp.c

	../backend/codablock.c
	../backend/code128.c
	../backend/code16k.c
	../backend/code1.c
	../backend/code49.c
	../backend/code.c
	../backend/common.c
	../backend/composite.c
	../backend/dllversion.c
	../backend/dmatrix.c
	../backend/dotcode.c
	../backend/eci.c
	../backend/emf.c


	../backend/gif.c
	../backend/gridmtx.c
	../backend/gs1.c
	../backend/hanxin.c
	../backend/imail.c
	../backend/large.c
	../backend/library.c
	../backend/mailmark.c
	../backend/maxicode.c
	../backend/medical.c
	../backend/pcx.c
	../backend/pdf417.c
	../backend/plessey.c
	../backend/png.c
	../backend/postal.c
	../backend/ps.c
	../backend/qr.c
	../backend/raster.c
	../backend/reedsol.c
	../backend/render.c
	../backend/rss.c
	../backend/svg.c
	../backend/telepen.c
	../backend/tif.c
	../backend/upcean.c
	../backend/ultra.c
	../backend/vector.c
	zint.c







>












|
>
>



















|
|







67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#-----------------------------------------------------------------------

TEA_ADD_SOURCES([
	../backend/2of5.c
	../backend/auspost.c
	../backend/aztec.c
	../backend/bmp.c
	../backend/emf.c
	../backend/codablock.c
	../backend/code128.c
	../backend/code16k.c
	../backend/code1.c
	../backend/code49.c
	../backend/code.c
	../backend/common.c
	../backend/composite.c
	../backend/dllversion.c
	../backend/dmatrix.c
	../backend/dotcode.c
	../backend/eci.c
	../backend/gb18030.c
	../backend/gb2312.c
	../backend/general_field.c
	../backend/gif.c
	../backend/gridmtx.c
	../backend/gs1.c
	../backend/hanxin.c
	../backend/imail.c
	../backend/large.c
	../backend/library.c
	../backend/mailmark.c
	../backend/maxicode.c
	../backend/medical.c
	../backend/pcx.c
	../backend/pdf417.c
	../backend/plessey.c
	../backend/png.c
	../backend/postal.c
	../backend/ps.c
	../backend/qr.c
	../backend/raster.c
	../backend/reedsol.c
	../backend/rss.c
	../backend/sjis.c
	../backend/svg.c
	../backend/telepen.c
	../backend/tif.c
	../backend/upcean.c
	../backend/ultra.c
	../backend/vector.c
	zint.c
Changes to jni/zint/backend_tcl/lib/zint/pkgIndex.tcl.
1
2
package ifneeded zint 2.6.5\
    [list load [file join $dir zint[info sharedlibextension]]]
|

1
2
package ifneeded zint 2.7.0\
    [list load [file join $dir zint[info sharedlibextension]]]
Changes to jni/zint/backend_tcl/zint.c.
56
57
58
59
60
61
62
63






64
65
66
67
68
69
70
 2018-11-02 2.6.4 HaO
 -	Framework trunk update
 -	Add options -bold, -dotted, -dotsize, -dmre, -eci
 -	Implemented ECI logic
 2019-09-01 2.6.5 HaO
 -	Framework 2.6.5 update
 -	Add option -gssep
 






*/

#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
#pragma warning(disable : 4201 4214 4514)
#define STRICT
#define WIN32_LEAN_AND_MEAN
/* TCL Defines */







|
>
>
>
>
>
>







56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
 2018-11-02 2.6.4 HaO
 -	Framework trunk update
 -	Add options -bold, -dotted, -dotsize, -dmre, -eci
 -	Implemented ECI logic
 2019-09-01 2.6.5 HaO
 -	Framework 2.6.5 update
 -	Add option -gssep
 2019-09-18 2.6.6 HaO
 -	Framework 2.6.6 update
 2019-10-07 2.6.7 HaO
 -	Framework 2.6.7 update
 2019-12-05 2.7.0 HaO
 -	Framework 2.7.0 update
 -  Add symbology rmqr
*/

#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32)
#pragma warning(disable : 4201 4214 4514)
#define STRICT
#define WIN32_LEAN_AND_MEAN
/* TCL Defines */
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#define EXPORT
#endif


/*----------------------------------------------------------------------------*/
/* > File option defines */

#define VERSION "2.6.5"

/*----------------------------------------------------------------------------*/
/* >>>>> Hepler defines */

#define STRING( x ) #x

/*----------------------------------------------------------------------------*/







|







106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#define EXPORT
#endif


/*----------------------------------------------------------------------------*/
/* > File option defines */

#define VERSION "2.7.0"

/*----------------------------------------------------------------------------*/
/* >>>>> Hepler defines */

#define STRING( x ) #x

/*----------------------------------------------------------------------------*/
215
216
217
218
219
220
221

222
223
224
225
226
227
228
    "RSS14Stacked-CC",
    "RSS14Omni-CC",
    "RSSExpandedStacked-CC",
    "Channel",
    "CodeOne",
    "GridMatrix",
    "UPNQR",

    NULL};

static int s_code_number[] = {
    BARCODE_CODE11,
    BARCODE_C25MATRIX,
    BARCODE_C25INTER,
    BARCODE_C25IATA,







>







221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
    "RSS14Stacked-CC",
    "RSS14Omni-CC",
    "RSSExpandedStacked-CC",
    "Channel",
    "CodeOne",
    "GridMatrix",
    "UPNQR",
    "rMQR",
    NULL};

static int s_code_number[] = {
    BARCODE_CODE11,
    BARCODE_C25MATRIX,
    BARCODE_C25INTER,
    BARCODE_C25IATA,
310
311
312
313
314
315
316

317
318
319
320
321
322
323
    BARCODE_RSS14STACK_CC,
    BARCODE_RSS14_OMNI_CC,
    BARCODE_RSS_EXPSTACK_CC,
    BARCODE_CHANNEL,
    BARCODE_CODEONE,
    BARCODE_GRIDMATRIX,
    BARCODE_UPNQR,

    0};

/* ECI TCL encoding names.
 * The ECI comments are given after the name.
 * A ** indicates encodings where native data must be delivered and not utf-8
 */
static char *s_eci_list[] = {







>







317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
    BARCODE_RSS14STACK_CC,
    BARCODE_RSS14_OMNI_CC,
    BARCODE_RSS_EXPSTACK_CC,
    BARCODE_CHANNEL,
    BARCODE_CODEONE,
    BARCODE_GRIDMATRIX,
    BARCODE_UPNQR,
    BARCODE_RMQR,
    0};

/* ECI TCL encoding names.
 * The ECI comments are given after the name.
 * A ** indicates encodings where native data must be delivered and not utf-8
 */
static char *s_eci_list[] = {
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
};


/* Version information */
static char version_string[] = VERSION;
/* Help text */
static char help_message[] = "zint tcl(stub,obj) dll\n"
    "(c) 2018-11-02 Harald Oehlmann\n"
    " Generate barcode in tk images\n"
    "Usage:\n"
    " zint encode data photo option value...\n"
    "  data: data to encode in the symbol\n"
    "  photo: a tcl photo image handle ('p' after 'image create photo p')\n"
    "  Available options:\n"
    "   -barcode choice: symbology, use 'zint symbology' to get a list\n"







<







373
374
375
376
377
378
379

380
381
382
383
384
385
386
};


/* Version information */
static char version_string[] = VERSION;
/* Help text */
static char help_message[] = "zint tcl(stub,obj) dll\n"

    " Generate barcode in tk images\n"
    "Usage:\n"
    " zint encode data photo option value...\n"
    "  data: data to encode in the symbol\n"
    "  photo: a tcl photo image handle ('p' after 'image create photo p')\n"
    "  Available options:\n"
    "   -barcode choice: symbology, use 'zint symbology' to get a list\n"
Changes to jni/zint/backend_tcl/zint_tcl.dsp.
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\backend" /I "C:\myprograms\tcl8.5\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /D "NO_PNG" /FR /YX /FD /D ZINT_VERSION="\"2.6.1\"" /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo







|







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\backend" /I "C:\myprograms\tcl8.5\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /D "NO_PNG" /FR /YX /FD /D ZINT_VERSION="\"2.7.0\"" /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\backend" /I "C:\myprograms\tcl8.5\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /D "NO_PNG" /FR /YX /FD /GZ /D ZINT_VERSION="\"2.6.1\"" /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo







|







65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\backend" /I "C:\myprograms\tcl8.5\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZINT_TCL_EXPORTS" /D "NO_PNG" /FR /YX /FD /GZ /D ZINT_VERSION="\"2.7.0\"" /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
151
152
153
154
155
156
157












158
159
160
161
162
163
164
SOURCE=..\backend\eci.c
# End Source File
# Begin Source File

SOURCE=..\backend\emf.c
# End Source File
# Begin Source File













SOURCE=..\backend\gif.c
# End Source File
# Begin Source File

SOURCE=..\backend\gridmtx.c
# End Source File







>
>
>
>
>
>
>
>
>
>
>
>







151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
SOURCE=..\backend\eci.c
# End Source File
# Begin Source File

SOURCE=..\backend\emf.c
# End Source File
# Begin Source File

SOURCE=..\backend\gb18030.c
# End Source File
# Begin Source File

SOURCE=..\backend\gb2312.c
# End Source File
# Begin Source File

SOURCE=..\backend\general_field.c
# End Source File
# Begin Source File

SOURCE=..\backend\gif.c
# End Source File
# Begin Source File

SOURCE=..\backend\gridmtx.c
# End Source File
228
229
230
231
232
233
234
235
236
237
238
239
240
241




242
243
244
245
246
247
248
# End Source File
# Begin Source File

SOURCE=..\backend\reedsol.c
# End Source File
# Begin Source File

SOURCE=..\backend\render.c
# End Source File
# Begin Source File

SOURCE=..\backend\rss.c
# End Source File
# Begin Source File





SOURCE=..\backend\svg.c
# End Source File
# Begin Source File

SOURCE=..\backend\telepen.c
# End Source File







<
<
<
<



>
>
>
>







240
241
242
243
244
245
246




247
248
249
250
251
252
253
254
255
256
257
258
259
260
# End Source File
# Begin Source File

SOURCE=..\backend\reedsol.c
# End Source File
# Begin Source File





SOURCE=..\backend\rss.c
# End Source File
# Begin Source File

SOURCE=..\backend\sjis.c
# End Source File
# Begin Source File

SOURCE=..\backend\svg.c
# End Source File
# Begin Source File

SOURCE=..\backend\telepen.c
# End Source File
Changes to jni/zint/docs/manual.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127

128

129

130
131
132
133
134
135
136
*******************************************************************************
* For reference the following is a text-only version of the Zint manual.      *
* The full version can be accessed at http://zint.org.uk/Manual.aspx          *
*******************************************************************************

Zint Barcode Generator and Zint Barcode Studio User Manual
==========================================================

1. Introduction
===============
The Zint project aims to provide a complete cross-platform open source barcode
generating solution. The package currently consists of a Qt based GUI, a 
command line executable and a library with an API to allow developers access to 
the capabilities of Zint. It is hoped that Zint provides a solution which is 
flexible enough for professional users while at the same time takes care of as 
much of the processing as possible to allow easy translation from input data to 
barcode image. 

The library which forms the main component of the Zint project is currently 
able to encode data in over 50 barcode symbologies (types of barcode), for each 
of which it is possible to translate that data from either Unicode (UTF-8) or a 
raw 8-bit data stream. The image can be rendered as either a Portable Network 
Graphic (PNG) image, Windows Bitmap (BMP), Graphics Interchange Format (GIF), 
ZSoft Paintbrush image (PCX), as Encapsulated Post Script (EPS) or as a 
Scalable Vector Graphic (SVG). Many options are available for setting the 
characteristics of the output image including the size and colour of the image, 
the amount of error correction used in the symbol and, in the case of raster 
images, the orientation of the image. 

1.1 Terms of Reference
----------------------
Some of the words and phrases used in this document are specific to barcoding,
and so a brief explanation is given to help understanding:

symbol: A symbol is an image which encodes data according to one of the
        standards. This encompases barcodes (linear symbols) as well as any of
        the other methods of representing data used in this program.
        
symbology: A method of encoding data to create a certain type of symbol.

linear: A linear symbol is one which consists of bars and spaces, and is what
        most people associate with the term "barcode". Examples include EAN.
        
stacked: A stacked symbol consists of multiple linear symbols placed one above
        another and which together hold the message, usually allong side some
        error correction data. Examples include PDF417.
        
matrix: A matrix symbol is one based on a (usually square) grid of elements.
        Examples include Data Matrix, but Maxicode and DotCode are also
        considered matrix symbologies.
        
x-dimension: The x-dimension of a symbol is size (usually the width) of the
        smallest element. For a linear symbology this is the width of the
        smallest bar. The default size of the x-dimension in a raster image
        is 2 pixels. Many symbologies have a fixed width-to-height ratio where
        the height is expressed as a multiple of the x-dimension.
        
composite: A composite symbology is one which is made up of elements which are
        both linear and stacked. Those currently supported are made up of a
        linear "primary" message above which is printed a stacked component
        based on the PDF417 symbology. These symbols also have a separator
        which seperates the linear and the stacked components.
        
GS-1 data: This is a structured way of representing information which consists
        of "chunks" of data, each of which starts with an Application
        Identifier. The AI identifies what type of information is being
        encoded. See Appendix C.
        
Reader Initialisation: Some symbologies allow a special character to be included
        which can be detected by the scanning equipment as signifying that the
        data is used to program or change settings in that equipment. This data
        is usually not passed on to the software which handles normal input
        data. This feature should only be used if you are familiar with the
        programming codes relevant to your scanner.
        
ECI:    The ECI mechanism allows for multi-language data to be encoded in
        symbols which would usually support only Latin-1 characters. This can
        be useful, for example, if you need to encode cyrillic characters, but
        should be used with caution as not all scanners support this method.

2. Installing Zint
==================

2.1 Linux
---------
The easiest way to configure compilation is to take advantage of the CMake 
utilities. You will need to install CMake and libpng first. Note that you will 
need both libpng and libpng-devel packages. If you want to take advantage of 
Zint Barcode Studio you will also need the Qt libraries pre-installed.

Once you have fulfilled these requirements unzip the source code tarball and 
follow these steps in the top directory:

mkdir build
cd build
cmake ..
make
make install

The command line program can be accessed by typing

zint {options} -d {data}

Notice that the data needs to be entered after all other options. Any options 
given after the data will be ignored. The GUI can be accessed by typing

zint-qt

To test that the installation has been successful a shell script is included in 
the /frontend folder. To run the test type

./test.sh

This should create numerous files showing the many modes of operation which are 
available from Zint.

2.2 Microsoft Windows
---------------------
To run Zint Barcode Studio on Windows simply download and run the installation 
executable and follow the instructions on-screen.

2.3 Apple macOS
---------------
Zint can be compiled on macOS from the command line using the same steps as shown 
for Linux above. Currently the Zint Barcode Studio GUI is not known to work on 
macOS. The Zint developers do not currently have access to Apple hardware and
so are not able to provide support or binaries for macOS. If you are a macOS

developer, however, or if you have any success in building Zint on macOS, we

would love to hear from you.


2.4 zint tcl backend
--------------------
The tcl backend may be build using the provided TEA build on Linux, Windows,
Mac-OS and Android. For Windows, a MS-VC6 makefile is also available.

3. Using Zint Barcode Studio











|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|







|

|




|

|

|



|





|




|
|



|
|






|


|







|
|
|


|












|




|




|




|




|
|
|
|
>
|
>
|
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
*******************************************************************************
* For reference the following is a text-only version of the Zint manual.      *
* The full version can be accessed at http://zint.org.uk/Manual.aspx          *
*******************************************************************************

Zint Barcode Generator and Zint Barcode Studio User Manual
==========================================================

1. Introduction
===============
The Zint project aims to provide a complete cross-platform open source barcode
generating solution. The package currently consists of a Qt based GUI, a
command line executable and a library with an API to allow developers access to
the capabilities of Zint. It is hoped that Zint provides a solution which is
flexible enough for professional users while at the same time takes care of as
much of the processing as possible to allow easy translation from input data to
barcode image.

The library which forms the main component of the Zint project is currently
able to encode data in over 50 barcode symbologies (types of barcode), for each
of which it is possible to translate that data from either Unicode (UTF-8) or a
raw 8-bit data stream. The image can be rendered as either a Portable Network
Graphic (PNG) image, Windows Bitmap (BMP), Graphics Interchange Format (GIF),
ZSoft Paintbrush image (PCX), as Encapsulated Post Script (EPS) or as a
Scalable Vector Graphic (SVG). Many options are available for setting the
characteristics of the output image including the size and colour of the image,
the amount of error correction used in the symbol and, in the case of raster
images, the orientation of the image.

1.1 Terms of Reference
----------------------
Some of the words and phrases used in this document are specific to barcoding,
and so a brief explanation is given to help understanding:

symbol: A symbol is an image which encodes data according to one of the
        standards. This encompasses barcodes (linear symbols) as well as any of
        the other methods of representing data used in this program.

symbology: A method of encoding data to create a certain type of symbol.

linear: A linear symbol is one which consists of bars and spaces, and is what
        most people associate with the term "barcode". Examples include EAN.

stacked: A stacked symbol consists of multiple linear symbols placed one above
        another and which together hold the message, usually alongside some
        error correction data. Examples include PDF417.

matrix: A matrix symbol is one based on a (usually square) grid of elements.
        Examples include Data Matrix, but Maxicode and DotCode are also
        considered matrix symbologies.

x-dimension: The x-dimension of a symbol is size (usually the width) of the
        smallest element. For a linear symbology this is the width of the
        smallest bar. The default size of the x-dimension in a raster image
        is 2 pixels. Many symbologies have a fixed width-to-height ratio where
        the height is expressed as a multiple of the x-dimension.

composite: A composite symbology is one which is made up of elements which are
        both linear and stacked. Those currently supported are made up of a
        linear "primary" message above which is printed a stacked component
        based on the PDF417 symbology. These symbols also have a separator
        which separates the linear and the stacked components.

GS-1 data: This is a structured way of representing information which consists
        of "chunks" of data, each of which starts with an Application
        Identifier. The AI identifies what type of information is being
        encoded.

Reader Initialisation: Some symbologies allow a special character to be included
        which can be detected by the scanning equipment as signifying that the
        data is used to program or change settings in that equipment. This data
        is usually not passed on to the software which handles normal input
        data. This feature should only be used if you are familiar with the
        programming codes relevant to your scanner.

ECI:    The ECI mechanism allows for multi-language data to be encoded in
        symbols which would usually support only Latin-1 characters. This can
        be useful, for example, if you need to encode Cyrillic characters, but
        should be used with caution as not all scanners support this method.

2. Installing Zint
==================

2.1 Linux
---------
The easiest way to configure compilation is to take advantage of the CMake
utilities. You will need to install CMake and libpng first. Note that you will
need both libpng and libpng-devel packages. If you want to take advantage of
Zint Barcode Studio you will also need the Qt libraries pre-installed.

Once you have fulfilled these requirements unzip the source code tarball and
follow these steps in the top directory:

mkdir build
cd build
cmake ..
make
make install

The command line program can be accessed by typing

zint {options} -d {data}

Notice that the data needs to be entered after all other options. Any options
given after the data will be ignored. The GUI can be accessed by typing

zint-qt

To test that the installation has been successful a shell script is included in
the /frontend folder. To run the test type

./test.sh

This should create numerous files showing the many modes of operation which are
available from Zint.

2.2 Microsoft Windows
---------------------
To run Zint Barcode Studio on Windows simply download and run the installation
executable and follow the instructions on-screen.

2.3 Apple macOS
---------------
Zint can be installed using Homebrew. To install homebrew input the following
line into the MacOS terminal

/usr/bin/ruby -e "$(curl -fsSL
         https://raw.githubusercontent.com/Homebrew/install/master/install)"

Once homebrew is installed use the following command to install Zint.

brew install zint 

2.4 zint tcl backend
--------------------
The tcl backend may be build using the provided TEA build on Linux, Windows,
Mac-OS and Android. For Windows, a MS-VC6 makefile is also available.

3. Using Zint Barcode Studio
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234

(The rest of this section of the manual involves use of the GUI, so has been
removed from this text-only version)


4. Using the Command Line
=========================
This section describes how to encode data using the command line front end 
program. The examples given are for the Linux platform, but the same options
are available for Windows - just rememer to include the executable file
extension. i.e.:

zint.exe -d "This Text"


4.1 Inputting data
------------------
The data to encode can be entered at the command line using the -d option, for 
example 

zint -d "This Text"

This will encode the text "This Text". Zint will use the default symbology, 
Code 128, and output to the default file out.png in the current directory. 
Alternatively, if libpng was not present when Zint was built, the default
output file will be out.gif. The -d switch and the input data should always
be the last entry on the command line input. Any options given after this
will be ignored. 

The data input to Zint is assumed to be encoded in Unicode (UTF-8) format. If 
you are encoding characters beyond the 7-bit ASCII set using a scheme other than 
Unicode then you will need to set the appropriate input options as shown in 
section 4.11 below. 

Non-printing characters can be entered on the command line using the backslash 
(\) as an escape character in combination with the --esc switch. Permissible
characters are shown in the table below. 

--------------------------------------------------------------------
Escape Character  |  ASCII Equivalent  |  Interpretation
--------------------------------------------------------------------
\0                |  0x00              |  Null
\E                |  0x04              |  End of Transmission
\a                |  0x07              |  Bell
\b                |  0x08              |  Backspace
\t                |  0x09              |  Horizontal Tab
\n                |  0x0A              |  Line Feed
\v                |  0x0B              |  Vertical Tab
\f                |  0x0C              |  Form Feed
\r                |  0x0D              |  Carriage Return
\e                |  0x1B              |  Escape
\G                |  0x1D              |  Group Selector
\R                |  0x1E              |  Record Selector
\xNN              |  0xNN              |  Any other 8-bit character
                  |                    |     where NN is hexadecimal
--------------------------------------------------------------------

Input data can be read directly from file using the -i switch as shown below. 
The input file is assumed to be Unicode (UTF-8) formatted unless an alternative 
mode is selected. This command replaces the use of the -d switch and should
similarly be the last option given.

zint -i ./somefile.txt

4.2 Directing Output
--------------------
Output can be directed to a file other than the default using the -o switch. 
For example:

zint -o here.png -d "This Text"

This draws a Code 128 barcode in the file here.png. If an encapsulated Post Script 
file is needed simply append the file name with .eps, and so on for the other
supported file types:

zint -o there.eps -d "This Text"

4.3 Selecting barcode type
--------------------------
Selecting which type of barcode you wish to produce (i.e. which symbology to 
use) can be done at the command line using the -b or --barcode= switch followed 
by the appropriate integer value in the following table. For example to create
a Data Matrix symbol you could use:

zint -o datamatrix.png -b 71 -d "Data to encode"

--------------------------------------------------------------------------------
Numeric Value  |  Barcode Name







|

|







|
|



|
|



|

|
|
|
|

|

|




















|
|







|




|







|
|







150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237

(The rest of this section of the manual involves use of the GUI, so has been
removed from this text-only version)


4. Using the Command Line
=========================
This section describes how to encode data using the command line front end
program. The examples given are for the Linux platform, but the same options
are available for Windows - just remember to include the executable file
extension. i.e.:

zint.exe -d "This Text"


4.1 Inputting data
------------------
The data to encode can be entered at the command line using the -d option, for
example

zint -d "This Text"

This will encode the text "This Text". Zint will use the default symbology,
Code 128, and output to the default file out.png in the current directory.
Alternatively, if libpng was not present when Zint was built, the default
output file will be out.gif. The -d switch and the input data should always
be the last entry on the command line input. Any options given after this
will be ignored.

The data input to Zint is assumed to be encoded in Unicode (UTF-8) format. If
you are encoding characters beyond the 7-bit ASCII set using a scheme other than
Unicode then you will need to set the appropriate input options as shown in
section 4.11 below.

Non-printing characters can be entered on the command line using the backslash
(\) as an escape character in combination with the --esc switch. Permissible
characters are shown in the table below.

--------------------------------------------------------------------
Escape Character  |  ASCII Equivalent  |  Interpretation
--------------------------------------------------------------------
\0                |  0x00              |  Null
\E                |  0x04              |  End of Transmission
\a                |  0x07              |  Bell
\b                |  0x08              |  Backspace
\t                |  0x09              |  Horizontal Tab
\n                |  0x0A              |  Line Feed
\v                |  0x0B              |  Vertical Tab
\f                |  0x0C              |  Form Feed
\r                |  0x0D              |  Carriage Return
\e                |  0x1B              |  Escape
\G                |  0x1D              |  Group Selector
\R                |  0x1E              |  Record Selector
\xNN              |  0xNN              |  Any other 8-bit character
                  |                    |     where NN is hexadecimal
--------------------------------------------------------------------

Input data can be read directly from file using the -i switch as shown below.
The input file is assumed to be Unicode (UTF-8) formatted unless an alternative
mode is selected. This command replaces the use of the -d switch and should
similarly be the last option given.

zint -i ./somefile.txt

4.2 Directing Output
--------------------
Output can be directed to a file other than the default using the -o switch.
For example:

zint -o here.png -d "This Text"

This draws a Code 128 barcode in the file here.png. If an encapsulated Post Script
file is needed simply append the file name with .eps, and so on for the other
supported file types:

zint -o there.eps -d "This Text"

4.3 Selecting barcode type
--------------------------
Selecting which type of barcode you wish to produce (i.e. which symbology to
use) can be done at the command line using the -b or --barcode= switch followed
by the appropriate integer value in the following table. For example to create
a Data Matrix symbol you could use:

zint -o datamatrix.png -b 71 -d "Data to encode"

--------------------------------------------------------------------------------
Numeric Value  |  Barcode Name
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327

328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436


437
438
439
440
441
442
443
444
445





446
447
448
449
450
451
452
453
454
455
456
457
89             |  ITF-14
90             |  Dutch Post KIX Code
92             |  Aztec Code
93             |  DAFT Code
97             |  Micro QR Code
98             |  HIBC Code 128
99             |  HIBC Code 39
102            |  HIBC Data Matrix ECC200
104            |  HIBC QR Code
106            |  HIBC PDF417
108            |  HIBC MicroPDF417
112            |  HIBC Aztec Code
115            |  DotCode
116            |  Han Xin (Chinese Sensible) Code
121            |  Royal Mail 4-state Mailmark
128            |  Aztec Runes
129            |  Code 32
130            |  Composite Symbol with EAN linear component
131            |  Composite Symbol with GS1-128 linear component
132            |  Composite Symbol with GS1 DataBar-14 linear component
133            |  Composite Symbol with GS1 DataBar Limited component
134            |  Composite Symbol with GS1 DataBar Extended component
135            |  Composite Symbol with UPC A linear component
136            |  Composite Symbol with UPC E linear component
137            |  Composite Symbol with GS1 DataBar-14 Stacked component
138            |  Composite Symbol with GS1 DataBar-14 Stacked Omnidirectional 
               |     component
139            |  Composite Symbol with GS1 DataBar Expanded Stacked component
140            |  Channel Code
141            |  Code One
142            |  Grid Matrix
143            |  UPNQR (Univerzalnega PlaÄilnega Naloga QR)

--------------------------------------------------------------------------------

4.4 Adjusting height
--------------------
The height of a linear symbol can be adjusted using the --height switch. For 
example:

zint --height=100 -d "This Text"

This specifies a symbol height of 100 times the x-resolution of the symbol.

4.5 Adjusting whitespace
------------------------
The amount of whitespace to the left and right of the generated barcode can be 
altered using the –w switch. For example:

zint -w 10 -d "This Text"

This specifies a whitespace width of 10 times the x-resolution of the symbol.

4.6 Adding boundary bars and boxes
----------------------------------
Zint allows the symbol to be bound with 'boundary bars' using the option 
--bind. These bars help to prevent misreading of the symbol by corrupting a 
scan if the scanning beam strays off the top or bottom of the symbol. Zint can 
also put a border right around the symbol and its whitespace with the --box 
option. This option is automatically selected for ITF-14 symbols.

The width of the boundary or box can be specified using the --border switch. 
For example:

zint --box --border=10 -d "This"

gives a box with a width 10 times the x-resolution of the symbol.

4.7 Using colour
----------------
The default colours of a symbol are a black symbol on a white background. Zint 
allows you to change this. The -r switch allows the default colours to be 
inverted so that a white symbol is shown on a black background. For example the 
command

zint -r -d "This"

gives an inverted Code 128 symbol. This is not practical for most symbologies 
but white-on-black is allowed by the Data Matrix ECC200 and Aztec Code 
symbology specifications.

For more specific needs the foreground (ink) and background (paper) colours
can be specified using the --fg= and --bg= options followed by a number in RRGGBB
hexadecimal notation (the same system used in HTML). For example the command

zint --fg=004700 -d "This"

alters the symbol to a dark green.

4.8 Rotating the Symbol
-----------------------
The symbol can be rotated through four orientations using the --rotate= option 
followed by the angle of rotation as shown below. This option is only available 
with raster image (PNG, BMP, GIF and PCX) output. 

--rotate=0 (default)
--rotate=90
--rotate=180
--rotate=270

4.9 Adjusting image size
------------------------
The scale of the image can be altered using the --scale= option followed by a 
multiple of the default x-dimension. The default x-dimension is 2 pixels. For
example for PNG images a scale of 5 will increase the x-dimension to 10 pixels. 

4.10 Input modes
----------------
By default all input data is assumed to be encoded in Unicode (UTF-8) format. 
Many barcode symbologies encode data using Latin-1 (ISO-8851-1) character 
encoding, so input is converted from Unicode to Latin-1 before being put in the 
symbol. In addition QR Code, Micro QR Code, Han Xin Code and Grid Matrix 
standards can encode Chinese or Japanese characters which are also converted 
from Unicode. If Zint encounters characters which can not be encoded using the 
default character encoding then it will take advantage of the ECI (Extended 
Channel Interpretations) mechanism to encode the data. Be aware that not all 
barcode readers support ECI mode, so this can sometimes lead to unreadable 
barcodes. If you are using characters beyond those supported by Latin-1 then 
you should check that the resulting barcode can be understood by your target 
barcode reader. Zint will generate a warning message when ECI codes have been
inserted into a symbol.

GS1 data can be encoded in a number of symbologies. Application identifiers
should be enclosed in [square brackets] followed by the data to be encoded (see 
5.1.12.3). To encode GS1 data use the --gs1 option. GS1 mode is assumed (and 
doesn't need to be set) for EAN-128, DataBar and Composite symbologies but is 
also available for Code 16k, Data Matrix, Aztec Code, DotCode and QR Code.

HIBC data may also be encoded in the symbologies Code 39, Code128, Codablock-F,
Datamatrix, QR-Code, PDF417 and Aztec-Code. Within this mode, the leading '+' and the
check character is automatically added.

The --binary option prevents Zint from performing any convertion of the data 
before placing in the barcode symbol and should be used if you are encoding raw 
binary or encrypted data.

If your data contains non ISO-Latin-1 characters, you may encode it using an ECI-aware
Symbology and an ECI value from the table below.
The ECI information is added to your code symbol as prefix data.

The ECI-Value may be specified with the --eci switch, followed by the value in the column
"ECI Code".



The first row of the table (ECI code 3) is the default value and does not lead to any ECI
information included into the symbol.

The input data should be utf-8 formatted. Zint automatically translates the data into the
target encoding.
The rows marked with a star (*) do not do this transformation. The data must be specified
as binary data (--binary switch) with the data in the encoding given by the "Character
Encoding Scheme" column.






--------------------------------------------------------
ECI Code  |  Character Encoding Scheme
--------------------------------------------------------
3         |  ISO-8859-1 - Latin alphabet No. 1 (default)
4         |  ISO-8859-2 - Latin alphabet No. 2
5         |  ISO-8859-3 - Latin alphabet No. 3
6         |  ISO-8859-4 - Latin alphabet No. 4
7         |  ISO-8859-5 - Latin/Cyrillic alphabet
8         |  ISO-8859-6 - Latin/Arabic alphabet
9         |  ISO-8859-7 - Latin/Greek alphabet
10        |  ISO-8859-8 - Latin/Hebrew alphabet







|

















|






>




|








|








|
|
|
|


|








|
|
|




|
|












|
|
|








|

|



|
|
|
|
|
|
|
|
|
|
|




|
|
|






|
|








>
>









>
>
>
>
>




|







299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
89             |  ITF-14
90             |  Dutch Post KIX Code
92             |  Aztec Code
93             |  DAFT Code
97             |  Micro QR Code
98             |  HIBC Code 128
99             |  HIBC Code 39
102            |  HIBC Data Matrix
104            |  HIBC QR Code
106            |  HIBC PDF417
108            |  HIBC MicroPDF417
112            |  HIBC Aztec Code
115            |  DotCode
116            |  Han Xin (Chinese Sensible) Code
121            |  Royal Mail 4-state Mailmark
128            |  Aztec Runes
129            |  Code 32
130            |  Composite Symbol with EAN linear component
131            |  Composite Symbol with GS1-128 linear component
132            |  Composite Symbol with GS1 DataBar-14 linear component
133            |  Composite Symbol with GS1 DataBar Limited component
134            |  Composite Symbol with GS1 DataBar Extended component
135            |  Composite Symbol with UPC A linear component
136            |  Composite Symbol with UPC E linear component
137            |  Composite Symbol with GS1 DataBar-14 Stacked component
138            |  Composite Symbol with GS1 DataBar-14 Stacked Omnidirectional
               |     component
139            |  Composite Symbol with GS1 DataBar Expanded Stacked component
140            |  Channel Code
141            |  Code One
142            |  Grid Matrix
143            |  UPNQR (Univerzalnega PlaÄilnega Naloga QR)
145            |  Rectangular Micro QR Code (rMQR)
--------------------------------------------------------------------------------

4.4 Adjusting height
--------------------
The height of a linear symbol can be adjusted using the --height switch. For
example:

zint --height=100 -d "This Text"

This specifies a symbol height of 100 times the x-resolution of the symbol.

4.5 Adjusting whitespace
------------------------
The amount of whitespace to the left and right of the generated barcode can be
altered using the –w switch. For example:

zint -w 10 -d "This Text"

This specifies a whitespace width of 10 times the x-resolution of the symbol.

4.6 Adding boundary bars and boxes
----------------------------------
Zint allows the symbol to be bound with 'boundary bars' using the option
--bind. These bars help to prevent misreading of the symbol by corrupting a
scan if the scanning beam strays off the top or bottom of the symbol. Zint can
also put a border right around the symbol and its whitespace with the --box
option. This option is automatically selected for ITF-14 symbols.

The width of the boundary or box can be specified using the --border switch.
For example:

zint --box --border=10 -d "This"

gives a box with a width 10 times the x-resolution of the symbol.

4.7 Using colour
----------------
The default colours of a symbol are a black symbol on a white background. Zint
allows you to change this. The -r switch allows the default colours to be
inverted so that a white symbol is shown on a black background. For example the
command

zint -r -d "This"

gives an inverted Code 128 symbol. This is not practical for most symbologies
but white-on-black is allowed by the Data Matrix and Aztec Code
symbology specifications.

For more specific needs the foreground (ink) and background (paper) colours
can be specified using the --fg= and --bg= options followed by a number in RRGGBB
hexadecimal notation (the same system used in HTML). For example the command

zint --fg=004700 -d "This"

alters the symbol to a dark green.

4.8 Rotating the Symbol
-----------------------
The symbol can be rotated through four orientations using the --rotate= option
followed by the angle of rotation as shown below. This option is only available
with raster image (PNG, BMP, GIF and PCX) output.

--rotate=0 (default)
--rotate=90
--rotate=180
--rotate=270

4.9 Adjusting image size
------------------------
The scale of the image can be altered using the --scale= option followed by a
multiple of the default x-dimension. The default x-dimension is 2 pixels. For
example for PNG images a scale of 5 will increase the x-dimension to 10 pixels.

4.10 Input modes
----------------
By default all input data is assumed to be encoded in Unicode (UTF-8) format.
Many barcode symbologies encode data using Latin-1 (ISO-8851-1) character
encoding, so input is converted from Unicode to Latin-1 before being put in the
symbol. In addition QR Code, Micro QR Code, Han Xin Code and Grid Matrix
standards can encode Chinese or Japanese characters which are also converted
from Unicode. If Zint encounters characters which can not be encoded using the
default character encoding then it will take advantage of the ECI (Extended
Channel Interpretations) mechanism to encode the data. Be aware that not all
barcode readers support ECI mode, so this can sometimes lead to unreadable
barcodes. If you are using characters beyond those supported by Latin-1 then
you should check that the resulting barcode can be understood by your target
barcode reader. Zint will generate a warning message when ECI codes have been
inserted into a symbol.

GS1 data can be encoded in a number of symbologies. Application identifiers
should be enclosed in [square brackets] followed by the data to be encoded (see
5.1.12.3). To encode GS1 data use the --gs1 option. GS1 mode is assumed (and
doesn't need to be set) for EAN-128, DataBar and Composite symbologies but is
also available for Code 16k, Data Matrix, Aztec Code, DotCode and QR Code.

HIBC data may also be encoded in the symbologies Code 39, Code128, Codablock-F,
Datamatrix, QR-Code, PDF417 and Aztec-Code. Within this mode, the leading '+' and the
check character is automatically added.

The --binary option prevents Zint from performing any convertion of the data
before placing in the barcode symbol and should be used if you are encoding raw
binary or encrypted data.

If your data contains non ISO-Latin-1 characters, you may encode it using an ECI-aware
Symbology and an ECI value from the table below.
The ECI information is added to your code symbol as prefix data.

The ECI-Value may be specified with the --eci switch, followed by the value in the column
"ECI Code".
The ECI-Value of 0 does not encode any ECI-Information in the code symbol. In this case,
the default encoding applies for the data which is "ISO-8859-1 - Latin alphabet No. 1".

The first row of the table (ECI code 3) is the default value and does not lead to any ECI
information included into the symbol.

The input data should be utf-8 formatted. Zint automatically translates the data into the
target encoding.
The rows marked with a star (*) do not do this transformation. The data must be specified
as binary data (--binary switch) with the data in the encoding given by the "Character
Encoding Scheme" column.

Note: the "--eci 3" specification may only be used for special purposes. Using this parameter,
the ECI information is explicitly added to the code symbol. Nevertheless, for ECI Code 3, this
is not required, as this is the default encoding, which is also active without any ECI
information.

--------------------------------------------------------
ECI Code  |  Character Encoding Scheme
--------------------------------------------------------
3         |  ISO-8859-1 - Latin alphabet No. 1
4         |  ISO-8859-2 - Latin alphabet No. 2
5         |  ISO-8859-3 - Latin alphabet No. 3
6         |  ISO-8859-4 - Latin alphabet No. 4
7         |  ISO-8859-5 - Latin/Cyrillic alphabet
8         |  ISO-8859-6 - Latin/Arabic alphabet
9         |  ISO-8859-7 - Latin/Greek alphabet
10        |  ISO-8859-8 - Latin/Hebrew alphabet
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
require input data in big5 instead of utf-8.  The big5 representation of
this character are the two hex bytes: 9c 75 (contained in the file big5char.txt).
The generation command is:
zint.exe -b 71 --square --scale 10 --eci 28 --binary -i big5char.txt

4.11 Batch processing
---------------------
Data can be batch processed by reading from a text file and producing a 
separate barcode image for each line of text in that file. To do this use the 
--batch switch. To select the input file from which to read data use the –i 
option. Zint will automatically detect the end of a line of text (in either 
Unix or Windows formatted text files) and produce a symbol each time it finds 
this. Input files should end with a return character – if this is not present 
then Zint will not encode the last line of text, and will warn you that there 
is a problem.

By default Zint will output numbered filenames starting with 00001.png, 
00002.png etc. To change this behaviour use the –o option in combination with 
--batch using special characters in the output file name as shown in the table 
below: 

---------------------------------------------
Input Character   |  Interpretation
---------------------------------------------
~                 |  Insert a number or '0'
#                 |  Insert a number or space
@                 |  Insert a number or "*"







|
|
|
|
|
|
|


|
|
|
|







499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
require input data in big5 instead of utf-8.  The big5 representation of
this character are the two hex bytes: 9c 75 (contained in the file big5char.txt).
The generation command is:
zint.exe -b 71 --square --scale 10 --eci 28 --binary -i big5char.txt

4.11 Batch processing
---------------------
Data can be batch processed by reading from a text file and producing a
separate barcode image for each line of text in that file. To do this use the
--batch switch. To select the input file from which to read data use the –i
option. Zint will automatically detect the end of a line of text (in either
Unix or Windows formatted text files) and produce a symbol each time it finds
this. Input files should end with a return character – if this is not present
then Zint will not encode the last line of text, and will warn you that there
is a problem.

By default Zint will output numbered filenames starting with 00001.png,
00002.png etc. To change this behaviour use the –o option in combination with
--batch using special characters in the output file name as shown in the table
below:

---------------------------------------------
Input Character   |  Interpretation
---------------------------------------------
~                 |  Insert a number or '0'
#                 |  Insert a number or space
@                 |  Insert a number or "*"
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
-o t@es~t~.png   |  t*es0t1.png, t*es0t2.png, t*es0t3.png
--------------------------------------------------------------

4.12 Direct output
------------------
The finished image files can be output directly to stdout for use as part of
a pipe by using the --direct option. By default --direct will output data
as a PNG image, but this can be altered by supplimenting the --direct option
with a --filetype= option followed by the suffix of the file type required.
For example:

zint -b 84 --direct --filetype=pcx -d "Data to encode"

This command will output the symbol as a PCX file to stdout. The currently
supported output file formats are shown in the following table:







|







537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
-o t@es~t~.png   |  t*es0t1.png, t*es0t2.png, t*es0t3.png
--------------------------------------------------------------

4.12 Direct output
------------------
The finished image files can be output directly to stdout for use as part of
a pipe by using the --direct option. By default --direct will output data
as a PNG image, but this can be altered by supplementing the --direct option
with a --filetype= option followed by the suffix of the file type required.
For example:

zint -b 84 --direct --filetype=pcx -d "Data to encode"

This command will output the symbol as a PCX file to stdout. The currently
supported output file formats are shown in the following table:
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
The -t or --types option gives the table of symbologies along with the symbol
ID numbers.

The -e or --ecinos option gives a list of the ECI codes.

4.16 Other output options
-------------------------
For linear barcodes the text present in the output image can be removed by 
using the --notext option.

The text can be set to bold using the --bold option, or a smaller font
can be substituted using the --small option. The --bold and --small options
can be used together if required.

Zint can output a representation of the symbol data as a set of hexadecimal
values if asked to output to a text file (*.txt) or if given the option
--filetype=txt. This can be used for test and diagnostic purposes.

The --cmyk option is specific to output in encapsulated PostScript, and
converts the RGB colours used to the CMYK colour space. Setting custom
colours at the command line will still need to be done in RRGGBB format.

Additional options are available which are specific to certain symbologies. 
These may, for example, control the amount of error correction data or the 
size of the symbol. These options are discussed in section 6 of this guide. 

5. Using the API
================
Zint has been written using the C language and currently only has an API for 
use with C language programs.

The libzint API has been designed to be very similar to that used by the GNU 
Barcode package. This allows easy migration from GNU Barcode to Zint. Zint, 
however, uses none of the same function names or option names as GNU Barcode. 
This allows you to use both packages in your application without conflict if 
you wish. 

5.1 Creating and Deleting Symbols
---------------------------------
The symbols manipulated by Zint are held in a zint_symbol structure defined in 
zint.h. These symbols are created with the ZBarcode_Create() function and 
deleted using the ZBarcode_Delete() function. For example the following code 
creates and then deletes a symbol:

#include <stdio.h>
#include <zint.h>
int main()
{
    struct zint_symbol *my_symbol;my_symbol = ZBarcode_Create();
    if(my_symbol != NULL)
    {
        printf("Symbol successfully created!\n");
    }
    ZBarcode_Delete(my_symbol);
    return 0;
}

When compiling this code it will need to be linked with the libzint library 
using the -lzint option:

gcc -o simple simple.c –lzint

5.2 Encoding and Saving to File
-------------------------------
To encode data in a barcode use the ZBarcode_Encode() function. To write the 
symbol to a file use the ZBarcode_Print() function. For example the following 
code takes a string from the command line and outputs a Code 128 symbol in a 
PNG file named out.png (or a GIF file called out.gif if libpng is not present)
in the current working directory:

#include <stdio.h>
#include <zint.h>
int main(int argc, char **argv)
{
    struct zint_symbol *my_symbol;
    my_symbol = ZBarcode_Create();
    ZBarcode_Encode(my_symbol, argv[1], 0);
    ZBarcode_Print(my_symbol, 0);
    ZBarcode_Delete(my_symbol);
    return 0;
}

This can also be done in one stage using the ZBarcode_Encode_and_Print() 
function as shown in the next example:

#include <stdio.h>
#include <zint.h>
int main(int argc, char **argv)
{
    struct zint_symbol *my_symbol;
    my_symbol = ZBarcode_Create();
    ZBarcode_Encode_and_Print(my_symbol, argv[1], 0, 0);
    ZBarcode_Delete(my_symbol);
    return 0;
}

Input data should be Unicode (UTF-8) formatted.

5.3 Encoding and Printing Functions in Depth
--------------------------------------------
The functions for encoding and printing barcodes are defined as:

int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *input, int 
length);

int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename);

int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle);

int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, 
      int length, int rotate_angle);

int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, 
      int rotate_angle);

In these definitions "length" can be used to set the length of the input 
string. This allows the encoding of NULL (ASCII 0) characters in those 
symbologies which allow this. A value of 0 will disable this function and Zint 
will encode data up to the first NULL character in the input string.

The "rotate_angle" value can be used to rotate the image when outputting as a 
raster image. Valid values are 0, 90, 180 and 270.

The ZBarcode_Encode_File() and ZBarcode_Encode_File_and_Print() functions can 
be used to encode data read directly from a text file where the filename is given
in the "filename" string. 

5.4 Buffering Symbols in Memory
-------------------------------
In addition to saving barcode images to file Zint allows you to access a 
representation of the resulting bitmap image in memory. The following functions 
allow you to do this: 

int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle); 

int ZBarcide_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char 
      *input, int length, int rotate_angle); 

int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, 
      int rotate_angle); 

The arguments here are the same as above. The difference is that instead of 
saving the image to file it is placed in an unsigned integer array. The "bitmap" 
pointer is set to the first memory location in the array and the values 
"barcode_width" and "barcode_height" indicate the size of the resulting image 
in pixels. Rotation and colour options can be used at the same time as using 
the buffer functions in the same way as when saving to a raster image. The
pixel data can be extracted from the array by the methd shown in
the example below where render_pixel() is assumed to be a function for drawing
a pixel on the screen implemented by the external application:

int row, col, i = 0;
unsigned int red, blue, green;

for (row = 0; row < my_symbol->bitmap_height; row++) {
     for (column = 0; col < my_symbol->bitmap_width; column++) {
          red = my_symbol->bitmap[i];
          green = my_symbol->bitmap[i + 1];
          blue = my_symbol->bitmap[i + 2];
          render_pixel(row, column, red, green, blue);
          i += 3;
     }
}

5.5 Setting Options
-------------------
So far our application is not very useful unless we plan to only make Code 128 
symbols and we don't mind that they only save to out.png. As with the CLI 
program, of course, these options can be altered. The way this is done is 
by altering the contents of the zint_symbol structure between the creation and 
encoding stages. The zint_symbol structure consists of the following variables: 

-------------------------------------------------------------------------------
Variable Name    | Type         | Meaning                     | Default Value
-------------------------------------------------------------------------------
symbology        | integer      | Symbol to use (see section  | BARCODE_CODE128
                 |              |    5.7).                    | 
height           | integer      | Symbol height. [1]          | 50
whitespace_width | integer      | Whtespace width.            | 0
border_width     | integer      | Border width.               | 0
output_options   | integer      | Set various output file     | (none)
                 |              |    parameters (see section  |
                 |              |    5.8). [2]                |
fgcolour         | character    | Foreground (ink) colour as  | "000000"







|














|
|
|



|


|
|
|
|
|



|
|
|















|






|
|
|















|



















|






|


|


|
|
|


|


|

|



|
|
|

|

|
|

|
|

|
|
|
|
|

|


















|
|
|
|
|





|







600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
The -t or --types option gives the table of symbologies along with the symbol
ID numbers.

The -e or --ecinos option gives a list of the ECI codes.

4.16 Other output options
-------------------------
For linear barcodes the text present in the output image can be removed by
using the --notext option.

The text can be set to bold using the --bold option, or a smaller font
can be substituted using the --small option. The --bold and --small options
can be used together if required.

Zint can output a representation of the symbol data as a set of hexadecimal
values if asked to output to a text file (*.txt) or if given the option
--filetype=txt. This can be used for test and diagnostic purposes.

The --cmyk option is specific to output in encapsulated PostScript, and
converts the RGB colours used to the CMYK colour space. Setting custom
colours at the command line will still need to be done in RRGGBB format.

Additional options are available which are specific to certain symbologies.
These may, for example, control the amount of error correction data or the
size of the symbol. These options are discussed in section 6 of this guide.

5. Using the API
================
Zint has been written using the C language and currently only has an API for
use with C language programs.

The libzint API has been designed to be very similar to that used by the GNU
Barcode package. This allows easy migration from GNU Barcode to Zint. Zint,
however, uses none of the same function names or option names as GNU Barcode.
This allows you to use both packages in your application without conflict if
you wish.

5.1 Creating and Deleting Symbols
---------------------------------
The symbols manipulated by Zint are held in a zint_symbol structure defined in
zint.h. These symbols are created with the ZBarcode_Create() function and
deleted using the ZBarcode_Delete() function. For example the following code
creates and then deletes a symbol:

#include <stdio.h>
#include <zint.h>
int main()
{
    struct zint_symbol *my_symbol;my_symbol = ZBarcode_Create();
    if(my_symbol != NULL)
    {
        printf("Symbol successfully created!\n");
    }
    ZBarcode_Delete(my_symbol);
    return 0;
}

When compiling this code it will need to be linked with the libzint library
using the -lzint option:

gcc -o simple simple.c –lzint

5.2 Encoding and Saving to File
-------------------------------
To encode data in a barcode use the ZBarcode_Encode() function. To write the
symbol to a file use the ZBarcode_Print() function. For example the following
code takes a string from the command line and outputs a Code 128 symbol in a
PNG file named out.png (or a GIF file called out.gif if libpng is not present)
in the current working directory:

#include <stdio.h>
#include <zint.h>
int main(int argc, char **argv)
{
    struct zint_symbol *my_symbol;
    my_symbol = ZBarcode_Create();
    ZBarcode_Encode(my_symbol, argv[1], 0);
    ZBarcode_Print(my_symbol, 0);
    ZBarcode_Delete(my_symbol);
    return 0;
}

This can also be done in one stage using the ZBarcode_Encode_and_Print()
function as shown in the next example:

#include <stdio.h>
#include <zint.h>
int main(int argc, char **argv)
{
    struct zint_symbol *my_symbol;
    my_symbol = ZBarcode_Create();
    ZBarcode_Encode_and_Print(my_symbol, argv[1], 0, 0);
    ZBarcode_Delete(my_symbol);
    return 0;
}

Input data should be Unicode (UTF-8) formatted.

5.3 Encoding and Printing Functions in Depth
--------------------------------------------
The functions for encoding and printing barcodes are defined as:

int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *input, int
length);

int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename);

int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle);

int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input,
      int length, int rotate_angle);

int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename,
      int rotate_angle);

In these definitions "length" can be used to set the length of the input
string. This allows the encoding of NULL (ASCII 0) characters in those
symbologies which allow this. A value of 0 will disable this function and Zint
will encode data up to the first NULL character in the input string.

The "rotate_angle" value can be used to rotate the image when outputting as a
raster image. Valid values are 0, 90, 180 and 270.

The ZBarcode_Encode_File() and ZBarcode_Encode_File_and_Print() functions can
be used to encode data read directly from a text file where the filename is given
in the "filename" string.

5.4 Buffering Symbols in Memory
-------------------------------
In addition to saving barcode images to file Zint allows you to access a
representation of the resulting bitmap image in memory. The following functions
allow you to do this:

int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle);

int ZBarcide_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char
      *input, int length, int rotate_angle);

int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename,
      int rotate_angle);

The arguments here are the same as above. The difference is that instead of
saving the image to file it is placed in an unsigned integer array. The "bitmap"
pointer is set to the first memory location in the array and the values
"barcode_width" and "barcode_height" indicate the size of the resulting image
in pixels. Rotation and colour options can be used at the same time as using
the buffer functions in the same way as when saving to a raster image. The
pixel data can be extracted from the array by the method shown in
the example below where render_pixel() is assumed to be a function for drawing
a pixel on the screen implemented by the external application:

int row, col, i = 0;
unsigned int red, blue, green;

for (row = 0; row < my_symbol->bitmap_height; row++) {
     for (column = 0; col < my_symbol->bitmap_width; column++) {
          red = my_symbol->bitmap[i];
          green = my_symbol->bitmap[i + 1];
          blue = my_symbol->bitmap[i + 2];
          render_pixel(row, column, red, green, blue);
          i += 3;
     }
}

5.5 Setting Options
-------------------
So far our application is not very useful unless we plan to only make Code 128
symbols and we don't mind that they only save to out.png. As with the CLI
program, of course, these options can be altered. The way this is done is
by altering the contents of the zint_symbol structure between the creation and
encoding stages. The zint_symbol structure consists of the following variables:

-------------------------------------------------------------------------------
Variable Name    | Type         | Meaning                     | Default Value
-------------------------------------------------------------------------------
symbology        | integer      | Symbol to use (see section  | BARCODE_CODE128
                 |              |    5.7).                    |
height           | integer      | Symbol height. [1]          | 50
whitespace_width | integer      | Whtespace width.            | 0
border_width     | integer      | Border width.               | 0
output_options   | integer      | Set various output file     | (none)
                 |              |    parameters (see section  |
                 |              |    5.8). [2]                |
fgcolour         | character    | Foreground (ink) colour as  | "000000"
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
                 |    array     |                             |
bitmap_width     | integer      | Width of stored bitmap      | (output only)
                 |              |    image (in pixels).       |
bitmap_height    | integer      | Height of stored bitmap     | (output only)
                 |              |    image (in pixels).       |
-------------------------------------------------------------------------------

To alter these values use the syntax shown in the example below. This code has 
the same result as the previous example except the output is now taller and 
plotted in green.

#include <stdio.h>
#include <zint.h>
#include <string.h>
int main(int argc, char **argv)
{
    struct zint_symbol *my_symbol;my_symbol = ZBarcode_Create();
    strcpy(my_symbol->fgcolour, "00ff00");
    my_symbol->height = 400;
    ZBarcode_Encode_and_Print(my_symbol, argv[1], 0, 0);
    ZBarcode_Delete(my_symbol);
    return 0;
}

5.6 Handling Errors
-------------------
If errors occur during encoding an integer value is passed back to the calling 
application. In addition the errtxt value is used to give a message detailing 
the nature of the error. The errors generated by Zint are given in the table 
below: 

-------------------------------------------------------------------------------
Return Value                 |  Meaning
-------------------------------------------------------------------------------
ZINT_WARN_INVALID_OPTION     |  One of the values in zint_struct was set
                             |     incorrectly but Zint has made a guess at
                             |     what it should have been and generated a
                             |     barcode accordingly.
ZINT_WARN_USES_ECI           |  Zint has automatically inserted an ECI 
                             |     character. The symbol may not be readable
                             |     with some readers.
ZINT_ERROR_TOO_LONG          |  The input data is too long or too short for the
                             |     selected symbology. No symbol has been
                             |     generated. 
ZINT_ERROR_INVALID_DATA      |  The data to be encoded includes characters which
                             |     are not permitted by the selected symbology
                             |     (e.g. alphabetic characters in an EAN
                             |     symbol). No symbol has been generated. 
ZINT_ERROR_INVALID_CHECK     |  An ISBN with an incorrect check digit has been 
                             |     entered. No symbol has been generated. 
ZINT_ERROR_INVALID_OPTION    |  One of the values in zint_struct was set
                             |     incorrectly and Zint was unable to guess what
                             |     it should have been. No symbol has been
                             |     generated. 
ZINT_ERROR_ENCODING_PROBLEM  |  A problem has occurred during encoding of the
                             |     data. This should never happen. Please
                             |     contact the developer if you encounter this
                             |     error. 
ZINT_ERROR_FILE_ACCESS       |  Zint was unable to open the requested output
                             |     file. This is usually a file permissions
                             |     problem.
ZINT_ERROR_MEMORY            |  Zint ran out of memory. This should only be a
                             |     problem with legacy systems.
-------------------------------------------------------------------------------








|
|

















|
|
|
|








|




|



|
|
|



|



|







830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
                 |    array     |                             |
bitmap_width     | integer      | Width of stored bitmap      | (output only)
                 |              |    image (in pixels).       |
bitmap_height    | integer      | Height of stored bitmap     | (output only)
                 |              |    image (in pixels).       |
-------------------------------------------------------------------------------

To alter these values use the syntax shown in the example below. This code has
the same result as the previous example except the output is now taller and
plotted in green.

#include <stdio.h>
#include <zint.h>
#include <string.h>
int main(int argc, char **argv)
{
    struct zint_symbol *my_symbol;my_symbol = ZBarcode_Create();
    strcpy(my_symbol->fgcolour, "00ff00");
    my_symbol->height = 400;
    ZBarcode_Encode_and_Print(my_symbol, argv[1], 0, 0);
    ZBarcode_Delete(my_symbol);
    return 0;
}

5.6 Handling Errors
-------------------
If errors occur during encoding an integer value is passed back to the calling
application. In addition the errtxt value is used to give a message detailing
the nature of the error. The errors generated by Zint are given in the table
below:

-------------------------------------------------------------------------------
Return Value                 |  Meaning
-------------------------------------------------------------------------------
ZINT_WARN_INVALID_OPTION     |  One of the values in zint_struct was set
                             |     incorrectly but Zint has made a guess at
                             |     what it should have been and generated a
                             |     barcode accordingly.
ZINT_WARN_USES_ECI           |  Zint has automatically inserted an ECI
                             |     character. The symbol may not be readable
                             |     with some readers.
ZINT_ERROR_TOO_LONG          |  The input data is too long or too short for the
                             |     selected symbology. No symbol has been
                             |     generated.
ZINT_ERROR_INVALID_DATA      |  The data to be encoded includes characters which
                             |     are not permitted by the selected symbology
                             |     (e.g. alphabetic characters in an EAN
                             |     symbol). No symbol has been generated.
ZINT_ERROR_INVALID_CHECK     |  An ISBN with an incorrect check digit has been
                             |     entered. No symbol has been generated.
ZINT_ERROR_INVALID_OPTION    |  One of the values in zint_struct was set
                             |     incorrectly and Zint was unable to guess what
                             |     it should have been. No symbol has been
                             |     generated.
ZINT_ERROR_ENCODING_PROBLEM  |  A problem has occurred during encoding of the
                             |     data. This should never happen. Please
                             |     contact the developer if you encounter this
                             |     error.
ZINT_ERROR_FILE_ACCESS       |  Zint was unable to open the requested output
                             |     file. This is usually a file permissions
                             |     problem.
ZINT_ERROR_MEMORY            |  Zint ran out of memory. This should only be a
                             |     problem with legacy systems.
-------------------------------------------------------------------------------

911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936

This code will exit with the appropriate message:

error: malformed foreground colour target

5.7 Specifying a Symbology
--------------------------
Symbologies can be specified by number or by name as shown in the following 
table. For example

symbol->symbology= BARCODE_LOGMARS;

means the same as

symbol->symbology = 50;

--------------------------------------------------------------------------------
Numeric | Name                    | Barcode Name
Value   | 
--------------------------------------------------------------------------------
1       | BARCODE_CODE11          | Code 11
2       | BARCODE_C25MATRIX       | Standard Code 2 of 5
3       | BARCODE_C25INTER        | Interleaved 2 of 5
4       | BARCODE_C25IATA         | Code 2 of 5 IATA
6       | BARCODE_C25LOGIC        | Code 2 of 5 Data Logic
7       | BARCODE_C25IND          | Code 2 of 5 Industrial







|










|







922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947

This code will exit with the appropriate message:

error: malformed foreground colour target

5.7 Specifying a Symbology
--------------------------
Symbologies can be specified by number or by name as shown in the following
table. For example

symbol->symbology= BARCODE_LOGMARS;

means the same as

symbol->symbology = 50;

--------------------------------------------------------------------------------
Numeric | Name                    | Barcode Name
Value   |
--------------------------------------------------------------------------------
1       | BARCODE_CODE11          | Code 11
2       | BARCODE_C25MATRIX       | Standard Code 2 of 5
3       | BARCODE_C25INTER        | Interleaved 2 of 5
4       | BARCODE_C25IATA         | Code 2 of 5 IATA
6       | BARCODE_C25LOGIC        | Code 2 of 5 Data Logic
7       | BARCODE_C25IND          | Code 2 of 5 Industrial
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
60      | BARCODE_CODE128B        | Code 128 (Subset B)
63      | BARCODE_AUSPOST         | Australia Post Standard Customer
66      | BARCODE_AUSREPLY        | Australia Post Reply Paid
67      | BARCODE_AUSROUTE        | Australia Post Routing
68      | BARCODE_AUSDIRECT       | Australia Post Redirection
69      | BARCODE_ISBNX           | ISBN (EAN-13 with verification stage)
70      | BARCODE_RM4SCC          | Royal Mail 4 State (RM4SCC)
71      | BARCODE_DATAMATRIX      | Data Matrix ECC200
72      | BARCODE_EAN14           | EAN-14
73      | BARCODE_VIN             | Vehicle Identification Number (America)
74      | BARCODE_CODABLOCKF      | Codablock-F
75      | BARCODE_NVE18           | NVE-18
76      | BARCODE_JAPANPOST       | Japanese Postal Code
77      | BARCODE_KOREAPOST       | Korea Post
79      | BARCODE_RSS14STACK      | GS1 DataBar-14 Stacked







|







980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
60      | BARCODE_CODE128B        | Code 128 (Subset B)
63      | BARCODE_AUSPOST         | Australia Post Standard Customer
66      | BARCODE_AUSREPLY        | Australia Post Reply Paid
67      | BARCODE_AUSROUTE        | Australia Post Routing
68      | BARCODE_AUSDIRECT       | Australia Post Redirection
69      | BARCODE_ISBNX           | ISBN (EAN-13 with verification stage)
70      | BARCODE_RM4SCC          | Royal Mail 4 State (RM4SCC)
71      | BARCODE_DATAMATRIX      | Data Matrix (ECC200)
72      | BARCODE_EAN14           | EAN-14
73      | BARCODE_VIN             | Vehicle Identification Number (America)
74      | BARCODE_CODABLOCKF      | Codablock-F
75      | BARCODE_NVE18           | NVE-18
76      | BARCODE_JAPANPOST       | Japanese Postal Code
77      | BARCODE_KOREAPOST       | Korea Post
79      | BARCODE_RSS14STACK      | GS1 DataBar-14 Stacked
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029

1030
1031
1032
1033
1034
1035
1036
112     | BARCODE_HIBC_AZTEC      | HIBC Aztec Code
115     | BARCODE_DOTCODE         | DotCode
116     | BARCODE_HANXIN          | Han Xin (Chinese Sensible) Code
121     | BARCODE_MAILMARK        | Royal Mail 4-state Mailmark
128     | BARCODE_AZRUNE          | Aztec Runes
129     | BARCODE_CODE32          | Code 32
130     | BARCODE_EANX_CC         | Composite Symbol with EAN linear component
131     | BARCODE_EAN128_CC       | Composite Symbol with GS1-128 linear 
        |                         |    component
132     | BARCODE_RSS14_CC        | Composite Symbol with GS1 DataBar-14 linear 
        |                         |    component
133     | BARCODE_RSS_LTD_CC      | Composite Symbol with GS1 DataBar Limited 
        |                         |    component
134     | BARCODE_RSS_EXP_CC      | Composite Symbol with GS1 DataBar Extended 
        |                         |    component
135     | BARCODE_UPCA_CC         | Composite Symbol with UPC A linear component
136     | BARCODE_UPCE_CC         | Composite Symbol with UPC E linear component
137     | BARCODE_RSS14STACK_CC   | Composite Symbol with GS1 DataBar-14 
        |                         |    Stacked component
138     | BARCODE_RSS14_OMNI_CC   | Composite Symbol with GS1 DataBar-14 
        |                         |    Stacked Omnidirectional component
139     | BARCODE_RSS_EXPSTACK_CC | Composite Symbol with GS1 DataBar Expanded 
        |                         |    Stacked component
140     | BARCODE_CHANNEL         | Channel Code
141     | BARCODE_CODEONE         | Code One
142     | BARCODE_GRIDMATRIX      | Grid Matrix
143     | BARCODE_UPNQR           | UPNQR (Univerzalnega PlaÄilnega Naloga QR)

--------------------------------------------------------------------------------

5.8 Adjusting other output options
----------------------------------
The output_options variable can be used to adjust various aspects of the output
file. To select more than one option from the table below simply add them together
when adjusting this value:







|

|

|

|



|

|

|





>







1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
112     | BARCODE_HIBC_AZTEC      | HIBC Aztec Code
115     | BARCODE_DOTCODE         | DotCode
116     | BARCODE_HANXIN          | Han Xin (Chinese Sensible) Code
121     | BARCODE_MAILMARK        | Royal Mail 4-state Mailmark
128     | BARCODE_AZRUNE          | Aztec Runes
129     | BARCODE_CODE32          | Code 32
130     | BARCODE_EANX_CC         | Composite Symbol with EAN linear component
131     | BARCODE_EAN128_CC       | Composite Symbol with GS1-128 linear
        |                         |    component
132     | BARCODE_RSS14_CC        | Composite Symbol with GS1 DataBar-14 linear
        |                         |    component
133     | BARCODE_RSS_LTD_CC      | Composite Symbol with GS1 DataBar Limited
        |                         |    component
134     | BARCODE_RSS_EXP_CC      | Composite Symbol with GS1 DataBar Extended
        |                         |    component
135     | BARCODE_UPCA_CC         | Composite Symbol with UPC A linear component
136     | BARCODE_UPCE_CC         | Composite Symbol with UPC E linear component
137     | BARCODE_RSS14STACK_CC   | Composite Symbol with GS1 DataBar-14
        |                         |    Stacked component
138     | BARCODE_RSS14_OMNI_CC   | Composite Symbol with GS1 DataBar-14
        |                         |    Stacked Omnidirectional component
139     | BARCODE_RSS_EXPSTACK_CC | Composite Symbol with GS1 DataBar Expanded
        |                         |    Stacked component
140     | BARCODE_CHANNEL         | Channel Code
141     | BARCODE_CODEONE         | Code One
142     | BARCODE_GRIDMATRIX      | Grid Matrix
143     | BARCODE_UPNQR           | UPNQR (Univerzalnega PlaÄilnega Naloga QR)
145     | BARCODE_RMQR            | Rectangular Micro QR Code (rMQR)
--------------------------------------------------------------------------------

5.8 Adjusting other output options
----------------------------------
The output_options variable can be used to adjust various aspects of the output
file. To select more than one option from the table below simply add them together
when adjusting this value:
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
                    |      PostScript files.
BARCODE_DOTTY_MODE  |  Plot a matrix symbol using dots rather than squares.
GS1_GS_SEPARATOR    |  Use GS instead FNC1 as GS1 separator.
--------------------------------------------------------------------------------

5.9 Setting the Input Mode
--------------------------
The way in which the input data is encoded can be set using the input_mode 
property. Valid values are shown in the table below. 

-----------------------------------------------------------------------------
Value         |  Effect
-----------------------------------------------------------------------------
DATA_MODE     |  Uses full ASCII range interpreted as Latin-1 or binary data.
UNICODE_MODE  |  Uses pre-formatted UTF-8 input.
GS1_MODE      |  Encodes GS1 data using FNC1 characters.
ESCAPE_MODE   |  Process input data for escape sequences.
-----------------------------------------------------------------------------

DATA_MODE, UNICODE_MODE and GS1_MODE are mutually exclusive, whereas
ESCAPE_MODE is optional. So, for example, you can set

my_symbol->input_mode = UNICODE_MODE + ESCAPE_MODE;

whereas 

my_symbol->input_mode = DATA_MODE + GS1_MODE;

is not valid. Permissable escape sequences are listed in section 4.1.


5.10 Verifying Symbology Availability
-------------------------------------
An additional function available in the API is defined as:

int ZBarcode_ValidID(int symbol_id);

This function allows you to check whether a given symbology is available. A 
non-zero return value indicates that the given symbology is available. For 
example:

if(ZBarcode_ValidID(BARCODE_PDF417) != 0) {
    printf("PDF417 available");
} else {
    printf("PDF417 not available");
}

[1] This value is ignored for Australia Post 4-State Barcodes, PostNet, PLANET, 
USPS OneCode, RM4SCC, PDF417, Data Matrix ECC200, Maxicode, QR Code, GS1 
DataBar-14 Stacked, PDF417 and MicroPDF417 - all of which have a fixed height.

[2] This value is ignored for Code 16k, Codablock-F and ITF-14 symbols.

6. Types of Symbology
=====================
6.1 One-Dimensional Symbols
---------------------------
One-Dimensional Symbols are what most people associate with the term barcode. 
They consist of a number of bars and a number of spaces of differing widths.

6.1.1 Code 11
-------------
Developed by Intermec in 1977, Code 11 is similar to Code 2 of 5 Matrix and is 
primarily used in telecommunications. The symbol can encode any length string 
consisting of the digits 0-9 and the dash character (-). One modulo-11 check 
digit is calculated.

6.1.2 Code 2 of 5
-----------------
Code 2 of 5 is a family of one-dimensional symbols, 8 of which are supported by 
Zint. Note that the names given to these standards alters from one source to 
another so you should take care to ensure that you have the right barcode type 
before using these standards.

6.1.2.1 Standard Code 2 of 5
----------------------------
Also known as Code 2 of 5 Matrix is a self-checking code used in industrial 
applications and photo development. Standard Code 2 of 5 will encode any length 
numeric input (digits 0-9).

6.1.2.2 IATA Code 2 of 5
------------------------
Used for baggage handling in the air-transport industry by the International 
Air Transport Agency, this self-checking code will encode any length numeric input 
(digits 0-9) and does not include a check digit.

6.1.2.3 Industrial Code 2 of 5
------------------------------
Industrial Code 2 of 5 can encode any length numeric input (digits 0-9) and 
does not include a check digit.

6.1.2.4 Interleaved Code 2 of 5
-------------------------------
This self-checking symbology encodes pairs of numbers, and so can only encode 
an even number of digits (0-9). If an odd number of digits is entered a leading 
zero is added by Zint. No check digit is added.

6.1.2.5 Code 2 of 5 Data Logic
------------------------------
Data Logic does not include a check digit and can encode any length numeric 
input (digits 0-9).

6.1.2.6 ITF-14
--------------
ITF-14, also known as UPC Shipping Container Symbol or Case Code is based on 
Interleaved Code 2 of 5 and requires a 13 digit numeric input (digits 0-9). One 
modulo-10 check digit is added by Zint.

6.1.2.7 Deutsche Post Leitcode
------------------------------
Leitcode is based on Interleaved Code 2 of 5 and is used by Deutsche Post for 
mailing purposes. Leitcode requires a 13-digit numerical input and includes a 
check digit.

6.1.2.8 Deutsche Post Identcode
-------------------------------
Identcode is based on Interleaved Code 2 of 5 and is used by Deutsche Post for 
mailing purposes. Identcode requires an 11-digit numerical input and includes a 
check digit.

6.1.3 Universal Product Code (EN 797)
-------------------------------------
6.1.3.1 UPC Version A
---------------------
UPC-A is used in the United States for retail applications. The symbol requires 
an 11 digit article number. The check digit is calculated by Zint. In addition 
EAN-2 and EAN-5 add-on symbols can be added using the + character. For example, 
to draw a UPC-A symbol with the data 72527270270 with an EAN-5 add-on showing 
the data 12345 use the command:

zint --barcode=34 -d 72527270270+12345

or encode a data string with the + character included:

my_symbol->symbology = BARCODE_UPCA;

error = ZBarcode_Encode_and_Print(my_symbol, "72527270270+12345");

If your input data already includes the check digit symbology 35 can be used
which takes a 12 digit input and validates the check digit before encoding.

6.1.3.2 UPC Version E
---------------------
UPC-E is a zero-compressed version of UPC-A developed for smaller packages. The 
code requires a 6 digit article number (digits 0-9). The check digit is 
calculated by Zint. EAN-2 and EAN-5 add-on symbols can be added using the + 
character as with UPC-A. In addition Zint also supports Number System 1 
encoding by entering a 7-digit article number stating with the digit 1. For
example:

zint --barcode=37 -d 1123456

or

my_symbol->symbology = BARCODE_UPCE;

error = ZBarcode_Encode_and_Print(my_symbol, "1123456");

If your input data already includes the check digit symbology 38 can be used
which takes a 7 or 8 digit input and validates the check digit before encoding.

6.1.4 European Article Number (EN 797)
--------------------------------------
6.1.4.1 EAN-2, EAN-5, EAN-8 and EAN-13
--------------------------------------
The EAN system is used in retail across Europe and includes standards for EAN-2 
and EAN-5 add-on codes, EAN-8 and EAN-13 which encode 2, 5, 7 or 12 digit 
numbers respectively. Zint will decide which symbology to use depending on the 
length of the input data. In addition EAN-2 and EAN-5 add-on symbols can be 
added using the + symbol as with UPC symbols. For example:

zint --barcode=13 -d 54321

will encode a stand-alone EAN-5, whereas

zint --barcode=13 -d 7432365+54321

will encode an EAN-8 symbol with an EAN-5 add-on. As before these results can 
be achieved using the API:

my_symbol->symbology = BARCODE_EANX;

error = ZBarcode_Encode_and_Print(my_symbol, "54321");

error = ZBarcode_Encode_and_Print(my_symbol, "7432365+54321");

All of the EAN symbols include check digits which are added by Zint.

If you are encoding an EAN-8 or EAN-13 symbol and your data already includes
the check digit then you can use symbology 14 which takes an 8 or 13 digit input
and validates the check digit before encoding.

6.1.4.2 SBN, ISBN and ISBN-13
-----------------------------
EAN-13 symbols (also known as Bookland EAN-13) can also be produced from 
9-digit SBN, 10-digit ISBN or 13-digit ISBN-13 data. The relevant check digit needs
to be present in the input data and will be verified before the symbol is 
generated. In addition EAN-2 and EAN-5 add-on symbols can be added using the + 
symbol as with UPC symbols.

6.1.5 Plessey
-------------
Also known as Plessey Code, this symbology was developed by the Plessey Company 
Ltd. in the UK. The symbol can encode any length data consisting of digits 
(0-9) or letters A-F and includes a CRC check digit. 

6.1.6 MSI Plessey
-----------------
Based on Plessey and developed by MSE Data Corporation, MSI Plessey is 
available with a range of check digit options available by setting option_2 or 
by using the --ver= switch. Any length numeric (digits 0-9) input can be 
encoded. The table below shows the options available: 

-------------------------------------------
Value of option_2  |  Check Digits
-------------------------------------------
0                  |  None
1                  |  Modulo-10
2                  |  Modulo-10 & Modulo-10
3                  |  Modulo-11
4                  |  Modulo-11 & Modulo-10
-------------------------------------------

6.1.7 Telepen
-------------
6.1.7.1 Telepen Alpha
---------------------
Telepen Alpha was developed by SB Electronic Systems Limited and can encode any 
length of ASCII text input. Telepen includes a modulo-127 check digit.

6.1.7.2 Telepen Numeric
-----------------------
Telepen Numeric allows compression of numeric data into a Telepen symbol. Data 
can consist of pairs of numbers or pairs consisting of a numerical digit 
followed an X character. For example: 466333 and 466X33 are valid codes whereas 
46X333 is not (the digit pair "X3" is not valid). Telepen Numeric includes a
modulo-127 check digit which is added by Zint. 

6.1.8 Code 39
-------------
6.1.8.1 Standard Code 39 (ISO 16388)
------------------------------------
Standard Code 39 was developed in 1974 by Intermec. Input data can be of any 
length and can include the characters 0-9, A-Z, dash (-), full stop (.), space, 
asterisk (*), dollar ($), slash (/), plus (+) and percent (%). The standard 
does not require a check digit but a modulo-43 check digit can be added if 
required by setting option_2 = 1 or using --ver=1.

6.1.8.2 Extended Code 39
------------------------
Also known as Code 39e and Code39+, this symbology expands on Standard Code 39 
to provide support to the full ASCII character set. The standard does not 
require a check digit but a modulo-43 check digit can be added if required by 
setting option_2 = 1 or using --ver=1.

6.1.8.3 Code 93
---------------
A variation of Extended Code 39, Code 93 also supports full ASCII text. Two 
check digits are added by Zint.

6.1.8.4 PZN
-----------
PZN is a Code 39 based symbology used by the pharmaceutical industry in 
Germany. PZN encodes a 6 digit number to which Zint will add a modulo-10
check digit.

6.1.8.5 LOGMARS
---------------
LOGMARS (Logistics Applications of Automated Marking and Reading Symbols) is a 
variation of the Code 39 symbology used by the US Department of Defence. 
LOGMARS encodes the same character set as Standard Code 39 and adds a modulo-43 
check digit.

6.1.8.6 Code 32
---------------
A variation of Code 39 used by the Italian Ministry of Health ("Ministero della 
Sanità") for encoding identifiers on pharmaceutical products. This symbology
requires a numeric input up to 8 digits in length. A check digit is added by Zint.

6.1.8.7 HIBC Code 39
--------------------
This option adds a leading '+' character and a trailing modulo-49 check digit 
to a standard Code 39 symbol as required by the Health Industry Barcode 
standards. 

6.1.8.8 Vehicle Identification Number (VIN)
-------------------------------------------
This option includes a verification stage for vehicle identification numbers
used in North America which include a check digit. For European vehicle
identification numbers use Standard Code 39.

6.1.9 Codabar (EN 798)
----------------------
Also known as NW-7, Monarch, ABC Codabar, USD-4, Ames Code and Code 27, this 
symbology was developed in 1972 by Monarch Marketing Systems for retail 
purposes. The American Blood Commission adopted Codabar in 1977 as the standard 
symbology for blood identification. Codabar can encode any length string 
starting and ending with the letters A-D and containing between these letters 
the numbers 0-9, dash (-), dollar ($), colon (:), slash (/), full stop (.) or 
plus (+). No check digit is generated.

6.1.10 Pharmacode
-----------------
Developed by Laetus, Pharmacode is used for the identification of 
pharmaceuticals. The symbology is able to encode whole numbers between 3 and 
131070. 

6.1.11 Code 128
---------------
6.1.11.1 Standard Code 128 (ISO 15417)
--------------------------------------
One of the most ubiquitous one-dimensional barcode symbologies, Code 128 was 
developed in 1981 by Computer Identics. This symbology supports full ASCII text 
and uses a three-mode system to compress the data into a smaller symbol. Zint 
automatically switches between modes and adds a modulo-103 check digit. Code 
128 is the default barcode symbology used by Zint. In addition Zint supports 
the encoding of Latin-1 (non-English) characters in Code 128 symbols [1]. The 
Latin-1 character set is shown in Appendix A.

6.1.11.2 Code 128 Subset B
--------------------------
It is sometimes advantageous to stop Code 128 from using subset mode C which 
compresses numerical data. The BARCODE_CODE128B option (symbology 60) 
suppresses mode C in favour of mode B.

6.1.11.3 GS1-128
----------------
A variation of Code 128 also known as UCC/EAN-128, this symbology is defined by 
the GS1 General Specification. Application Identifiers (AIs) should be entered 
using [square bracket] notation. These will be converted to (round brackets) 
for the human readable text. This will allow round brackets to be used in the 
data strings to be encoded. Fixed length data should be entered at the 
appropriate length for correct encoding (see Appendix C). GS1-128 does not 
support extended ASCII characters. Check digits for GTIN data (AI 01) are not 
generated and need to be included in the input data. The following is an example
of a valid GS1-128 input:

zint --barcode=16 -d "[01]98898765432106[3202]012345[15]991231"

6.1.11.4 EAN-14
---------------
A shorter version of GS1-128 which encodes GTIN data only. A 13 digit number is 
required. The GTIN check digit and AI (01) are added by Zint.

6.1.11.5 NVE-18
---------------
A variation of Code 128 the "Nummer der Versandeinheit" standard includes both 
modulo-10 and modulo-103 check digits. NVE-18 requires a 17 digit numerical 
input and check digits are added by Zint.

6.1.11.6 HIBC Code 128
----------------------
This option adds a leading '+' character and a trailing modulo-49 check digit 
to a standard Code 128 symbol as required by the Health Industry Barcode 
standards. 

6.1.12 GS1 DataBar (ISO 24724)
------------------------------
Also known as RSS (Reduced Spaced Symbology) these symbols are due to replace 
GS1-128 symbols in accordance with the GS1 General Specification. If a GS1
DataBar symbol is to be printed with a 2D component as specified in ISO 24723
set option_1 = 2 or use the option --mode=2 at the command prompt. See section
6.3 of this manual to find out how to generate DataBar symbols with 2D components.

6.1.12.1 DataBar-14 and DataBar-14 Truncated
--------------------------------------------
Also known as RSS-14 this standard encodes a 13 digit item code. A check digit 
and application identifier of (01) are added by Zint. To produce a truncated
symbol set the symbol height to a value between 32 and 13. Normal DataBar-14
symbols should have a height of 33 or greater.

6.1.12.2 DataBar Limited
------------------------
Also known as RSS Limited this standard encodes a 13 digit item code and can be 
used in the same way as DataBar-14 above. DataBar Limited, however, is limited 
to data starting with digits 0 and 1 (i.e. numbers in the range 0 to 
1999999999999). As with DataBar-14 a check digit and application identifier of 
(01) are added by Zint.

6.1.12.3 DataBar Expanded
-------------------------
Also known as RSS Expanded this is a variable length symbology capable of 
encoding data from a number of AIs in a single symbol. AIs should be encased in 
[square brackets] in the input data. This will be converted to (rounded 
brackets) before it is included in the human readable text attached to the 
symbol. This method allows the inclusion of rounded brackets in the data to be 
encoded. GTIN data (AI 01) should also include the check digit data as this is 
not calculated by Zint when this symbology is encoded. Fixed length data should
be entered at the appropriate length for correct encoding (see Appendix C). The
following is an example of a valid DataBar Expanded input:

zint --barcode=31 -d "[01]98898765432106[3202]012345[15]991231" 

6.1.13 Korea Post Barcode
-------------------------
The Korean Postal Barcode is used to encode a six-digit number and includes one 
check digit. 

6.1.14 Channel Code
-------------------
A highly compressed symbol for numeric data. The number of channels in the 
symbol can be between 3 and 8 and this can be specified by setting the value of 
option_2. It can also be determined by the length of the input data e.g. a 
three character input string generates a 4 channel code by default. The maximum 
values permitted depend on the number of channels used as shown in the table 
below: 

--------------------------------------------
Channels  |  Minimum Value  |  Maximum Value
--------------------------------------------
3         |  00             |  26
4         |  000            |  292
5         |  0000           |  3493
6         |  00000          |  44072
7         |  000000         |  576688
8         |  0000000        |  7742862
--------------------------------------------

6.2 Stacked Symbologies
-----------------------
6.2.1 Basic Symbol Stacking
---------------------------
An early innovation to get more information into a symbol, used primarily in 
the vehicle industry, is to simply stack one-dimensional codes on top of each 
other. This can be achieved at the command prompt by giving more than one set 
of input data. For example

zint -d 'This' -d 'That'

will draw two Code 128 symbols, one on top of the other. The same result can be 
achieved using the API by executing the ZBarcode_Encode() function more than 
once on a symbol. For example:

my_symbol->symbology = BARCODE_CODE128;

error = ZBarcode_Encode(my_symbol, "This");

error = ZBarcode_Encode(my_symbol, "That");

error = ZBarcode_Print(my_symbol);

A more sophisticated method is to use some type of line indexing which 
indicates to the barcode reader which order the symbols should be read. This is 
demonstrated by the symbologies below.

6.2.2 Codablock-F
-----------------
This is a stacked symbology based on Code 128 which can encode ASCII code set
data up to a maximum length of 2725 characters. The width of the Codablock-F
symbol can be set using the --cols= option at the command line or option_2.
Alternatively the height (number of rows) can be set using the --rows= option
at the command line or by setting option_1. Zint does not support encoding of
GS1 data in Codablock-F symbols.

6.2.3 Code 16k (EN 12323)
-------------------------
Code 16k uses a Code 128 based system which can stack up to 16 rows in a block.
This gives a maximum data capacity of 77 characters or 154 numerical digits and
includes two modulo-107 check digits. Code 16k also supports extended ASCII
character encoding in the same manner as Code 128. 

6.2.4 PDF417 (ISO 15438)
------------------------
Heavily used in the parcel industry, the PDF417 symbology can encode a vast 
amount of data into a small space. Zint supports encoding up to the ISO 
standard maximum symbol size of 925 codewords which (at error correction level 
0) allows a maximum data size of 1850 text characters, or 2710 digits. The 
width of the generated PDF417 symbol can be specified at the command line using 
the --cols switch followed by a number between 1 and 30, and the amount of 
check digit information can be specified by using the --security switch 
followed by a number between 0 and 8 where the number of codewords used for 
check information is determined by 2^(value + 1). If using the API these values 
are assigned to option_2 and option_1 respectively. The default level of check 
information is determined by the amount of data being encoded. This symbology 
uses Latin-1 character encoding by default but also supports the ECI encoding 
mechanism. A separate symbology ID can be used to encode Health Industry 
Barcode (HIBC) data which adds a leading '+' character and a modulo-49 check 
digit to the encoded data. 

6.2.5 Compact PDF417
--------------------
Also known as truncated PDF417. Options are the same as for PDF417 above.

6.2.6 MicroPDF417 (ISO 24728)
-----------------------------
A variation of the PDF417 standard, MicroPDF417 is intended for applications 
where symbol size needs to be kept to a minimum. 34 predefined symbol sizes are 
available with 1 - 4 columns and 4 - 44 rows. The maximum size MicroPDF417 
symbol can hold 250 alphanumeric characters or 366 digits. The amount of error 
correction used is dependent on symbol size. The number of columns used can be 
determined using the --cols switch or option_2 as with PDF417. This symbology 
uses Latin-1 character encoding by default but also supports the ECI encoding 
mechanism. A separate symbology ID can be used to encode Health Industry 
Barcode (HIBC) data which adds a leading '+' character and a modulo-49 check 
digit to the encoded data. 

6.2.7 GS1 DataBar-14 Stacked (ISO 24724)
----------------------------------------
A stacked variation of the GS1 DataBar-14 symbol requiring the same input (see 
section 6.1.12.1). The height of this symbol is fixed. The data is encoded in 
two rows of bars with a central finder pattern. This symbol can be generated 
with a two-dimensional component to make a composite symbol. 

6.2.8 GS1 DataBar-14 Stacked Omnidirectional (ISO 24724)
--------------------------------------------------------
Another variation of the GS1 DataBar-14 symbol requiring the same input (see 
section 6.1.12.1). The data is encoded in two rows of bars with a central 
finder pattern. This symbol can be generated with a two-dimensional component 
to make a composite symbol. 

6.2.9 GS1 DataBar Expanded Stacked (ISO 24724)
----------------------------------------------
A stacked variation of the GS1 DataBar Expanded symbol for smaller packages. 
Input is the same as for GS1 DataBar Expanded (see section 6.1.12.3). In 
addition the width of the symbol can be altered using the --cols switch or 
option_2. In this case the number of columns relates to the number of character 
pairs on each row of the symbol. This symbol can be generated with a two-
dimensional component to make a composite symbol. For symbols with a 2D component
the number of columns must be at least 2.

6.2.10 Code 49
-------------
Developed in 1987 at Intermec, Code 49 is a cross between UPC and Code 39. It 
it one of the earliest stacked symbologies and influenced the design of Code 
16K a few years later. It supports full 7-bit ASCII input up to a maximum of 49 
characters or 81 numeric digits. GS1 data encoding is also supported. 

6.3 Composite Symbols (ISO 24723)
---------------------------------
Composite symbols employ a mixture of components to give more comprehensive 
information about a product. The permissible contents of a composite symbol is 
determined by the terms of the GS1 General Specification. Composite symbols 
consist of a linear component which can be an EAN, UPC, GS1-128 or GS1 DataBar 
symbol, a 2D component which is based on PDF417 or MicroPDF417, and a separator 
pattern. The type of linear component to be used is determined using the -b or 
--barcode= switch or by adjusting symbol->symbology as with other encoding 
methods. Valid values are shown below. 

--------------------------------------------------------------------------------
Numeric | Name                    | Barcode Name
Value   | 
--------------------------------------------------------------------------------
130     | BARCODE_EANX_CC         | Composite Symbol with EAN linear component
131     | BARCODE_EAN128_CC       | Composite Symbol with GS1-128 linear 
        |                         |    component
132     | BARCODE_RSS14_CC        | Composite Symbol with GS1 DataBar-14 linear 
        |                         |    component
133     | BARCODE_RSS_LTD_CC      | Composite Symbol with GS1 DataBar Limited 
        |                         |    component
134     | BARCODE_RSS_EXP_CC      | Composite Symbol with GS1 DataBar Extended 
        |                         |    component
135     | BARCODE_UPCA_CC         | Composite Symbol with UPC A linear component
136     | BARCODE_UPCE_CC         | Composite Symbol with UPC E linear component
137     | BARCODE_RSS14STACK_CC   | Composite Symbol with GS1 DataBar-14 
        |                         |    Stacked component
138     | BARCODE_RSS14_OMNI_CC   | Composite Symbol with GS1 DataBar-14 
        |                         |    Stacked Omnidirectional component
139     | BARCODE_RSS_EXPSTACK_CC | Composite Symbol with GS1 DataBar Expanded 
        |                         |    Stacked component
--------------------------------------------------------------------------------

The data to be encoded in the linear component of a composite symbol should be 
entered into a primary string with the data for the 2D component being entered 
in the normal way. To do this at the command prompt use the --primary= command. 
For example:

zint -b 130 --mode=1 --primary=331234567890 -d "[99]1234-abcd"

This creates an EAN-13 linear component with the data "331234567890" and a 2D 
CC-A (see below) component with the data "(99)1234-abcd". The same results can 
be achieved using the API as shown below:

my_symbol->symbology = 130;

my_symbol->option_1 = 1;

strcpy(my_symbol->primary, "331234567890");

ZBarcode_Encode_and_Print(my_symbol, "[99]1234-abcd");

EAN-2 and EAN-5 add-on data can be used with EAN and UPC symbols using the + 
symbol as described in section 6.1.3 and 5.1.4.

The 2D component of a composite symbol can use one of three systems: CC-A, CC-B 
and CC-C as described below. The 2D component type can be selected 
automatically by Zint dependant on the length of the input string. 
Alternatively the three methods can be accessed using the --mode= prompt 
followed by 1, 2 or 3 for CC-A, CC-B or CC-C respectively, or by using the 
option_1 variable as shown above. 

6.3.1 CC-A
----------
This system uses a variation of MicroPDF417 which optimised to fit into a small 
space. The size of the 2D component and the amount of error correction is 
determined by the amount of data to be encoded and the type of linear component 
which is being used. CC-A can encode up to 56 numeric digits or an alphanumeric 
string of shorter length. To select CC-A use --mode=1.

6.3.2 CC-B
----------
This system uses MicroPDF417 to encode the 2D component. The size of the 2D 
component and the amount of error correction is determined by the amount of 
data to be encoded and the type of linear component which is being used. CC-B 
can encode up to 338 numeric digits or an alphanumeric string of shorter 
length. To select CC-B use --mode=2.

6.3.3 CC-C
----------
This system uses PDF417 and can only be used in conjunction with a GS1-128 
linear component. CC-C can encode up to 2361 numeric digits or an alphanumeric 
string of shorter length. To select CC-C use --mode=3. 

6.4 Two-Track Symbols
---------------------
6.4.1 Two-Track Pharmacode
--------------------------
Developed by Laetus, Pharmacode Two-Track is an alternative system to 
Pharmacode One-Track used for the identification of pharmaceuticals. The 
symbology is able to encode whole numbers between 4 and 64570080.

6.4.2 PostNet
-------------
Used by the United States Postal Service until 2009, the PostNet barcode was 
used for encoding zip-codes on mail items. PostNet uses numerical input data 
and includes a modulo-10 check digit. While Zint will encode PostNet symbols of 
any length, standard lengths as used by USPS were PostNet6 (5 digits ZIP 
input), PostNet10 (5 digit ZIP + 4 digit user data) and PostNet12 (5 digit ZIP 
+ 6 digit user data).

6.4.3 PLANET
------------
Used by the United States Postal Service until 2009, the PLANET (Postal Alpha 
Numeric Encoding Technique) barcode was used for encoding routing data on mail 
items. Planet uses numerical input data and includes a modulo-10 check digit. 
While Zint will encode PLANET symbols of any length, standard lengths used by 
USPS were Planet12 (11 digit input) and Planet14 (13 digit input). 

6.5 4-State Postal Codes
------------------------
6.5.1 Australia Post 4-State Symbols
------------------------------------
6.5.1.1 Customer Barcodes
-------------------------
Australia Post Standard Customer Barcode, Customer Barcode 2 and Customer 
Barcode 3 are 37-bar, 52-bar and 67-bar specifications respectively, developed 
by Australia Post for printing Delivery Point ID (DPID) and customer 
information on mail items. Valid data characters are 0-9, A-Z, a-z, space and 
hash (#). A Format Control Code (FCC) is added by Zint and should not be 
included in the input data. Reed-Solomon error correction data is generated by 
Zint. Encoding behaviour is determined by the length of the input data 
according to the formula shown in the following table: 

-----------------------------------------------------------------
Input  |  Required Input Format    |  Symbol  |  FCC  |  Encoding
Length |                           |  Length  |       |  Table
-----------------------------------------------------------------
8      |  99999999                 |  37-bar  |  11   |  None
13     |  99999999AAAAA            |  52-bar  |  59   |  C
16     |  9999999999999999         |  52-bar  |  59   |  N
18     |  99999999AAAAAAAAAA       |  67-bar  |  62   |  C
23     |  99999999999999999999999  |  67-bar  |  62   |  N
-----------------------------------------------------------------

6.5.1.2 Reply Paid Barcode
--------------------------
A Reply Paid version of the Australia Post 4-State Barcode (FCC 45) which 
requires an 8-digit DPID input.

6.5.1.3 Routing Barcode
-----------------------
A Routing version of the Australia Post 4-State Barcode (FCC 87) which requires 
an 8-digit DPID input.

6.5.1.4 Redirect Barcode
------------------------
A Redirection version of the Australia Post 4-State Barcode (FCC 92) which 
requires an 8-digit DPID input. 

6.5.2 Dutch Post KIX Code
-------------------------
This Symbology is used by Royal Dutch TPG Post (Netherlands) for Postal code 
and automatic mail sorting. Data input can consist of numbers 0-9 and letters 
A-Z and needs to be 11 characters in length. No check digit is included.

6.5.3 Royal Mail 4-State Country Code (RM4SCC)
----------------------------------------------
The RM4SCC standard is used by the Royal Mail in the UK to encode postcode and 
customer data on mail items. Data input can consist of numbers 0-9 and letters 
A-Z and usually includes delivery postcode followed by house number. For 
example "W1J0TR01" for 1 Picadilly Circus in London. Check digit data is 
generated by Zint.

6.5.4 Royal Mail 4-State Mailmark
---------------------------------
Developed in 2014 as a replacement for RM4SCC this 4-state symbol includes
Reed Solomon error correction. Input is a pre-formatted alpanumeric string of
22 (for Barcode C) or 26 (for Barcode L) characters, producing a symbol with
66 or 78 bars respectively. Some of the permitted inputs include a number of
trailing space characters - these will be appended by Zint if not included in
the input data.

6.5.5 USPS OneCode
------------------
Also known as the Intelligent Mail Barcode and used in the US by the United 
States Postal Service (USPS), the OneCode system replaced the PostNet and 
PLANET symbologies in 2009. OneCode is a fixed length (65-bar) symbol which 
combines routing and customer information in a single symbol. Input data 
consists of a 20 digit tracking code, followed by a dash (-), followed by a 
delivery point zip-code which can be 0, 5, 9 or 11 digits in length. For 
example all of the following inputs are valid data entries:

"01234567094987654321"

"01234567094987654321-01234"

"01234567094987654321-012345678"

"01234567094987654321-01234567891"

6.5.6 Japanese Postal Code
--------------------------
Used for address data on mail items for Japan Post. Accepted values are 0-9, 
A-Z and Dash (-). A modulo 19 check digit is added by Zint.

6.6 Two-Dimensional Matrix Symbols
----------------------------------
6.6.1 Data Matrix ECC200 (ISO 16022)
------------------------------------
Also known as Semacode this symbology was developed in 1989 by Acuity CiMatrix 
in partnership with the US DoD and NASA. The symbol can encode a large amount 
of data in a small area. Data Matrix ECC200 can encode characters in the 
Latin-1 set by default but also supports encoding using other character sets 
using the ECI mechanism. It can also encode GS1 data. The size of the 
generated symbol can also be adjusted using the --vers= option or by setting 
option_2 as shown in the table below. A separate symbology ID can be used to 
encode Health Industry Barcode (HIBC) data which adds a leading '+' character 
and a modulo-49 check digit to the encoded data. Note that only ECC200 encoding 
is supported, the older standards have now been removed from Zint. 

---------------------
Input  |  Symbol Size
---------------------
1      |  10 x 10
2      |  12 x 12
3      |  14 x 14







|
|















|



|








|
|








|
|








|




|
|
|




|
|
|




|
|




|
|




|




|
|




|




|
|




|
|




|
|






|
|
|
|















|
|
|
|


















|
|
|
|








|
















|

|
|




|
|
|



|
|
|
|















|




|
|
|

|





|
|
|
|




|
|
|




|




|





|
|
|




|





|
|
|









|
|
|
|
|
|




|
|
|





|
|
|
|
|
|




|
|




|
|
|
|
|
|
|
|
|





|




|
|




|
|
|



|







|






|
|
|
|




|
|
|
|
|
|

|
|

|



|
|



|
|
|
|
|
|
















|
|
|




|
|










|
|
















|



|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







|
|
|
|
|
|
|
|
|
|



|
|
|
|



|
|
|
|



|
|
|
|






|
|
|
|



|
|
|
|
|
|
|
|



|


|

|

|

|



|

|

|



|
|
|




|
|










|


|
|
|
|
|
|



|
|
|
|




|
|
|
|




|
|
|





|
|




|
|
|
|
|




|
|
|
|
|







|
|
|
|
|
|
|
|














|




|




|
|



|
|




|
|
|
|





|







|
|
|
|
|
|












|




|
|
|
|
|
|
|
|
|
|
|
|







1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
                    |      PostScript files.
BARCODE_DOTTY_MODE  |  Plot a matrix symbol using dots rather than squares.
GS1_GS_SEPARATOR    |  Use GS instead FNC1 as GS1 separator.
--------------------------------------------------------------------------------

5.9 Setting the Input Mode
--------------------------
The way in which the input data is encoded can be set using the input_mode
property. Valid values are shown in the table below.

-----------------------------------------------------------------------------
Value         |  Effect
-----------------------------------------------------------------------------
DATA_MODE     |  Uses full ASCII range interpreted as Latin-1 or binary data.
UNICODE_MODE  |  Uses pre-formatted UTF-8 input.
GS1_MODE      |  Encodes GS1 data using FNC1 characters.
ESCAPE_MODE   |  Process input data for escape sequences.
-----------------------------------------------------------------------------

DATA_MODE, UNICODE_MODE and GS1_MODE are mutually exclusive, whereas
ESCAPE_MODE is optional. So, for example, you can set

my_symbol->input_mode = UNICODE_MODE + ESCAPE_MODE;

whereas

my_symbol->input_mode = DATA_MODE + GS1_MODE;

is not valid. Permissible escape sequences are listed in section 4.1.


5.10 Verifying Symbology Availability
-------------------------------------
An additional function available in the API is defined as:

int ZBarcode_ValidID(int symbol_id);

This function allows you to check whether a given symbology is available. A
non-zero return value indicates that the given symbology is available. For
example:

if(ZBarcode_ValidID(BARCODE_PDF417) != 0) {
    printf("PDF417 available");
} else {
    printf("PDF417 not available");
}

[1] This value is ignored for Australia Post 4-State Barcodes, PostNet, PLANET,
USPS OneCode, RM4SCC, PDF417, Data Matrix, Maxicode, QR Code, GS1
DataBar-14 Stacked, PDF417 and MicroPDF417 - all of which have a fixed height.

[2] This value is ignored for Code 16k, Codablock-F and ITF-14 symbols.

6. Types of Symbology
=====================
6.1 One-Dimensional Symbols
---------------------------
One-Dimensional Symbols are what most people associate with the term barcode.
They consist of a number of bars and a number of spaces of differing widths.

6.1.1 Code 11
-------------
Developed by Intermec in 1977, Code 11 is similar to Code 2 of 5 Matrix and is
primarily used in telecommunications. The symbol can encode any length string
consisting of the digits 0-9 and the dash character (-). One modulo-11 check
digit is calculated.

6.1.2 Code 2 of 5
-----------------
Code 2 of 5 is a family of one-dimensional symbols, 8 of which are supported by
Zint. Note that the names given to these standards alters from one source to
another so you should take care to ensure that you have the right barcode type
before using these standards.

6.1.2.1 Standard Code 2 of 5
----------------------------
Also known as Code 2 of 5 Matrix is a self-checking code used in industrial
applications and photo development. Standard Code 2 of 5 will encode any length
numeric input (digits 0-9).

6.1.2.2 IATA Code 2 of 5
------------------------
Used for baggage handling in the air-transport industry by the International
Air Transport Agency, this self-checking code will encode any length numeric input
(digits 0-9) and does not include a check digit.

6.1.2.3 Industrial Code 2 of 5
------------------------------
Industrial Code 2 of 5 can encode any length numeric input (digits 0-9) and
does not include a check digit.

6.1.2.4 Interleaved Code 2 of 5
-------------------------------
This self-checking symbology encodes pairs of numbers, and so can only encode
an even number of digits (0-9). If an odd number of digits is entered a leading
zero is added by Zint. No check digit is added.

6.1.2.5 Code 2 of 5 Data Logic
------------------------------
Data Logic does not include a check digit and can encode any length numeric
input (digits 0-9).

6.1.2.6 ITF-14
--------------
ITF-14, also known as UPC Shipping Container Symbol or Case Code is based on
Interleaved Code 2 of 5 and requires a 13 digit numeric input (digits 0-9). One
modulo-10 check digit is added by Zint.

6.1.2.7 Deutsche Post Leitcode
------------------------------
Leitcode is based on Interleaved Code 2 of 5 and is used by Deutsche Post for
mailing purposes. Leitcode requires a 13-digit numerical input and includes a
check digit.

6.1.2.8 Deutsche Post Identcode
-------------------------------
Identcode is based on Interleaved Code 2 of 5 and is used by Deutsche Post for
mailing purposes. Identcode requires an 11-digit numerical input and includes a
check digit.

6.1.3 Universal Product Code (EN 797)
-------------------------------------
6.1.3.1 UPC Version A
---------------------
UPC-A is used in the United States for retail applications. The symbol requires
an 11 digit article number. The check digit is calculated by Zint. In addition
EAN-2 and EAN-5 add-on symbols can be added using the + character. For example,
to draw a UPC-A symbol with the data 72527270270 with an EAN-5 add-on showing
the data 12345 use the command:

zint --barcode=34 -d 72527270270+12345

or encode a data string with the + character included:

my_symbol->symbology = BARCODE_UPCA;

error = ZBarcode_Encode_and_Print(my_symbol, "72527270270+12345");

If your input data already includes the check digit symbology 35 can be used
which takes a 12 digit input and validates the check digit before encoding.

6.1.3.2 UPC Version E
---------------------
UPC-E is a zero-compressed version of UPC-A developed for smaller packages. The
code requires a 6 digit article number (digits 0-9). The check digit is
calculated by Zint. EAN-2 and EAN-5 add-on symbols can be added using the +
character as with UPC-A. In addition Zint also supports Number System 1
encoding by entering a 7-digit article number stating with the digit 1. For
example:

zint --barcode=37 -d 1123456

or

my_symbol->symbology = BARCODE_UPCE;

error = ZBarcode_Encode_and_Print(my_symbol, "1123456");

If your input data already includes the check digit symbology 38 can be used
which takes a 7 or 8 digit input and validates the check digit before encoding.

6.1.4 European Article Number (EN 797)
--------------------------------------
6.1.4.1 EAN-2, EAN-5, EAN-8 and EAN-13
--------------------------------------
The EAN system is used in retail across Europe and includes standards for EAN-2
and EAN-5 add-on codes, EAN-8 and EAN-13 which encode 2, 5, 7 or 12 digit
numbers respectively. Zint will decide which symbology to use depending on the
length of the input data. In addition EAN-2 and EAN-5 add-on symbols can be
added using the + symbol as with UPC symbols. For example:

zint --barcode=13 -d 54321

will encode a stand-alone EAN-5, whereas

zint --barcode=13 -d 7432365+54321

will encode an EAN-8 symbol with an EAN-5 add-on. As before these results can
be achieved using the API:

my_symbol->symbology = BARCODE_EANX;

error = ZBarcode_Encode_and_Print(my_symbol, "54321");

error = ZBarcode_Encode_and_Print(my_symbol, "7432365+54321");

All of the EAN symbols include check digits which are added by Zint.

If you are encoding an EAN-8 or EAN-13 symbol and your data already includes
the check digit then you can use symbology 14 which takes an 8 or 13 digit input
and validates the check digit before encoding.

6.1.4.2 SBN, ISBN and ISBN-13
-----------------------------
EAN-13 symbols (also known as Bookland EAN-13) can also be produced from
9-digit SBN, 10-digit ISBN or 13-digit ISBN-13 data. The relevant check digit needs
to be present in the input data and will be verified before the symbol is
generated. In addition EAN-2 and EAN-5 add-on symbols can be added using the +
symbol as with UPC symbols.

6.1.5 Plessey
-------------
Also known as Plessey Code, this symbology was developed by the Plessey Company
Ltd. in the UK. The symbol can encode any length data consisting of digits
(0-9) or letters A-F and includes a CRC check digit.

6.1.6 MSI Plessey
-----------------
Based on Plessey and developed by MSE Data Corporation, MSI Plessey is
available with a range of check digit options available by setting option_2 or
by using the --ver= switch. Any length numeric (digits 0-9) input can be
encoded. The table below shows the options available:

-------------------------------------------
Value of option_2  |  Check Digits
-------------------------------------------
0                  |  None
1                  |  Modulo-10
2                  |  Modulo-10 & Modulo-10
3                  |  Modulo-11
4                  |  Modulo-11 & Modulo-10
-------------------------------------------

6.1.7 Telepen
-------------
6.1.7.1 Telepen Alpha
---------------------
Telepen Alpha was developed by SB Electronic Systems Limited and can encode any
length of ASCII text input. Telepen includes a modulo-127 check digit.

6.1.7.2 Telepen Numeric
-----------------------
Telepen Numeric allows compression of numeric data into a Telepen symbol. Data
can consist of pairs of numbers or pairs consisting of a numerical digit
followed an X character. For example: 466333 and 466X33 are valid codes whereas
46X333 is not (the digit pair "X3" is not valid). Telepen Numeric includes a
modulo-127 check digit which is added by Zint.

6.1.8 Code 39
-------------
6.1.8.1 Standard Code 39 (ISO 16388)
------------------------------------
Standard Code 39 was developed in 1974 by Intermec. Input data can be of any
length and can include the characters 0-9, A-Z, dash (-), full stop (.), space,
asterisk (*), dollar ($), slash (/), plus (+) and percent (%). The standard
does not require a check digit but a modulo-43 check digit can be added if
required by setting option_2 = 1 or using --ver=1.

6.1.8.2 Extended Code 39
------------------------
Also known as Code 39e and Code39+, this symbology expands on Standard Code 39
to provide support to the full ASCII character set. The standard does not
require a check digit but a modulo-43 check digit can be added if required by
setting option_2 = 1 or using --ver=1.

6.1.8.3 Code 93
---------------
A variation of Extended Code 39, Code 93 also supports full ASCII text. Two
check digits are added by Zint.

6.1.8.4 PZN
-----------
PZN is a Code 39 based symbology used by the pharmaceutical industry in
Germany. PZN encodes a 6 digit number to which Zint will add a modulo-10
check digit.

6.1.8.5 LOGMARS
---------------
LOGMARS (Logistics Applications of Automated Marking and Reading Symbols) is a
variation of the Code 39 symbology used by the US Department of Defence.
LOGMARS encodes the same character set as Standard Code 39 and adds a modulo-43
check digit.

6.1.8.6 Code 32
---------------
A variation of Code 39 used by the Italian Ministry of Health ("Ministero della
Sanità") for encoding identifiers on pharmaceutical products. This symbology
requires a numeric input up to 8 digits in length. A check digit is added by Zint.

6.1.8.7 HIBC Code 39
--------------------
This option adds a leading '+' character and a trailing modulo-49 check digit
to a standard Code 39 symbol as required by the Health Industry Barcode
standards.

6.1.8.8 Vehicle Identification Number (VIN)
-------------------------------------------
This option includes a verification stage for vehicle identification numbers
used in North America which include a check digit. For European vehicle
identification numbers use Standard Code 39.

6.1.9 Codabar (EN 798)
----------------------
Also known as NW-7, Monarch, ABC Codabar, USD-4, Ames Code and Code 27, this
symbology was developed in 1972 by Monarch Marketing Systems for retail
purposes. The American Blood Commission adopted Codabar in 1977 as the standard
symbology for blood identification. Codabar can encode any length string
starting and ending with the letters A-D and containing between these letters
the numbers 0-9, dash (-), dollar ($), colon (:), slash (/), full stop (.) or
plus (+). No check digit is generated.

6.1.10 Pharmacode
-----------------
Developed by Laetus, Pharmacode is used for the identification of
pharmaceuticals. The symbology is able to encode whole numbers between 3 and
131070.

6.1.11 Code 128
---------------
6.1.11.1 Standard Code 128 (ISO 15417)
--------------------------------------
One of the most ubiquitous one-dimensional barcode symbologies, Code 128 was
developed in 1981 by Computer Identics. This symbology supports full ASCII text
and uses a three-mode system to compress the data into a smaller symbol. Zint
automatically switches between modes and adds a modulo-103 check digit. Code
128 is the default barcode symbology used by Zint. In addition Zint supports
the encoding of Latin-1 (non-English) characters in Code 128 symbols [1]. The
Latin-1 character set is shown in Appendix A.

6.1.11.2 Code 128 Subset B
--------------------------
It is sometimes advantageous to stop Code 128 from using subset mode C which
compresses numerical data. The BARCODE_CODE128B option (symbology 60)
suppresses mode C in favour of mode B.

6.1.11.3 GS1-128
----------------
A variation of Code 128 also known as UCC/EAN-128, this symbology is defined by
the GS1 General Specification. Application Identifiers (AIs) should be entered
using [square bracket] notation. These will be converted to (round brackets)
for the human readable text. This will allow round brackets to be used in the
data strings to be encoded. Fixed length data should be entered at the
appropriate length for correct encoding. GS1-128 does not support extended
ASCII characters. Check digits for GTIN data (AI 01) are not generated and
need to be included in the input data. The following is an example of a valid
GS1-128 input:

zint --barcode=16 -d "[01]98898765432106[3202]012345[15]991231"

6.1.11.4 EAN-14
---------------
A shorter version of GS1-128 which encodes GTIN data only. A 13 digit number is
required. The GTIN check digit and AI (01) are added by Zint.

6.1.11.5 NVE-18
---------------
A variation of Code 128 the "Nummer der Versandeinheit" standard includes both
modulo-10 and modulo-103 check digits. NVE-18 requires a 17 digit numerical
input and check digits are added by Zint.

6.1.11.6 HIBC Code 128
----------------------
This option adds a leading '+' character and a trailing modulo-49 check digit
to a standard Code 128 symbol as required by the Health Industry Barcode
standards.

6.1.12 GS1 DataBar (ISO 24724)
------------------------------
Also known as RSS (Reduced Spaced Symbology) these symbols are due to replace
GS1-128 symbols in accordance with the GS1 General Specification. If a GS1
DataBar symbol is to be printed with a 2D component as specified in ISO 24723
set option_1 = 2 or use the option --mode=2 at the command prompt. See section
6.3 of this manual to find out how to generate DataBar symbols with 2D components.

6.1.12.1 DataBar-14 and DataBar-14 Truncated
--------------------------------------------
Also known as RSS-14 this standard encodes a 13 digit item code. A check digit
and application identifier of (01) are added by Zint. To produce a truncated
symbol set the symbol height to a value between 32 and 13. Normal DataBar-14
symbols should have a height of 33 or greater.

6.1.12.2 DataBar Limited
------------------------
Also known as RSS Limited this standard encodes a 13 digit item code and can be
used in the same way as DataBar-14 above. DataBar Limited, however, is limited
to data starting with digits 0 and 1 (i.e. numbers in the range 0 to
1999999999999). As with DataBar-14 a check digit and application identifier of
(01) are added by Zint.

6.1.12.3 DataBar Expanded
-------------------------
Also known as RSS Expanded this is a variable length symbology capable of
encoding data from a number of AIs in a single symbol. AIs should be encased in
[square brackets] in the input data. This will be converted to (rounded
brackets) before it is included in the human readable text attached to the
symbol. This method allows the inclusion of rounded brackets in the data to be
encoded. GTIN data (AI 01) should also include the check digit data as this is
not calculated by Zint when this symbology is encoded. Fixed length data should
be entered at the appropriate length for correct encoding. The following is
an example of a valid DataBar Expanded input:

zint --barcode=31 -d "[01]98898765432106[3202]012345[15]991231"

6.1.13 Korea Post Barcode
-------------------------
The Korean Postal Barcode is used to encode a six-digit number and includes one
check digit.

6.1.14 Channel Code
-------------------
A highly compressed symbol for numeric data. The number of channels in the
symbol can be between 3 and 8 and this can be specified by setting the value of
option_2. It can also be determined by the length of the input data e.g. a
three character input string generates a 4 channel code by default. The maximum
values permitted depend on the number of channels used as shown in the table
below:

--------------------------------------------
Channels  |  Minimum Value  |  Maximum Value
--------------------------------------------
3         |  00             |  26
4         |  000            |  292
5         |  0000           |  3493
6         |  00000          |  44072
7         |  000000         |  576688
8         |  0000000        |  7742862
--------------------------------------------

6.2 Stacked Symbologies
-----------------------
6.2.1 Basic Symbol Stacking
---------------------------
An early innovation to get more information into a symbol, used primarily in
the vehicle industry, is to simply stack one-dimensional codes on top of each
other. This can be achieved at the command prompt by giving more than one set
of input data. For example

zint -d 'This' -d 'That'

will draw two Code 128 symbols, one on top of the other. The same result can be
achieved using the API by executing the ZBarcode_Encode() function more than
once on a symbol. For example:

my_symbol->symbology = BARCODE_CODE128;

error = ZBarcode_Encode(my_symbol, "This");

error = ZBarcode_Encode(my_symbol, "That");

error = ZBarcode_Print(my_symbol);

A more sophisticated method is to use some type of line indexing which
indicates to the barcode reader which order the symbols should be read. This is
demonstrated by the symbologies below.

6.2.2 Codablock-F
-----------------
This is a stacked symbology based on Code 128 which can encode ASCII code set
data up to a maximum length of 2725 characters. The width of the Codablock-F
symbol can be set using the --cols= option at the command line or option_2.
Alternatively the height (number of rows) can be set using the --rows= option
at the command line or by setting option_1. Zint does not support encoding of
GS1 data in Codablock-F symbols.

6.2.3 Code 16k (EN 12323)
-------------------------
Code 16k uses a Code 128 based system which can stack up to 16 rows in a block.
This gives a maximum data capacity of 77 characters or 154 numerical digits and
includes two modulo-107 check digits. Code 16k also supports extended ASCII
character encoding in the same manner as Code 128.

6.2.4 PDF417 (ISO 15438)
------------------------
Heavily used in the parcel industry, the PDF417 symbology can encode a vast
amount of data into a small space. Zint supports encoding up to the ISO
standard maximum symbol size of 925 codewords which (at error correction level
0) allows a maximum data size of 1850 text characters, or 2710 digits. The
width of the generated PDF417 symbol can be specified at the command line using
the --cols switch followed by a number between 1 and 30, and the amount of
check digit information can be specified by using the --secure switch
followed by a number between 0 and 8 where the number of codewords used for
check information is determined by 2^(value + 1). If using the API these values
are assigned to option_2 and option_1 respectively. The default level of check
information is determined by the amount of data being encoded. This symbology
uses Latin-1 character encoding by default but also supports the ECI encoding
mechanism. A separate symbology ID can be used to encode Health Industry
Barcode (HIBC) data which adds a leading '+' character and a modulo-49 check
digit to the encoded data.

6.2.5 Compact PDF417
--------------------
Also known as truncated PDF417. Options are the same as for PDF417 above.

6.2.6 MicroPDF417 (ISO 24728)
-----------------------------
A variation of the PDF417 standard, MicroPDF417 is intended for applications
where symbol size needs to be kept to a minimum. 34 predefined symbol sizes are
available with 1 - 4 columns and 4 - 44 rows. The maximum size MicroPDF417
symbol can hold 250 alphanumeric characters or 366 digits. The amount of error
correction used is dependent on symbol size. The number of columns used can be
determined using the --cols switch or option_2 as with PDF417. This symbology
uses Latin-1 character encoding by default but also supports the ECI encoding
mechanism. A separate symbology ID can be used to encode Health Industry
Barcode (HIBC) data which adds a leading '+' character and a modulo-49 check
digit to the encoded data.

6.2.7 GS1 DataBar-14 Stacked (ISO 24724)
----------------------------------------
A stacked variation of the GS1 DataBar-14 symbol requiring the same input (see
section 6.1.12.1). The height of this symbol is fixed. The data is encoded in
two rows of bars with a central finder pattern. This symbol can be generated
with a two-dimensional component to make a composite symbol.

6.2.8 GS1 DataBar-14 Stacked Omnidirectional (ISO 24724)
--------------------------------------------------------
Another variation of the GS1 DataBar-14 symbol requiring the same input (see
section 6.1.12.1). The data is encoded in two rows of bars with a central
finder pattern. This symbol can be generated with a two-dimensional component
to make a composite symbol.

6.2.9 GS1 DataBar Expanded Stacked (ISO 24724)
----------------------------------------------
A stacked variation of the GS1 DataBar Expanded symbol for smaller packages.
Input is the same as for GS1 DataBar Expanded (see section 6.1.12.3). In
addition the width of the symbol can be altered using the --cols switch or
option_2. In this case the number of columns relates to the number of character
pairs on each row of the symbol. This symbol can be generated with a two-
dimensional component to make a composite symbol. For symbols with a 2D component
the number of columns must be at least 2.

6.2.10 Code 49
-------------
Developed in 1987 at Intermec, Code 49 is a cross between UPC and Code 39. It
it one of the earliest stacked symbologies and influenced the design of Code
16K a few years later. It supports full 7-bit ASCII input up to a maximum of 49
characters or 81 numeric digits. GS1 data encoding is also supported.

6.3 Composite Symbols (ISO 24723)
---------------------------------
Composite symbols employ a mixture of components to give more comprehensive
information about a product. The permissible contents of a composite symbol is
determined by the terms of the GS1 General Specification. Composite symbols
consist of a linear component which can be an EAN, UPC, GS1-128 or GS1 DataBar
symbol, a 2D component which is based on PDF417 or MicroPDF417, and a separator
pattern. The type of linear component to be used is determined using the -b or
--barcode= switch or by adjusting symbol->symbology as with other encoding
methods. Valid values are shown below.

--------------------------------------------------------------------------------
Numeric | Name                    | Barcode Name
Value   |
--------------------------------------------------------------------------------
130     | BARCODE_EANX_CC         | Composite Symbol with EAN linear component
131     | BARCODE_EAN128_CC       | Composite Symbol with GS1-128 linear
        |                         |    component
132     | BARCODE_RSS14_CC        | Composite Symbol with GS1 DataBar-14 linear
        |                         |    component
133     | BARCODE_RSS_LTD_CC      | Composite Symbol with GS1 DataBar Limited
        |                         |    component
134     | BARCODE_RSS_EXP_CC      | Composite Symbol with GS1 DataBar Extended
        |                         |    component
135     | BARCODE_UPCA_CC         | Composite Symbol with UPC A linear component
136     | BARCODE_UPCE_CC         | Composite Symbol with UPC E linear component
137     | BARCODE_RSS14STACK_CC   | Composite Symbol with GS1 DataBar-14
        |                         |    Stacked component
138     | BARCODE_RSS14_OMNI_CC   | Composite Symbol with GS1 DataBar-14
        |                         |    Stacked Omnidirectional component
139     | BARCODE_RSS_EXPSTACK_CC | Composite Symbol with GS1 DataBar Expanded
        |                         |    Stacked component
--------------------------------------------------------------------------------

The data to be encoded in the linear component of a composite symbol should be
entered into a primary string with the data for the 2D component being entered
in the normal way. To do this at the command prompt use the --primary= command.
For example:

zint -b 130 --mode=1 --primary=331234567890 -d "[99]1234-abcd"

This creates an EAN-13 linear component with the data "331234567890" and a 2D
CC-A (see below) component with the data "(99)1234-abcd". The same results can
be achieved using the API as shown below:

my_symbol->symbology = 130;

my_symbol->option_1 = 1;

strcpy(my_symbol->primary, "331234567890");

ZBarcode_Encode_and_Print(my_symbol, "[99]1234-abcd");

EAN-2 and EAN-5 add-on data can be used with EAN and UPC symbols using the +
symbol as described in section 6.1.3 and 5.1.4.

The 2D component of a composite symbol can use one of three systems: CC-A, CC-B
and CC-C as described below. The 2D component type can be selected
automatically by Zint dependant on the length of the input string.
Alternatively the three methods can be accessed using the --mode= prompt
followed by 1, 2 or 3 for CC-A, CC-B or CC-C respectively, or by using the
option_1 variable as shown above.

6.3.1 CC-A
----------
This system uses a variation of MicroPDF417 which optimised to fit into a small
space. The size of the 2D component and the amount of error correction is
determined by the amount of data to be encoded and the type of linear component
which is being used. CC-A can encode up to 56 numeric digits or an alphanumeric
string of shorter length. To select CC-A use --mode=1.

6.3.2 CC-B
----------
This system uses MicroPDF417 to encode the 2D component. The size of the 2D
component and the amount of error correction is determined by the amount of
data to be encoded and the type of linear component which is being used. CC-B
can encode up to 338 numeric digits or an alphanumeric string of shorter
length. To select CC-B use --mode=2.

6.3.3 CC-C
----------
This system uses PDF417 and can only be used in conjunction with a GS1-128
linear component. CC-C can encode up to 2361 numeric digits or an alphanumeric
string of shorter length. To select CC-C use --mode=3.

6.4 Two-Track Symbols
---------------------
6.4.1 Two-Track Pharmacode
--------------------------
Developed by Laetus, Pharmacode Two-Track is an alternative system to
Pharmacode One-Track used for the identification of pharmaceuticals. The
symbology is able to encode whole numbers between 4 and 64570080.

6.4.2 PostNet
-------------
Used by the United States Postal Service until 2009, the PostNet barcode was
used for encoding zip-codes on mail items. PostNet uses numerical input data
and includes a modulo-10 check digit. While Zint will encode PostNet symbols of
any length, standard lengths as used by USPS were PostNet6 (5 digits ZIP
input), PostNet10 (5 digit ZIP + 4 digit user data) and PostNet12 (5 digit ZIP
+ 6 digit user data).

6.4.3 PLANET
------------
Used by the United States Postal Service until 2009, the PLANET (Postal Alpha
Numeric Encoding Technique) barcode was used for encoding routing data on mail
items. PLANET uses numerical input data and includes a modulo-10 check digit.
While Zint will encode PLANET symbols of any length, standard lengths used by
USPS were Planet12 (11 digit input) and Planet14 (13 digit input).

6.5 4-State Postal Codes
------------------------
6.5.1 Australia Post 4-State Symbols
------------------------------------
6.5.1.1 Customer Barcodes
-------------------------
Australia Post Standard Customer Barcode, Customer Barcode 2 and Customer
Barcode 3 are 37-bar, 52-bar and 67-bar specifications respectively, developed
by Australia Post for printing Delivery Point ID (DPID) and customer
information on mail items. Valid data characters are 0-9, A-Z, a-z, space and
hash (#). A Format Control Code (FCC) is added by Zint and should not be
included in the input data. Reed-Solomon error correction data is generated by
Zint. Encoding behaviour is determined by the length of the input data
according to the formula shown in the following table:

-----------------------------------------------------------------
Input  |  Required Input Format    |  Symbol  |  FCC  |  Encoding
Length |                           |  Length  |       |  Table
-----------------------------------------------------------------
8      |  99999999                 |  37-bar  |  11   |  None
13     |  99999999AAAAA            |  52-bar  |  59   |  C
16     |  9999999999999999         |  52-bar  |  59   |  N
18     |  99999999AAAAAAAAAA       |  67-bar  |  62   |  C
23     |  99999999999999999999999  |  67-bar  |  62   |  N
-----------------------------------------------------------------

6.5.1.2 Reply Paid Barcode
--------------------------
A Reply Paid version of the Australia Post 4-State Barcode (FCC 45) which
requires an 8-digit DPID input.

6.5.1.3 Routing Barcode
-----------------------
A Routing version of the Australia Post 4-State Barcode (FCC 87) which requires
an 8-digit DPID input.

6.5.1.4 Redirect Barcode
------------------------
A Redirection version of the Australia Post 4-State Barcode (FCC 92) which
requires an 8-digit DPID input.

6.5.2 Dutch Post KIX Code
-------------------------
This Symbology is used by Royal Dutch TPG Post (Netherlands) for Postal code
and automatic mail sorting. Data input can consist of numbers 0-9 and letters
A-Z and needs to be 11 characters in length. No check digit is included.

6.5.3 Royal Mail 4-State Country Code (RM4SCC)
----------------------------------------------
The RM4SCC standard is used by the Royal Mail in the UK to encode postcode and
customer data on mail items. Data input can consist of numbers 0-9 and letters
A-Z and usually includes delivery postcode followed by house number. For
example "W1J0TR01" for 1 Piccadilly Circus in London. Check digit data is
generated by Zint.

6.5.4 Royal Mail 4-State Mailmark
---------------------------------
Developed in 2014 as a replacement for RM4SCC this 4-state symbol includes
Reed Solomon error correction. Input is a pre-formatted alphanumeric string of
22 (for Barcode C) or 26 (for Barcode L) characters, producing a symbol with
66 or 78 bars respectively. Some of the permitted inputs include a number of
trailing space characters - these will be appended by Zint if not included in
the input data.

6.5.5 USPS OneCode
------------------
Also known as the Intelligent Mail Barcode and used in the US by the United
States Postal Service (USPS), the OneCode system replaced the PostNet and
PLANET symbologies in 2009. OneCode is a fixed length (65-bar) symbol which
combines routing and customer information in a single symbol. Input data
consists of a 20 digit tracking code, followed by a dash (-), followed by a
delivery point zip-code which can be 0, 5, 9 or 11 digits in length. For
example all of the following inputs are valid data entries:

"01234567094987654321"

"01234567094987654321-01234"

"01234567094987654321-012345678"

"01234567094987654321-01234567891"

6.5.6 Japanese Postal Code
--------------------------
Used for address data on mail items for Japan Post. Accepted values are 0-9,
A-Z and Dash (-). A modulo 19 check digit is added by Zint.

6.6 Two-Dimensional Matrix Symbols
----------------------------------
6.6.1 Data Matrix (ISO 16022)
-----------------------------
Also known as Semacode this symbology was developed in 1989 by Acuity CiMatrix
in partnership with the US DoD and NASA. The symbol can encode a large amount
of data in a small area. Data Matrix can encode characters in the
Latin-1 set by default but also supports encoding using other character sets
using the ECI mechanism. It can also encode GS1 data. The size of the
generated symbol can also be adjusted using the --vers= option or by setting
option_2 as shown in the table below. A separate symbology ID can be used to
encode Health Industry Barcode (HIBC) data which adds a leading '+' character
and a modulo-49 check digit to the encoded data. Note that only ECC200 encoding
is supported, the older standards have now been removed from Zint.

---------------------
Input  |  Symbol Size
---------------------
1      |  10 x 10
2      |  12 x 12
3      |  14 x 14
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
30     |  16 x 48
---------------------

When using automatic symbol sizes you can force Zint to use square symbols
(versions 1-24) at the command line by using the option --square and when
using the API by setting the value option_3 = DM_SQUARE.

Data Matrix Rectangular Extension (ISO/IEC21471) codes may be generated with the 
following values as before:

---------------------
Input  |  Symbol Size
---------------------
31     |  8 x 48
32     |  8 x 64







|







1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
30     |  16 x 48
---------------------

When using automatic symbol sizes you can force Zint to use square symbols
(versions 1-24) at the command line by using the option --square and when
using the API by setting the value option_3 = DM_SQUARE.

Data Matrix Rectangular Extension (ISO/IEC21471) codes may be generated with the
following values as before:

---------------------
Input  |  Symbol Size
---------------------
31     |  8 x 48
32     |  8 x 64
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
45     |  24 x 64
46     |  26 x 40
47     |  26 x 48
48     |  26 x 64
---------------------


DMRE symbol sizes may be activated in automatic size mode using the option 
--dmre or by the API option_3 = DM_DMRE

GS1 symbology may use FNC1 (prefered) or GS as separator.
Use the option --gssep to change to GS or use the API
output_options+=GS1_GS_SEPARATOR

6.6.2 QR Code (ISO 18004)
-------------------------
Also known as Quick Response Code this symbology was developed by Denso. Four 
levels of error correction are available using the --secure= option or by
setting option_1 as shown in the following table. 

-------------------------------------------------------------------------
Input  |  ECC Level    |  Error Correction Capacity  |  Recovery Capacity
-------------------------------------------------------------------------
1      |  L (default)  |  Approx 20% of symbol       |  Approx 7%
2      |  M            |  Approx 37% of symbol       |  Approx 15%
3      |  Q            |  Approx 55% of symbol       |  Approx 25%
4      |  H            |  Approx 65% of symbol       |  Approx 30%
-------------------------------------------------------------------------

The size of the symbol can be set by using the --vers= option or setting 
option_2 to the QR Code version required (1-40). The size of symbol generated 
is shown in the table below. 

---------------------
Input  |  Symbol Size
---------------------
1      |  21 x 21
2      |  25 x 25
3      |  29 x 29







|


|





|

|










|
|
|







1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
45     |  24 x 64
46     |  26 x 40
47     |  26 x 48
48     |  26 x 64
---------------------


DMRE symbol sizes may be activated in automatic size mode using the option
--dmre or by the API option_3 = DM_DMRE

GS1 symbology may use FNC1 (preferred) or GS as separator.
Use the option --gssep to change to GS or use the API
output_options+=GS1_GS_SEPARATOR

6.6.2 QR Code (ISO 18004)
-------------------------
Also known as Quick Response Code this symbology was developed by Denso. Four
levels of error correction are available using the --secure= option or by
setting option_1 as shown in the following table.

-------------------------------------------------------------------------
Input  |  ECC Level    |  Error Correction Capacity  |  Recovery Capacity
-------------------------------------------------------------------------
1      |  L (default)  |  Approx 20% of symbol       |  Approx 7%
2      |  M            |  Approx 37% of symbol       |  Approx 15%
3      |  Q            |  Approx 55% of symbol       |  Approx 25%
4      |  H            |  Approx 65% of symbol       |  Approx 30%
-------------------------------------------------------------------------

The size of the symbol can be set by using the --vers= option or setting
option_2 to the QR Code version required (1-40). The size of symbol generated
is shown in the table below.

---------------------
Input  |  Symbol Size
---------------------
1      |  21 x 21
2      |  25 x 25
3      |  29 x 29
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
































































1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
36     |  161 x 161
38     |  165 x 165
38     |  169 x 169
39     |  173 x 173
40     |  177 x 177
---------------------

The maximum capacity of a (version 40) QR Code symbol is 7089 numeric digits, 
4296 alphanumeric characters or 2953 bytes of data. QR Code symbols can also be 
used to encode GS1 data. QR Code symbols can by default encode characters in 
the Latin-1 set and Kanji characters which are members of the Shift-JIS 
encoding scheme. In addition QR Code supports using other character sets using 
the ECI mechanism. Input should usually be entered as Unicode (UTF-8) with 
conversion to Shift-JIS being carried out by Zint. A separate symbology ID can
be used to encode Health Industry Barcode (HIBC) data which adds a leading '+'
character and a modulo-49 check digit to the encoded data. 

6.6.3 Micro QR Code (ISO 18004)
-------------------------------
A miniature version of the QR Code symbol for short messages. ECC levels can be 
selected as for QR Code (above). QR Code symbols can encode characters in the 
Latin-1 set and Kanji characters which are members of the Shift-JIS encoding 
scheme. Input should be entered as a UTF-8 stream with conversion to Shift-JIS 
being carried out automatically by Zint. A preferred symbol size can be 
selected by using the --vers= option or by setting option_2 although the actual 
version used by Zint may be different if required by the input data. The table 
below shows the possible sizes: 

---------------------------------
Input  |  Version  |  Symbol Size
---------------------------------
1      |  M1       |  11 x 11
2      |  M2       |  13 x 13
3      |  M3       |  15 x 15
4      |  M4       |  17 x 17
---------------------------------

































































6.6.4 UPNQR (Univerzalnega PlaÄilnega Naloga QR)
------------------------------------------------
A variation of QR Code used by Združenje Bank Slovenije (Bank Association of
Slovenia). The size, error correction level and ECI are set by Zint and do not
need to be specified. UPNQR is unusual in that it uses ISO-8859-2 formatted data.
Zint will accept UTF-8 data and convert it to ISO-8859-2, or if your data is
already ISO-8859-2 formatted use the --binary switch or if using the API set
symbol->input_mode = DATA MODE;

The following example creates a symbol from data saved as an ISO-8859-2 file:

zint -o upnqr.png -b 143 --border=5 --scale=3 --binary -i ./upn.txt

6.6.5 Maxicode (ISO 16023)
--------------------------
Developed by UPS the Maxicode symbology employs a grid of hexagons surrounding 
a 'bulls-eye' finder pattern. This symbology is designed for the identification 
of parcels. Maxicode symbols can be encoded in one of five modes. In modes 2 
and 3 Maxicode symbols are composed of two parts named the primary and 
secondary messages. The primary message consists of a structured data field 
which includes various data about the package being sent and the secondary 
message usually consists of address data in a data structure. The format of the 
primary message required by Zint is given in the following table: 

----------------------------------------------------------------------------
Characters | Meaning
----------------------------------------------------------------------------
1 - 9      | Postcode data which can consist of up to 9 digits (for mode 2) 
           |    or up to 6 alphanumeric characters (for mode 3). Remaining 
           |    unused characters should be filled with the SPACE character
           |    (ASCII 32). 
10 - 12    | Three digit country code according to ISO 3166 (see Appendix B)
13 - 15    | Three digit service code. This depends on your parcel courier. 
----------------------------------------------------------------------------

The primary message can be set at the command prompt using the --primary= switch.
The secondary message uses the normal data entry method. For example:

zint -o test.eps -b 57 --primary='999999999840012' -d 'Secondary Message Here'

When using the API the primary message must be placed in the symbol->primary 
string. The secondary is entered in the same way as described in section 5.2. 
When either of these modes is selected Zint will analyse the primary message 
and select either mode 2 or mode 3 as appropriate.

Modes 4 to 6 can be accessed using the --mode= switch or by setting option_1. 
Modes 4 to 6 do not require a primary message. For example:

zint -o test.eps -b 57 --mode=4 -d 'A MaxiCode Message in Mode 4'

Mode 6 is reserved for the maintenance of scanner hardware and should not be 
used to encode user data.

This symbology uses Latin-1 character encoding by default but also supports the 
ECI encoding mechanism. The maximum length of text which can be placed in a 
Maxicode symbol depends on the type of characters used in the text.

Example maximum data lengths are given in the table below:

-----------------------------------------------------------------------------
Mode  |  Maximum Data Lenth   |  Maximum Data Length  |  Number of Error
      |  for Capital Letters  |  for Numeric Digits   |  Correction Codewords
-----------------------------------------------------------------------------
2*    |  84                   |  126                  |  50
3*    |  84                   |  126                  |  50
4     |  93                   |  135                  |  50
5     |  77                   |  110                  |  66
6     |  93                   |  135                  |  50
-----------------------------------------------------------------------------
* - secondary only

6.6.6 Aztec Code (ISO 24778)
----------------------------
Invented by Andrew Longacre at Welch Allyn Inc in 1995 the Aztec Code symbol is 
a matrix symbol with a distinctive bulls-eye finder pattern. Zint can generate 
Compact Aztec Code (sometimes called Small Aztec Code) as well as "full-range" 
Aztec Code symbols and by default will automatically select symbol type and 
size dependent on the length of the data to be encoded. Error correction 
codewords will normally be generated to fill at least 23% of the symbol. Two 
options are available to change this behaviour:

The size of the symbol can be specified using the --ver= option or setting 
option_2 to a value between 1 and 36 according to the following table. The 
symbols marked with an asterisk (*) in the table below are "compact" symbols, 
meaning they have a smaller bulls-eye pattern at the centre of the symbol. 

---------------------
Input  |  Symbol Size
---------------------
1      |  15 x 15*
2      |  19 x 19*
3      |  23 x 23*







|
|
|
|
|
|


|



|
|
|
|
|
|
|
|










>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|












|

|
|
|
|
|
|
|
|




|
|

|
|
|







|
|
|


|




|


|
|
















|

|
|
|
|
|
|


|
|
|
|







1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
36     |  161 x 161
38     |  165 x 165
38     |  169 x 169
39     |  173 x 173
40     |  177 x 177
---------------------

The maximum capacity of a (version 40) QR Code symbol is 7089 numeric digits,
4296 alphanumeric characters or 2953 bytes of data. QR Code symbols can also be
used to encode GS1 data. QR Code symbols can by default encode characters in
the Latin-1 set and Kanji characters which are members of the Shift-JIS
encoding scheme. In addition QR Code supports using other character sets using
the ECI mechanism. Input should usually be entered as Unicode (UTF-8) with
conversion to Shift-JIS being carried out by Zint. A separate symbology ID can
be used to encode Health Industry Barcode (HIBC) data which adds a leading '+'
character and a modulo-49 check digit to the encoded data.

6.6.3 Micro QR Code (ISO 18004)
-------------------------------
A miniature version of the QR Code symbol for short messages. ECC levels can be
selected as for QR Code (above). QR Code symbols can encode characters in the
Latin-1 set and Kanji characters which are members of the Shift-JIS encoding
scheme. Input should be entered as a UTF-8 stream with conversion to Shift-JIS
being carried out automatically by Zint. A preferred symbol size can be
selected by using the --vers= option or by setting option_2 although the actual
version used by Zint may be different if required by the input data. The table
below shows the possible sizes:

---------------------------------
Input  |  Version  |  Symbol Size
---------------------------------
1      |  M1       |  11 x 11
2      |  M2       |  13 x 13
3      |  M3       |  15 x 15
4      |  M4       |  17 x 17
---------------------------------

6.6.4 Rectangular Micro QR Code (rMQR)
--------------------------------------
A rectangular version of QR Code. Like QR code rMQR supports encoding of
GS-1 data, Latin-1 and Kanji characters in the Shift-JIS encoding scheme.
It does not support other ISO 8859 character sets or Unicode. As with other
symbologies data should be entered as UTF-8 with the conversion to Shift-JIS
being handled by Zint. The amount of ECC codewords can be adjusted using
--secure=, however only ECC levels M and H are valid for this type of symbol.

-------------------------------------------------------------------------
Input  |  ECC Level    |  Error Correction Capacity  |  Recovery Capacity
-------------------------------------------------------------------------
2      |  M (default)  |  Approx 37% of symbol       |  Approx 15%
4      |  H            |  Approx 65% of symbol       |  Approx 30%
-------------------------------------------------------------------------

The preferred symbol sizes can be selected using the --vers= option as shown
in the table below. Input values between 33 and 38 fix the height of the
symbol while allowing Zint to determine the minimum symbol width.

---------------------------------
Input  |  Version  |  Symbol Size
---------------------------------
1      |  R7x43    |  7 x 73
2      |  R7x59    |  7 x 59
3      |  R7x77    |  7 x 77
4      |  R7x99    |  7 x 99
5      |  R7x139   |  7 x 139
6      |  R9x43    |  9 x 43
7      |  R9x59    |  9 x 59
8      |  R9x77    |  9 x 77
9      |  R9x99    |  9 x 99
10     |  R9x139   |  9 x 139
11     |  R11x27   |  11 x 27
12     |  R11x43   |  11 x 43
13     |  R11x59   |  11 x 59
14     |  R11x77   |  11 x 77
15     |  R11x99   |  11 x 99
16     |  R11x139  |  11 x 139
17     |  R13x27   |  13 x 27
18     |  R13x43   |  13 x 43
19     |  R13x59   |  13 x 59
20     |  R13x77   |  13 x 77
21     |  R13x99   |  13 x 99
22     |  R13x139  |  13 x 139
23     |  R15x43   |  15 x 43
24     |  R15x59   |  15 x 59
25     |  R15x77   |  15 x 77
26     |  R15x99   |  15 x 99
27     |  R15x139  |  15 x 139
28     |  R17x43   |  17 x 43
29     |  R17x59   |  17 x 59
30     |  R17x77   |  17 x 77
31     |  R17x99   |  17 x 99
32     |  R17x139  |  17 x 139
---------------------------------
33     |  Fixed height 7
34     |  Fixed height 9
35     |  Fixed height 11
36     |  Fixed height 13
37     |  Fixed height 15
38     |  Fixed height 17
---------------------------------

6.6.5 UPNQR (Univerzalnega PlaÄilnega Naloga QR)
------------------------------------------------
A variation of QR Code used by Združenje Bank Slovenije (Bank Association of
Slovenia). The size, error correction level and ECI are set by Zint and do not
need to be specified. UPNQR is unusual in that it uses ISO-8859-2 formatted data.
Zint will accept UTF-8 data and convert it to ISO-8859-2, or if your data is
already ISO-8859-2 formatted use the --binary switch or if using the API set
symbol->input_mode = DATA MODE;

The following example creates a symbol from data saved as an ISO-8859-2 file:

zint -o upnqr.png -b 143 --border=5 --scale=3 --binary -i ./upn.txt

6.6.6 Maxicode (ISO 16023)
--------------------------
Developed by UPS the Maxicode symbology employs a grid of hexagons surrounding
a 'bulls-eye' finder pattern. This symbology is designed for the identification
of parcels. Maxicode symbols can be encoded in one of five modes. In modes 2
and 3 Maxicode symbols are composed of two parts named the primary and
secondary messages. The primary message consists of a structured data field
which includes various data about the package being sent and the secondary
message usually consists of address data in a data structure. The format of the
primary message required by Zint is given in the following table:

----------------------------------------------------------------------------
Characters | Meaning
----------------------------------------------------------------------------
1 - 9      | Postcode data which can consist of up to 9 digits (for mode 2)
           |    or up to 6 alphanumeric characters (for mode 3). Remaining
           |    unused characters should be filled with the SPACE character
           |    (ASCII 32).
10 - 12    | Three digit country code according to ISO 3166.
13 - 15    | Three digit service code. This depends on your parcel courier.
----------------------------------------------------------------------------

The primary message can be set at the command prompt using the --primary= switch.
The secondary message uses the normal data entry method. For example:

zint -o test.eps -b 57 --primary='999999999840012' -d 'Secondary Message Here'

When using the API the primary message must be placed in the symbol->primary
string. The secondary is entered in the same way as described in section 5.2.
When either of these modes is selected Zint will analyse the primary message
and select either mode 2 or mode 3 as appropriate.

Modes 4 to 6 can be accessed using the --mode= switch or by setting option_1.
Modes 4 to 6 do not require a primary message. For example:

zint -o test.eps -b 57 --mode=4 -d 'A MaxiCode Message in Mode 4'

Mode 6 is reserved for the maintenance of scanner hardware and should not be
used to encode user data.

This symbology uses Latin-1 character encoding by default but also supports the
ECI encoding mechanism. The maximum length of text which can be placed in a
Maxicode symbol depends on the type of characters used in the text.

Example maximum data lengths are given in the table below:

-----------------------------------------------------------------------------
Mode  |  Maximum Data Lenth   |  Maximum Data Length  |  Number of Error
      |  for Capital Letters  |  for Numeric Digits   |  Correction Codewords
-----------------------------------------------------------------------------
2*    |  84                   |  126                  |  50
3*    |  84                   |  126                  |  50
4     |  93                   |  135                  |  50
5     |  77                   |  110                  |  66
6     |  93                   |  135                  |  50
-----------------------------------------------------------------------------
* - secondary only

6.6.7 Aztec Code (ISO 24778)
----------------------------
Invented by Andrew Longacre at Welch Allyn Inc in 1995 the Aztec Code symbol is
a matrix symbol with a distinctive bulls-eye finder pattern. Zint can generate
Compact Aztec Code (sometimes called Small Aztec Code) as well as "full-range"
Aztec Code symbols and by default will automatically select symbol type and
size dependent on the length of the data to be encoded. Error correction
codewords will normally be generated to fill at least 23% of the symbol. Two
options are available to change this behaviour:

The size of the symbol can be specified using the --ver= option or setting
option_2 to a value between 1 and 36 according to the following table. The
symbols marked with an asterisk (*) in the table below are "compact" symbols,
meaning they have a smaller bulls-eye pattern at the centre of the symbol.

---------------------
Input  |  Symbol Size
---------------------
1      |  15 x 15*
2      |  19 x 19*
3      |  23 x 23*
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
32     |  135 x 135
33     |  139 x 139
34     |  143 x 143
35     |  147 x 147
36     |  151 x 151
---------------------

Note that in symbols which have a specified size the amount of error correction 
is dependent on the length of the data input and Zint will allow error 
correction capacities as low as 3 codewords.

Alternatively the amount of error correction data can be specified by use of 
the --mode= option or by setting option_1 to a value from the following table: 

----------------------------------
Mode  |  Error Correction Capacity
----------------------------------
1     |  >10% + 3 codewords
2     |  >23% + 3 codewords
3     |  >36% + 3 codewords
4     |  >50% + 3 codewords
----------------------------------

It is not possible to select both symbol size and error correction capacity for 
the same symbol. If both options are selected then the error correction 
capacity selection will be ignored. 

Aztec Code supports ECI encoding and can encode up to a maximum length of 
approximately 3823 numeric or 3067 alphabetic characters or 1914 bytes of data. 
A separate symbology ID can be used to encode Health Industry Barcode (HIBC) 
data which adds a leading '+' character and a modulo-49 check digit to the 
encoded data.

6.6.7 Aztec Runes
-----------------
A truncated version of compact Aztec Code for encoding whole integers between 0 
and 255. Includes Reed-Solomon error correction. As defined in ISO/IEC 24778 
Annex A. 

6.6.8 Code One
--------------
A matrix symbology developed by Ted Williams in 1992 which encodes data in a 
way similar to Data Matrix ECC200. Code One is able to encode the Latin-1 
character set or GS1 data. There are two types of Code One symbol - variable 
height symbols which are roughly square (versions A thought to H) and 
fixed-height versions (version S and T). These can be selected by using --vers= 
or setting option_2 as shown in the table below: 

--------------------------------------------------------------------
Input  |  Version  |  Size        |  Numeric        |  Alphanumeric
       |           |              |  Data Capacity  |  Data Capacity
--------------------------------------------------------------------
1      |  A        |  16 x 18     |  22             |  13
2      |  B        |  22 x 22     |  44             |  27
3      |  C        |  28 x 28     |  104            |  64
4      |  D        |  40 x 42     |  217            |  135
5      |  E        |  52 x 54     |  435            |  271
6      |  F        |  70 x 76     |  886            |  553
7      |  G        |  104 x 98    |  1755           |  1096
8      |  H        |  148 x 134   |  3550           |  2218
9      |  S        |  8X height   |  18             |  N/A
10     |  T        |  16X height  |  90             |  55
--------------------------------------------------------------------

Version S symbols can only encode numeric data. The width of version S and 
version T symbols is determined by the length of the input data. 

6.6.9 Grid Matrix
-----------------
By default Grid Matrix supports encoding in Latin-1 and Chinese characters 
within the GB 2312 standard set to be encoded in a checkerboard pattern. Input 
should be entered as Unicode (UTF-8) with conversion to GB 2312 being carried 
out automatically by Zint. The symbology also supports the ECI mechanism. The 
size of the symbol and the error correction capacity can be specified. If you 
specify both of these values then Zint will make a 'best-fit' attempt to 
satisfy  both conditions. The symbol size can be specified using the --ver=
option or by setting option_2, and the error correction capacity can be
specified by using the --secure= option or by setting option_1 according to
the following tables: 

---------------------
Input  |  Symbol Size
---------------------
1      |  18 x 18
2      |  30 x 30
3      |  42 x 42







|
|


|
|










|
|
|

|
|
|
|


|

|
|
|

|

|
|
|
|
|
|

















|
|

|

|
|
|
|
|
|



|







2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
32     |  135 x 135
33     |  139 x 139
34     |  143 x 143
35     |  147 x 147
36     |  151 x 151
---------------------

Note that in symbols which have a specified size the amount of error correction
is dependent on the length of the data input and Zint will allow error
correction capacities as low as 3 codewords.

Alternatively the amount of error correction data can be specified by use of
the --mode= option or by setting option_1 to a value from the following table:

----------------------------------
Mode  |  Error Correction Capacity
----------------------------------
1     |  >10% + 3 codewords
2     |  >23% + 3 codewords
3     |  >36% + 3 codewords
4     |  >50% + 3 codewords
----------------------------------

It is not possible to select both symbol size and error correction capacity for
the same symbol. If both options are selected then the error correction
capacity selection will be ignored.

Aztec Code supports ECI encoding and can encode up to a maximum length of
approximately 3823 numeric or 3067 alphabetic characters or 1914 bytes of data.
A separate symbology ID can be used to encode Health Industry Barcode (HIBC)
data which adds a leading '+' character and a modulo-49 check digit to the
encoded data.

6.6.8 Aztec Runes
-----------------
A truncated version of compact Aztec Code for encoding whole integers between 0
and 255. Includes Reed-Solomon error correction. As defined in ISO/IEC 24778
Annex A.

6.6.9 Code One
--------------
A matrix symbology developed by Ted Williams in 1992 which encodes data in a
way similar to Data Matrix. Code One is able to encode the Latin-1
character set or GS1 data. There are two types of Code One symbol - variable
height symbols which are roughly square (versions A thought to H) and
fixed-height versions (version S and T). These can be selected by using --vers=
or setting option_2 as shown in the table below:

--------------------------------------------------------------------
Input  |  Version  |  Size        |  Numeric        |  Alphanumeric
       |           |              |  Data Capacity  |  Data Capacity
--------------------------------------------------------------------
1      |  A        |  16 x 18     |  22             |  13
2      |  B        |  22 x 22     |  44             |  27
3      |  C        |  28 x 28     |  104            |  64
4      |  D        |  40 x 42     |  217            |  135
5      |  E        |  52 x 54     |  435            |  271
6      |  F        |  70 x 76     |  886            |  553
7      |  G        |  104 x 98    |  1755           |  1096
8      |  H        |  148 x 134   |  3550           |  2218
9      |  S        |  8X height   |  18             |  N/A
10     |  T        |  16X height  |  90             |  55
--------------------------------------------------------------------

Version S symbols can only encode numeric data. The width of version S and
version T symbols is determined by the length of the input data.

6.6.10 Grid Matrix
-----------------
By default Grid Matrix supports encoding in Latin-1 and Chinese characters
within the GB 2312 standard set to be encoded in a chequerboard pattern. Input
should be entered as Unicode (UTF-8) with conversion to GB 2312 being carried
out automatically by Zint. The symbology also supports the ECI mechanism. The
size of the symbol and the error correction capacity can be specified. If you
specify both of these values then Zint will make a 'best-fit' attempt to
satisfy  both conditions. The symbol size can be specified using the --ver=
option or by setting option_2, and the error correction capacity can be
specified by using the --secure= option or by setting option_1 according to
the following tables:

---------------------
Input  |  Symbol Size
---------------------
1      |  18 x 18
2      |  30 x 30
3      |  42 x 42
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
1     |  Approximately 10%
2     |  Approximately 20%
3     |  Approximately 30%
4     |  Approximately 40%
5     |  Approximately 50%
----------------------------------

6.6.10 DotCode
-------------
DotCode uses a grid of dots in a rectangular formation to encode characters up 
to a maximum of approximately 450 characters (or 900 numeric digits). The 
symbology supports ECI encoding and GS-1 data encoding. By default Zint will 
produce a symbol which is approximately square, however the width of the symbol 
can be adjusted by using the --cols= option or by setting option_2. Outputting 
DotCode to raster images (PNG, GIF, BMP, PCX) will require setting the scale of 
the image to a larger value than the default (e.g. approx 10) for the dots to 
be plotted correctly. Approximately 33% of the resulting symbol is comprised of 
error correction codewords.

6.6.11 Han Xin Code
-------------------
Also known as Chinese Sensible Code, Han Xin is a symbology which is still 
under 
development, so it is recommended it should not yet be used for a production 
environment. The symbology is capable of encoding characters in the GB18030 
character set (up to 4-byte characters) and is also able to support the ECI 
mechanism. Han Xin does not support the encoding of GS-1 data.

The size of the symbol can be specified using the --ver= option or setting 
option_2 to a value between 1 and 84 according to the following table.

---------------------
Input  |  Symbol Size
---------------------
1      |  23 x 23
2      |  25 x 25







|

|
|
|
|
|
|
|
|


|

|
|
|
|
|
|

|







2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
1     |  Approximately 10%
2     |  Approximately 20%
3     |  Approximately 30%
4     |  Approximately 40%
5     |  Approximately 50%
----------------------------------

6.6.11 DotCode
-------------
DotCode uses a grid of dots in a rectangular formation to encode characters up
to a maximum of approximately 450 characters (or 900 numeric digits). The
symbology supports ECI encoding and GS-1 data encoding. By default Zint will
produce a symbol which is approximately square, however the width of the symbol
can be adjusted by using the --cols= option or by setting option_2. Outputting
DotCode to raster images (PNG, GIF, BMP, PCX) will require setting the scale of
the image to a larger value than the default (e.g. approx 10) for the dots to
be plotted correctly. Approximately 33% of the resulting symbol is comprised of
error correction codewords.

6.6.12 Han Xin Code
-------------------
Also known as Chinese Sensible Code, Han Xin is a symbology which is still
under
development, so it is recommended it should not yet be used for a production
environment. The symbology is capable of encoding characters in the GB18030
character set (up to 4-byte characters) and is also able to support the ECI
mechanism. Support for the encoding of GS-1 data has not yet been implemented.

The size of the symbol can be specified using the --ver= option or setting
option_2 to a value between 1 and 84 according to the following table.

---------------------
Input  |  Symbol Size
---------------------
1      |  23 x 23
2      |  25 x 25
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368



2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580



















2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
80     |  181 x 181
81     |  183 x 183
82     |  185 x 185
83     |  187 x 187
84     |  189 x 189
---------------------

There are four levels of error correction capacity available for Han Xin Code 
which can be set by using the --mode= option or by setting option_1 to a value 
from the following table:

--------------------------
Mode  |  Recovery Capacity
--------------------------
1     |  Approx 8%
2     |  Approx 15%
3     |  Approx 23%
4     |  Approx 30%
--------------------------

It is not possible to select both symbol size and error correction capacity for 
the same symbol. If both options are selected then the error correction 
capacity selection will be ignored.

6.7 Other Barcode-Like Markings
-------------------------------
6.7.1. Facing Identification Mark (FIM)
---------------------------------------
Used by the United States Postal Service (USPS), the FIM symbology is used to 
assist automated mail processing. There are only 4 valid symbols which can be 
generated using the characters A-D as shown in the table below. 

----------------------------------------------------------------------------
Code Letter  |  Usage
----------------------------------------------------------------------------
A            |  Used for courtesy reply mail and metered reply mail with a 
             |     pre-printed PostNet symbol. 
B            |  Used for business reply mail without a pre-printed zip code.
C            |  Used for business reply mail with a pre-printed zip code.
D            |  Used for Information Based Indicia (IBI) postage. 
----------------------------------------------------------------------------

6.7.2 Flattermarken
-------------------
Used for the recognition of page sequences in print-shops, the Flattermarken is 
not a true barcode symbol and requires precise knowledge of the position of the 
mark on the page. The Flattermarken system can encode any length numeric data 
and does not include a check digit. 

6.7.3 DAFT Code
---------------
This is a method for creating 4-state codes where the data encoding is provided 
by an external program. Input data should consist of the letters 'D', 'A', 'F' 
and 'T' where these refer to descender, ascender, full (ascender and descender) 
and tracker (neither ascender nor descender) respectively. All other characters 
are ignored. 

7. Legal and Version Information
================================
7.1 License
-----------
Zint, libzint and Zint Barcode Studio are Copyright © 2016 Robin Stuart. All 
historical versions are distributed under the GNU General Public License 
version 3 or later. Version 2.5 is released under a dual license: the encoding 
library is released under the BSD license whereas the GUI, Zint Barcode Studio, 
is released under the GNU General Public License version 3 or later.

Telepen is a trademark of SB Electronic Systems Ltd.

QR Code is a registered trademark of Denso Wave Incorporated.

Microsoft, Windows and the Windows logo are either registered trademarks or 
trademarks of Microsoft Corporation in the United States and/or other countries.

Linux is the registered trademark of Linus Torvalds in the U.S. and other
countries.




Zint.org.uk website design and hosting provided by Robert Elliott.

7.2 Patent Issues
-----------------
All of the code in Zint is developed using information in the public domain, 
usually freely available on the Internet. Some of the techniques used may be 
subject to patents and other intellectual property legislation. It is my belief 
that any patents involved in the technology underlying symbologies utilised by 
Zint are 'unadopted', that is the holder does not object to their methods being 
used.

Any methods patented or owned by third parties or trademarks or registered 
trademarks used within Zint or in this document are and remain the property of 
their respective owners and do not indicate endorsement or affiliation with 
those owners, companies or organisations. 

7.3 Version Information
-----------------------
v0.1 - (as Zebar) Draws UPC-A. UPC-E, EAN-8, EAN-13, Interlaced 2 of 5, 
Codabar, Code 39, Extended Code 39 and Code 93 barcodes and Add-on codes EAN-2 
and EAN-5 without parity. 13/11/2006

v0.2 - Added Code 128 (which is now the default), Code 11, Code 2 of 5, Add-on 
codes EAN-2 and EAN-5 parity and MSI/Plessey without check digit. 12/12/2006

v0.3 - Added MSI/Plessey Mod 10 check and 2 x Mod 10 check options, Telepen 
ASCII and Telepen numeric, Postnet, RM4SCC. Code has been tidied up quite a 
bit. Bind option added. 30/12/2006

v0.4 - Added barcode stacking (now stacks up to 16 barcodes) and Code16k 
(stub). 15/1/2007

v0.5 - Added Australia Post 4-State Barcodes and Pharmacode (1 and 2 track). 
4-state codes now draw with correct height/width ratio. 28/2/2007

v0.6 - Added Plessey and some derivative codes (EAN-128, Code 128 subset B, 
Auspost Reply, Auspost Routing, Auspost Redirect, ITF-14). Tidied up code 
again: separated symbologies into more files and put all lookup tables into 
arrays (much reducing the amount of code, especially for Code 39e and Code 93). 
Errors now output to stderr. Added proper input verification. Distribution now 
packs with HTML pages instead of separate README. Outputs to PNG. Outputs 
colour. User variable whitespace and border width. Box option. Fixed EAN add-on 
bug. Added whitespace and height options. Project name changed to Zint to avoid 
conflict with extant trade name. Added escape character input. 1/4/2007

v1.0 - Corrected problem with escape character codes. Supports PDF417. This 
completes the list of features I originally wanted (plus a few more), hence 
skip to version 1.0. 20/4/2007

v1.1 - Added more derivatives (Code 2 of 5 Matrix, IATA and Data Logic, 
Truncated PDF417, Deutsche Post Leitcode and Identcode, Pharmazentralnummer, 
Planet) and Flattermarken. Tidied up 2 of 5 code. 26/4/2007

v1.2 - Supports Data Matrix ECC200 (by absorption of IEC16022 code by Stefan 
Schmidt et al). Added reverse colours, FIM, MSI/Plessey Modulo 11 and Modulo 
11/10. Corrected Code 16k check digit calculation. 28/5/2007

v1.3 - Supports USPS OneCode and LOGMARS. Brought all usage information into 
one User Manual document. 13/6/2007

v1.4 - Added NVE-18 support. Corrected some problems with compilation and input 
verification. Command line option handling now uses getopt(), and all the 
switches have changed. Added –font option. 20/6/2007

v1.5 - Pulled everything together to make an API. Corrected errors with EAN-13, 
PDF417 and LOGMARS. Added EPS output. Added QR Code support using libqrencode. 
Corrected ISBN verification error. Re-compiled documentation in HTML form. Put 
in place proper error handling routines. --font option removed. Encoding is now 
done with a restructured zint_symbol structure. Added make install option and 
optional QR Code support to Makefile. Corrected minor problem with 4-State 
Codes. Restructured code into fewer source code files. Added MicroPDF417 
support. 12/8/2007

v1.5.1 - Added formatting code to EPS output of EAN and UPC symbols according 
to EN 797:1996. Checked against and, where appropriate, altered or corrected to 
comply with ISO 16388 and ISO 15417 including Latin-1 support. Altered default 
image settings, added automatic ITF border. Corrected error with USPS OneCode. 
Tidied up Code 39 quite a bit, added Mod 43 options. 3/9/2007

v1.5.2 - Added extended ASCII support to Code 16k. Corrected Code 128 error. 
Added Maxicode support by integrating code by John Lien. 26/9/2007

v1.5.3 - Made huge corrections to Maxicode support by removing and re-writing 
much of John's code. Maxicode now supports extended ASCII and modes 4, 5 and 6. 
10/10/2007

v1.5.4 - Added GS1 DataBar (Reduced Space Symbology) support. 26/11/2007

v1.5.5 - Added composite symbology support. Corrected errors with GS1-128 and

PDF417/MicroPDF417 byte processing. Transferred licence to GPL version 3. 
9/3/2008

v1.6 - Data Matrix ECC200, Maxicode and Australia Post now use common 
Reed-Solomon functions – this also fixes a bug in Maxicode error correction and 
replaces the last of the Lien code. Added PNG output for Maxicode symbols. 
Removed some useless code. Updated QR support for libqrencode v2.0.0. 22/4/2008

v1.6.1 - Major restructuring of PNG generating code: Now draws UPCA and EAN 
symbols properly and puts human readable text into the image. Also corrected 
some nasty 'never ending loop' bugs in Code 128 and check digit bugs in PostNet 
and Planet. 8/7/2008

v1.6.2 - Added KIX Code support and PNG image rotation. Corrected a bug 
affecting extended ASCII support in Code 128 and Code 16k. 28/7/2008.

v2.0 beta - Added support for Aztec Code, Codablock-F, Code 32, EAN-14 and DAFT 
Code. Rearranged symbology numbers to match Tbarcode v8. Corrected a never 
ending loop bug in EAN-128. 29/9/2008

v2.0 beta r2 - Many corrections and bugfixes. (Code 11, Code 128, EAN-128, 
Aztec Code, Codablock-F, Code 16k, Postnet, PLANET, NVE-18, PZN, Data Matrix 
ECC200, Maxicode and QR Code)

v2.0 - Made corrections to Aztec Code and tested output with bcTester. Added 
Aztec Runes, Micro QR Code and Data Matrix ECC200 ECC 000-140. Updated e-mail 
information. 18/11/2008

v2.1 - Reinstated Korea Post barcodes, harmonised bind and box options, moved 
Unicode handling into backend and added input_mode option, added size options 
to Data Matrix ECC200, added NULL character handling for Codablock-F, Code 128, 
Code 16k, Extended Code 39, Code 93, Telepen, Maxicode, Data Matrix ECC200 ECC 
200, PDF417 and MicroPDF417. Added GS1 support for Code 16k, Codablock-F and 
Aztec Code. Added scale and direct to stdout options. Rebult Data Matrix ECC200 
ECC 200 encoding algorithms to support NULL encoding and GS1 data encoding. 
31/1/2009

v2.1.1 - Minor Data Matrix ECC200 bugfix and added HIBC options. 10/2/2009

v2.1.2 - Added SVG output option. Improved Japanese character support including 
Unicode > Shift-JIS capability. Bugfixes for Data Matrix ECC200 (missing 
characters at end of string) and Codablock-F (K1/K2 check digit and row 
indicators above row 6). 1/3/2009

v2.1.3 - Many improvements to the QZint GUI which is now renamed "Zint Barcode 
Studio 0.2". Added Japanese Postal Barcode, Code 49 and Channel Code and made 
corrections to Data Matrix ECC200 (Binary mode data compression terminates too 
soon), Aztec Code (Bug when automatically resizing after removing "all 0" and 
"all 1" codewords) and Code 128 (Extended ASCII characters become corrupt). 
19/5/2009

v2.1.4 - Many stability improvements including removal of buffer overruns in 
Code 39, LOGMARS, PZN, Aztec Code and Composite CC-A. Addition of files for 
compiling on MS Windows platform - tested successfully on XP and Vista. 
19/6/2009

v2.2 - Added Code One and GS1 support in Code 49. Changed GUI binary name to 
zint-qt and brought GUI up to version 1.0. Made some minor bugfixes to Code 39, 
ITF-14, Aztec Code, Code 128 and Code 16K. Added 'rest' button to GUI. Included 
.spec file from Radist. 18/7/2009

v2.2.1 - Data encoding bugfixes for Aztec Code, Data Matrix ECC200, USPS One 
Code and PDF417. Symbol plotting bugfixes for MicroPDF417 and 2D components of 
composite symbols. Text formatting bugfix for Qt renderer and a couple of 
compiler fixes for MSVC PNG image output. 6/8/2009

v2.2.2 - A beta release previewing the new API structure. Better NULL character 
support with "nullchar" value removed. Added loading from file and sequence 
dialogs in Barcode Studio. 29/9/2009

v2.3 - Fixed problems with Micro QR Code and rebuilt QR Code support removing 
dependence on libqrencode. Improved Kanji character support for QR Code and 
Micro QR Code which now auto-detects and automatically converts to Shift-JIS. 
Added Grid Matrix symbology with Kanji character support and automatic 
conversion to GB 2312. Removed no_qr compile option. Advanced Barcode Studio 
version number to match library version number. 23/11/2009

v2.3.1 - Removed Codablock-F. Redesigned scale function so that human readable 
text and Maxicode symbols can be scaled consistently. Corrected encoding bugs 
with Code 128/Code 16k and Data Matrix ECC200 ECC 050. Added --notext option to 
CLI. 7/3/2010

v2.3.2 - Corrected many bugs in GS1 DataBar Extended thanks to the careful 
study of the code by Pablo Orduña at the PIRAmIDE project. Similarly corrected 
some bugs in Maxicode thanks to Monica Swanson at Source Technologies. Also 
minor bugfixes for ISBN and Aztec Code, and added some small features like a 
--square option in the CLI. 29/5/2010

v2.4 - Built extensions to the API for integrating with glabels with thanks to 
Sam Lown and Jim Evins. Added code optimisation and input from stdin thanks to 
Ismael Luceno. Reinstated escape character input. Simplification of Barcode 
Studio. 13/9/2010

v2.4.1 & 2.4.2 – A whole host of bugfixes including correction of ECC routines 
for Code-1 and addition of batch processing at the command line. 19/4/2011 &
4/5/2011

v2.4.3 - Includes minor bugfixes 16/5/2011

v2.5 – Support for DotCode and Han Xin code. Restore support for Codablock-F.
ECI code processing. Output to BMP, GIF and PCX. Added bold text option. Many
minor bugfixes and improvements. 
13/11/2016

v2.6 - Output to EMF and TIF. Update frontend to Qt5. Copy to clipboard on
KDE and Windows.
12/5/2017

v2.6.1 - Various bugfixes to backend, including improved Aztec code processing.
Many improvements to GUI including resizable screens and more output while
batch processing, more consistent use of dialogues.
27/8/2017

v2.6.2 - Further bugfixes in Aztec and DotCode. Expand escape sequence support
to API and GUI. Handle UTF BOM. Bugfix raster images of Maxicode.
22/10/2017

v2.6.3 - New symbology Royal Mail 4-state Mailmark. Added North America VIN
verification. Bugfixes for TIF and EMF output and escape character handling.
15/02/2018




















7.4 Sources of Information
--------------------------
Below is a list of some of the sources used in rough chronological order:

Nick Johnson's Barcode Specifications
Bar Code 1 Specification Source Page
SB Electronic Systems Telepen website
Pharmacode specifications from Laetus
Morovia RM4SCC specification
Austalia Post's 'A Guide to Printing the 4-State Barcode' and bcsample source 
   code
Plessey algorithm from GNU-Barcode v0.98 by Leonid A. Broukhis
GS1 General Specifications v 8.0 Issue 2
PNG: The Definitive Guide and wpng source code by Greg Reolofs
PDF417 specification and pdf417 source code by Grand Zebu
Barcode Reference, TBarCode/X User Documentation and TBarCode/X demonstration 
   program from Tec-It
IEC16022 source code by Stefan Schmidt et al
United States Postal Service Specification USPS-B-3200
Adobe Systems Incorporated Encapsulated PostScript File Format Specification
BSI Online Library
Libdmtx Data Matrix ECC200 decoding library

7.5 Standard Compliance
-----------------------
Zint was developed to provide compliance with the following British and 
international standards: 

> BS EN 797:1996 Bar coding - Symbology specifications - 'EAN/UPC' 
> BS EN 798:1996 Bar coding - Symbology specifications - 'Codabar' 
> ISO/IEC 12323:2005 AIDC technologies - Symbology specifications - Code 16K 
> ISO/IEC 15417:2007 Information technology - Automatic identification and data 
     capture techniques - Code 128 bar code symbology specification 
> ISO/IEC 15438:20062015 Information technology - Automatic identification and 
     data capture techniques - PDF417 bar code symbology specification 
> ISO/IEC 16022:2006 Information technology - Automatic identification and data 
     capture techniques - Data Matrix ECC200 bar code symbology specification 
> ISO/IEC 16023:2000 Information technology - International symbology 
     specification – Maxicode 
> ISO/IEC 16388:2007 Information technology - Automatic identification and data 
     capture techniques - Code 39 bar code symbology specification 
> ISO/IEC 18004:2015 Information technology - Automatic identification and data 
     capture techniques - QR Code bar code symbology specification 
> ISO/IEC 24723:2010 Information technology - Automatic identification and data 
     capture techniques - GS1 Composite bar code symbology specification 
> ISO/IEC 24724:2011 Information technology - Automatic identification and data 
     capture techniques - GS1 DataBar bar code symbology specification 
> ISO/IEC 24728:2006 Information technology - Automatic identification and data 
     capture techniques - MicroPDF417 bar code symbology specification 
> ISO/IEC 24778:2008 Information technology - Automatic identification and data 
     capture techniques - Aztec Code bar code symbology specification 
> Uniform Symbology Specification Code One (AIM Inc., 1994) 
> ANSI/AIM BC12-1998 - Uniform Symbology Specification Channel Code 
> ANSI/AIM BC6-2000 - Uniform Symbology Specification Code 49 
> ANSI/HIBC 2.3-2009 - The Health Industry Bar Code (HIBC) Supplier Labeling 
     Standard 
> AIM ISS-X-24 - Uniform Symbology Specification Codablock F
> AIMD013 (v 1.34a) – Information technology – Automaic identification and data 
     capture techniques – Bar code symbology specification – DotCode (Revised 
     19th Feb 2009)
> AIMD014 (v 1.63) - Information technology, Automatic identification and data 
     capture techniques - Bar code symbology specification - Grid Matrix 
     (Released 9th Dec 2008) 
> AIMD-015:2010 (v 0.8) – DRAFT Bar code symbology specification – Han Xin Code 
     (Revised 25th March 2010)
> GS1 General Specifications Version 8.0 
> AIM ITS/04-001 International Technical Standard – Extended Channel 
     Interpretations Part 1: Identification Schemes and Protocol (Released 24th 
     May 2004)
> AIM ITS/04-023 International Technical Standard – Extended Channel 
     Interpretations Part 3: Register (Released 15th July 2004)
     
A. Character Encoding
=====================
This section is intended as a quick reference to the character sets used by 
Zint. All symbologies use standard ASCII input as shown in section A.1, but 
some support extended character support as shown in the subsequent section.

A.1 ASCII Standard
------------------
The ubiquitous ASCII standard is well known to most computer users. It's 
reproduced here for reference.

-------------------------------------------------------------
Hex |  0     |  1    |  2      |  3  |  4  |  5  |  6  |  7
-------------------------------------------------------------
0   |  NULL  |  DLE  |  SPACE  |  0  |  @  |  P  |  `  |  p
1   |  SOH   |  DC1  |  !      |  1  |  A  |  Q  |  a  |  q







|
|











<
<
<
<




|
|
|




|
|


|




|
|
|
|



|
|
|
|
|





|
|
|
|






|




>
>
>





|
|
|
|
|


|
|
|
|



|
|


|


|
|


|


|


|
|
|
|
|
|
|
|


|
|


|
|


|
|


|


|
|


|
|
|
|
|
|
|


|
|
|
|


|


|
|






|


|
|
|


|
|
|


|


|
|


|
|


|
|


|
|
|
|
|
|
|




|
|
|


|
|
|
|
|


|
|
|


|
|
|


|
|
|


|
|


|
|
|
|
|


|
|
|


|
|
|
|


|
|
|


|







|



















>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>









|





|









|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|

|
|
|
|

|
|
|

|

|


|
|




|







2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388




2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
80     |  181 x 181
81     |  183 x 183
82     |  185 x 185
83     |  187 x 187
84     |  189 x 189
---------------------

There are four levels of error correction capacity available for Han Xin Code
which can be set by using the --mode= option or by setting option_1 to a value
from the following table:

--------------------------
Mode  |  Recovery Capacity
--------------------------
1     |  Approx 8%
2     |  Approx 15%
3     |  Approx 23%
4     |  Approx 30%
--------------------------





6.7 Other Barcode-Like Markings
-------------------------------
6.7.1. Facing Identification Mark (FIM)
---------------------------------------
Used by the United States Postal Service (USPS), the FIM symbology is used to
assist automated mail processing. There are only 4 valid symbols which can be
generated using the characters A-D as shown in the table below.

----------------------------------------------------------------------------
Code Letter  |  Usage
----------------------------------------------------------------------------
A            |  Used for courtesy reply mail and metered reply mail with a
             |     pre-printed PostNet symbol.
B            |  Used for business reply mail without a pre-printed zip code.
C            |  Used for business reply mail with a pre-printed zip code.
D            |  Used for Information Based Indicia (IBI) postage.
----------------------------------------------------------------------------

6.7.2 Flattermarken
-------------------
Used for the recognition of page sequences in print-shops, the Flattermarken is
not a true barcode symbol and requires precise knowledge of the position of the
mark on the page. The Flattermarken system can encode any length numeric data
and does not include a check digit.

6.7.3 DAFT Code
---------------
This is a method for creating 4-state codes where the data encoding is provided
by an external program. Input data should consist of the letters 'D', 'A', 'F'
and 'T' where these refer to descender, ascender, full (ascender and descender)
and tracker (neither ascender nor descender) respectively. All other characters
are ignored.

7. Legal and Version Information
================================
7.1 License
-----------
Zint, libzint and Zint Barcode Studio are Copyright © 2016 Robin Stuart. All
historical versions are distributed under the GNU General Public License
version 3 or later. Version 2.5 is released under a dual license: the encoding
library is released under the BSD license whereas the GUI, Zint Barcode Studio,
is released under the GNU General Public License version 3 or later.

Telepen is a trademark of SB Electronic Systems Ltd.

QR Code is a registered trademark of Denso Wave Incorporated.

Microsoft, Windows and the Windows logo are either registered trademarks or
trademarks of Microsoft Corporation in the United States and/or other countries.

Linux is the registered trademark of Linus Torvalds in the U.S. and other
countries.

Mac and macOS are trademarks of Apple Inc., registered in the U.S. and other
countries.

Zint.org.uk website design and hosting provided by Robert Elliott.

7.2 Patent Issues
-----------------
All of the code in Zint is developed using information in the public domain,
usually freely available on the Internet. Some of the techniques used may be
subject to patents and other intellectual property legislation. It is my belief
that any patents involved in the technology underlying symbologies utilised by
Zint are 'unadopted', that is the holder does not object to their methods being
used.

Any methods patented or owned by third parties or trademarks or registered
trademarks used within Zint or in this document are and remain the property of
their respective owners and do not indicate endorsement or affiliation with
those owners, companies or organisations.

7.3 Version Information
-----------------------
v0.1 - (as Zebar) Draws UPC-A. UPC-E, EAN-8, EAN-13, Interlaced 2 of 5,
Codabar, Code 39, Extended Code 39 and Code 93 barcodes and Add-on codes EAN-2
and EAN-5 without parity. 13/11/2006

v0.2 - Added Code 128 (which is now the default), Code 11, Code 2 of 5, Add-on
codes EAN-2 and EAN-5 parity and MSI/Plessey without check digit. 12/12/2006

v0.3 - Added MSI/Plessey Mod 10 check and 2 x Mod 10 check options, Telepen
ASCII and Telepen numeric, Postnet, RM4SCC. Code has been tidied up quite a
bit. Bind option added. 30/12/2006

v0.4 - Added barcode stacking (now stacks up to 16 barcodes) and Code16k
(stub). 15/1/2007

v0.5 - Added Australia Post 4-State Barcodes and Pharmacode (1 and 2 track).
4-state codes now draw with correct height/width ratio. 28/2/2007

v0.6 - Added Plessey and some derivative codes (EAN-128, Code 128 subset B,
Auspost Reply, Auspost Routing, Auspost Redirect, ITF-14). Tidied up code
again: separated symbologies into more files and put all lookup tables into
arrays (much reducing the amount of code, especially for Code 39e and Code 93).
Errors now output to stderr. Added proper input verification. Distribution now
packs with HTML pages instead of separate README. Outputs to PNG. Outputs
colour. User variable whitespace and border width. Box option. Fixed EAN add-on
bug. Added whitespace and height options. Project name changed to Zint to avoid
conflict with extant trade name. Added escape character input. 1/4/2007

v1.0 - Corrected problem with escape character codes. Supports PDF417. This
completes the list of features I originally wanted (plus a few more), hence
skip to version 1.0. 20/4/2007

v1.1 - Added more derivatives (Code 2 of 5 Matrix, IATA and Data Logic,
Truncated PDF417, Deutsche Post Leitcode and Identcode, Pharmazentralnummer,
Planet) and Flattermarken. Tidied up 2 of 5 code. 26/4/2007

v1.2 - Supports Data Matrix ECC200 (by absorption of IEC16022 code by Stefan
Schmidt et al). Added reverse colours, FIM, MSI/Plessey Modulo 11 and Modulo
11/10. Corrected Code 16k check digit calculation. 28/5/2007

v1.3 - Supports USPS OneCode and LOGMARS. Brought all usage information into
one User Manual document. 13/6/2007

v1.4 - Added NVE-18 support. Corrected some problems with compilation and input
verification. Command line option handling now uses getopt(), and all the
switches have changed. Added –font option. 20/6/2007

v1.5 - Pulled everything together to make an API. Corrected errors with EAN-13,
PDF417 and LOGMARS. Added EPS output. Added QR Code support using libqrencode.
Corrected ISBN verification error. Re-compiled documentation in HTML form. Put
in place proper error handling routines. --font option removed. Encoding is now
done with a restructured zint_symbol structure. Added make install option and
optional QR Code support to Makefile. Corrected minor problem with 4-State
Codes. Restructured code into fewer source code files. Added MicroPDF417
support. 12/8/2007

v1.5.1 - Added formatting code to EPS output of EAN and UPC symbols according
to EN 797:1996. Checked against and, where appropriate, altered or corrected to
comply with ISO 16388 and ISO 15417 including Latin-1 support. Altered default
image settings, added automatic ITF border. Corrected error with USPS OneCode.
Tidied up Code 39 quite a bit, added Mod 43 options. 3/9/2007

v1.5.2 - Added extended ASCII support to Code 16k. Corrected Code 128 error.
Added Maxicode support by integrating code by John Lien. 26/9/2007

v1.5.3 - Made huge corrections to Maxicode support by removing and re-writing
much of John's code. Maxicode now supports extended ASCII and modes 4, 5 and 6.
10/10/2007

v1.5.4 - Added GS1 DataBar (Reduced Space Symbology) support. 26/11/2007

v1.5.5 - Added composite symbology support. Corrected errors with GS1-128 and

PDF417/MicroPDF417 byte processing. Transferred licence to GPL version 3.
9/3/2008

v1.6 - Data Matrix ECC200, Maxicode and Australia Post now use common
Reed-Solomon functions – this also fixes a bug in Maxicode error correction and
replaces the last of the Lien code. Added PNG output for Maxicode symbols.
Removed some useless code. Updated QR support for libqrencode v2.0.0. 22/4/2008

v1.6.1 - Major restructuring of PNG generating code: Now draws UPCA and EAN
symbols properly and puts human readable text into the image. Also corrected
some nasty 'never ending loop' bugs in Code 128 and check digit bugs in PostNet
and Planet. 8/7/2008

v1.6.2 - Added KIX Code support and PNG image rotation. Corrected a bug
affecting extended ASCII support in Code 128 and Code 16k. 28/7/2008.

v2.0 beta - Added support for Aztec Code, Codablock-F, Code 32, EAN-14 and DAFT
Code. Rearranged symbology numbers to match Tbarcode v8. Corrected a never
ending loop bug in EAN-128. 29/9/2008

v2.0 beta r2 - Many corrections and bugfixes. (Code 11, Code 128, EAN-128,
Aztec Code, Codablock-F, Code 16k, Postnet, PLANET, NVE-18, PZN, Data Matrix
ECC200, Maxicode and QR Code)

v2.0 - Made corrections to Aztec Code and tested output with bcTester. Added
Aztec Runes, Micro QR Code and Data Matrix ECC200 ECC 000-140. Updated e-mail
information. 18/11/2008

v2.1 - Reinstated Korea Post barcodes, harmonised bind and box options, moved
Unicode handling into backend and added input_mode option, added size options
to Data Matrix ECC200, added NULL character handling for Codablock-F, Code 128,
Code 16k, Extended Code 39, Code 93, Telepen, Maxicode, Data Matrix ECC200 ECC
200, PDF417 and MicroPDF417. Added GS1 support for Code 16k, Codablock-F and
Aztec Code. Added scale and direct to stdout options. Rebult Data Matrix ECC200
ECC 200 encoding algorithms to support NULL encoding and GS1 data encoding.
31/1/2009

v2.1.1 - Minor Data Matrix ECC200 bugfix and added HIBC options. 10/2/2009

v2.1.2 - Added SVG output option. Improved Japanese character support including
Unicode > Shift-JIS capability. Bugfixes for Data Matrix ECC200 (missing
characters at end of string) and Codablock-F (K1/K2 check digit and row
indicators above row 6). 1/3/2009

v2.1.3 - Many improvements to the QZint GUI which is now renamed "Zint Barcode
Studio 0.2". Added Japanese Postal Barcode, Code 49 and Channel Code and made
corrections to Data Matrix ECC200 (Binary mode data compression terminates too
soon), Aztec Code (Bug when automatically resizing after removing "all 0" and
"all 1" codewords) and Code 128 (Extended ASCII characters become corrupt).
19/5/2009

v2.1.4 - Many stability improvements including removal of buffer overruns in
Code 39, LOGMARS, PZN, Aztec Code and Composite CC-A. Addition of files for
compiling on MS Windows platform - tested successfully on XP and Vista.
19/6/2009

v2.2 - Added Code One and GS1 support in Code 49. Changed GUI binary name to
zint-qt and brought GUI up to version 1.0. Made some minor bugfixes to Code 39,
ITF-14, Aztec Code, Code 128 and Code 16K. Added 'rest' button to GUI. Included
.spec file from Radist. 18/7/2009

v2.2.1 - Data encoding bugfixes for Aztec Code, Data Matrix ECC200, USPS One
Code and PDF417. Symbol plotting bugfixes for MicroPDF417 and 2D components of
composite symbols. Text formatting bugfix for Qt renderer and a couple of
compiler fixes for MSVC PNG image output. 6/8/2009

v2.2.2 - A beta release previewing the new API structure. Better NULL character
support with "nullchar" value removed. Added loading from file and sequence
dialogs in Barcode Studio. 29/9/2009

v2.3 - Fixed problems with Micro QR Code and rebuilt QR Code support removing
dependence on libqrencode. Improved Kanji character support for QR Code and
Micro QR Code which now auto-detects and automatically converts to Shift-JIS.
Added Grid Matrix symbology with Kanji character support and automatic
conversion to GB 2312. Removed no_qr compile option. Advanced Barcode Studio
version number to match library version number. 23/11/2009

v2.3.1 - Removed Codablock-F. Redesigned scale function so that human readable
text and Maxicode symbols can be scaled consistently. Corrected encoding bugs
with Code 128/Code 16k and Data Matrix ECC200 ECC 050. Added --notext option to
CLI. 7/3/2010

v2.3.2 - Corrected many bugs in GS1 DataBar Extended thanks to the careful
study of the code by Pablo Orduña at the PIRAmIDE project. Similarly corrected
some bugs in Maxicode thanks to Monica Swanson at Source Technologies. Also
minor bugfixes for ISBN and Aztec Code, and added some small features like a
--square option in the CLI. 29/5/2010

v2.4 - Built extensions to the API for integrating with glabels with thanks to
Sam Lown and Jim Evins. Added code optimisation and input from stdin thanks to
Ismael Luceno. Reinstated escape character input. Simplification of Barcode
Studio. 13/9/2010

v2.4.1 & 2.4.2 – A whole host of bugfixes including correction of ECC routines
for Code-1 and addition of batch processing at the command line. 19/4/2011 &
4/5/2011

v2.4.3 - Includes minor bugfixes 16/5/2011

v2.5 – Support for DotCode and Han Xin code. Restore support for Codablock-F.
ECI code processing. Output to BMP, GIF and PCX. Added bold text option. Many
minor bugfixes and improvements.
13/11/2016

v2.6 - Output to EMF and TIF. Update frontend to Qt5. Copy to clipboard on
KDE and Windows.
12/5/2017

v2.6.1 - Various bugfixes to backend, including improved Aztec code processing.
Many improvements to GUI including resizable screens and more output while
batch processing, more consistent use of dialogues.
27/8/2017

v2.6.2 - Further bugfixes in Aztec and DotCode. Expand escape sequence support
to API and GUI. Handle UTF BOM. Bugfix raster images of Maxicode.
22/10/2017

v2.6.3 - New symbology Royal Mail 4-state Mailmark. Added North America VIN
verification. Bugfixes for TIF and EMF output and escape character handling.
15/02/2018

v2.6.4 - Datamatrix DMRE updated to the ISO/IEC29158 version. This is incompatible
in the way, that the old -vers numbers for DMRE are re-assigned.
The separator of GS1-datamatrix may be switched from FNC1 to GS.
GS1 field length check AI 8009 and 7230 to 7239 currected.

v2.6.5 - minor bugfixes

v2.6.6 - minor Bugfixes

v2.6.7 - Allow to code ECI 3 if explicitly given for debug purposes.

v2.7.0 - new features:
- Automatic height option added to qzint
- DotCode in line with new specification
- New GS1 AIs 7240, 235, 417, 7040, 8026, updated checks for 7007, 8008
- New Symbology rMQR
- QR and Gridmatrix optimisation for GB2312
- removed depreciated interface for gLabels program. Please use current interface.

7.4 Sources of Information
--------------------------
Below is a list of some of the sources used in rough chronological order:

Nick Johnson's Barcode Specifications
Bar Code 1 Specification Source Page
SB Electronic Systems Telepen website
Pharmacode specifications from Laetus
Morovia RM4SCC specification
Austalia Post's 'A Guide to Printing the 4-State Barcode' and bcsample source
   code
Plessey algorithm from GNU-Barcode v0.98 by Leonid A. Broukhis
GS1 General Specifications v 8.0 Issue 2
PNG: The Definitive Guide and wpng source code by Greg Reolofs
PDF417 specification and pdf417 source code by Grand Zebu
Barcode Reference, TBarCode/X User Documentation and TBarCode/X demonstration
   program from Tec-It
IEC16022 source code by Stefan Schmidt et al
United States Postal Service Specification USPS-B-3200
Adobe Systems Incorporated Encapsulated PostScript File Format Specification
BSI Online Library
Libdmtx Data Matrix ECC200 decoding library

7.5 Standard Compliance
-----------------------
Zint was developed to provide compliance with the following British and
international standards:

> BS EN 797:1996 Bar coding - Symbology specifications - 'EAN/UPC'
> BS EN 798:1996 Bar coding - Symbology specifications - 'Codabar'
> ISO/IEC 12323:2005 AIDC technologies - Symbology specifications - Code 16K
> ISO/IEC 15417:2007 Information technology - Automatic identification and data
     capture techniques - Code 128 bar code symbology specification
> ISO/IEC 15438:20062015 Information technology - Automatic identification and
     data capture techniques - PDF417 bar code symbology specification
> ISO/IEC 16022:2006 Information technology - Automatic identification and data
     capture techniques - Data Matrix ECC200 bar code symbology specification
> ISO/IEC 16023:2000 Information technology - International symbology
     specification – Maxicode
> ISO/IEC 16388:2007 Information technology - Automatic identification and data
     capture techniques - Code 39 bar code symbology specification
> ISO/IEC 18004:2015 Information technology - Automatic identification and data
     capture techniques - QR Code bar code symbology specification
> ISO/IEC 24723:2010 Information technology - Automatic identification and data
     capture techniques - GS1 Composite bar code symbology specification
> ISO/IEC 24724:2011 Information technology - Automatic identification and data
     capture techniques - GS1 DataBar bar code symbology specification
> ISO/IEC 24728:2006 Information technology - Automatic identification and data
     capture techniques - MicroPDF417 bar code symbology specification
> ISO/IEC 24778:2008 Information technology - Automatic identification and data
     capture techniques - Aztec Code bar code symbology specification
> Uniform Symbology Specification Code One (AIM Inc., 1994)
> ANSI/AIM BC12-1998 - Uniform Symbology Specification Channel Code
> ANSI/AIM BC6-2000 - Uniform Symbology Specification Code 49
> ANSI/HIBC 2.3-2009 - The Health Industry Bar Code (HIBC) Supplier Labeling
     Standard
> AIM ISS-X-24 - Uniform Symbology Specification Codablock F
> AIMD013 (v 1.34a) – Information technology – Automaic identification and data
     capture techniques – Bar code symbology specification – DotCode (Revised
     19th Feb 2009)
> AIMD014 (v 1.63) - Information technology, Automatic identification and data
     capture techniques - Bar code symbology specification - Grid Matrix
     (Released 9th Dec 2008)
> AIMD-015:2010 (v 0.8) – DRAFT Bar code symbology specification – Han Xin Code
     (Revised 25th March 2010)
> GS1 General Specifications Version 8.0
> AIM ITS/04-001 International Technical Standard – Extended Channel
     Interpretations Part 1: Identification Schemes and Protocol (Released 24th
     May 2004)
> AIM ITS/04-023 International Technical Standard – Extended Channel
     Interpretations Part 3: Register (Released 15th July 2004)

A. Character Encoding
=====================
This section is intended as a quick reference to the character sets used by
Zint. All symbologies use standard ASCII input as shown in section A.1, but
some support extended character support as shown in the subsequent section.

A.1 ASCII Standard
------------------
The ubiquitous ASCII standard is well known to most computer users. It's
reproduced here for reference.

-------------------------------------------------------------
Hex |  0     |  1    |  2      |  3  |  4  |  5  |  6  |  7
-------------------------------------------------------------
0   |  NULL  |  DLE  |  SPACE  |  0  |  @  |  P  |  `  |  p
1   |  SOH   |  DC1  |  !      |  1  |  A  |  Q  |  a  |  q
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
D   |  CR    |  GS   |  -      |  =  |  M  |  ]  |  m  |  }
E   |  SO    |  RS   |  .      |  >  |  N  |  ^  |  n  |  ~
F   |  SI    |  US   |  /      |  ?  |  O  |  _  |  o  |  DEL
-------------------------------------------------------------

A.2 Latin Alphabet No 1 (ISO 8859-1)
------------------------------------
A common extension to the ASCII standard, Latin-1 is used to expand the range 
of Code 128, PDF417 and other symbols. Input strings should be in Unicode 
format 

------------------------------------------------------
Hex |  8  |  9  |  A      |  B  |  C  |  D  |  E  |  F
------------------------------------------------------
0   |     |     |  NBSP   |  °  |  À  |  à |  à  |  ð
1   |     |     |  ¡      |  ±  |  à |  Ñ  |  á  |  ñ
2   |     |     |  ¢      |  ²  |  Â  |  Ò  |  â  |  ò







|
|
|







2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
D   |  CR    |  GS   |  -      |  =  |  M  |  ]  |  m  |  }
E   |  SO    |  RS   |  .      |  >  |  N  |  ^  |  n  |  ~
F   |  SI    |  US   |  /      |  ?  |  O  |  _  |  o  |  DEL
-------------------------------------------------------------

A.2 Latin Alphabet No 1 (ISO 8859-1)
------------------------------------
A common extension to the ASCII standard, Latin-1 is used to expand the range
of Code 128, PDF417 and other symbols. Input strings should be in Unicode
format

------------------------------------------------------
Hex |  8  |  9  |  A      |  B  |  C  |  D  |  E  |  F
------------------------------------------------------
0   |     |     |  NBSP   |  °  |  À  |  à |  à  |  ð
1   |     |     |  ¡      |  ±  |  à |  Ñ  |  á  |  ñ
2   |     |     |  ¢      |  ²  |  Â  |  Ò  |  â  |  ò
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
B   |     |     |  «      |  »  |  Ë  |  Û  |  ë  |  û
C   |     |     |  ¬      |  ¼  |  Ì  |  Ü  |  ì  |  ü
D   |     |     |  SHY    |  ½  |  à |  à |  í  |  ý
E   |     |     |  ®      |  ¾  |  Î  |  Þ  |  î  |  þ
F   |     |     |  ¯      |  ¿  |  à |  ß  |  î  |  ÿ
------------------------------------------------------

B. Three Digit Country Codes (ISO 3166)
---------------------------------------
Below are some of the three digit country codes (in right-hand column) as 
determined by ISO 3166 for use with Maxicode symbols. 

Country                                         A 2     A 3     Number
----------------------------------------------------------------------
AALAND ISLANDS                                  AX      ALA     248
AFGHANISTAN                                     AF      AFG     004
ALBANIA                                         AL      ALB     008
ALGERIA                                         DZ      DZA     012
AMERICAN SAMOA                                  AS      ASM     016
ANDORRA                                         AD      AND     020
ANGOLA                                          AO      AGO     024
ANGUILLA                                        AI      AIA     660
ANTARCTICA                                      AQ      ATA     010
ANTIGUA AND BARBUDA                             AG      ATG     028
ARGENTINA                                       AR      ARG     032
ARMENIA                                         AM      ARM     051  
ARUBA                                           AW      ABW     533
AUSTRALIA                                       AU      AUS     036
AUSTRIA                                         AT      AUT     040
AZERBAIJAN                                      AZ      AZE     031  
BAHAMAS                                         BS      BHS     044
BAHRAIN                                         BH      BHR     048
BANGLADESH                                      BD      BGD     050
BARBADOS                                        BB      BRB     052
BELARUS                                         BY      BLR     112  
BELGIUM                                         BE      BEL     056
BELIZE                                          BZ      BLZ     084
BENIN                                           BJ      BEN     204
BERMUDA                                         BM      BMU     060
BHUTAN                                          BT      BTN     064
BOLIVIA                                         BO      BOL     068
BOSNIA AND HERZEGOWINA                          BA      BIH     070
BOTSWANA                                        BW      BWA     072
BOUVET ISLAND                                   BV      BVT     074
BRAZIL                                          BR      BRA     076
BRITISH INDIAN OCEAN TERRITORY                  IO      IOT     086
BRUNEI DARUSSALAM                               BN      BRN     096
BULGARIA                                        BG      BGR     100
BURKINA FASO                                    BF      BFA     854
BURUNDI                                         BI      BDI     108
CAMBODIA                                        KH      KHM     116
CAMEROON                                        CM      CMR     120
CANADA                                          CA      CAN     124
CAPE VERDE                                      CV      CPV     132
CAYMAN ISLANDS                                  KY      CYM     136
CENTRAL AFRICAN REPUBLIC                        CF      CAF     140
CHAD                                            TD      TCD     148
CHILE                                           CL      CHL     152
CHINA                                           CN      CHN     156
CHRISTMAS ISLAND                                CX      CXR     162
COCOS (KEELING) ISLANDS                         CC      CCK     166
COLOMBIA                                        CO      COL     170
COMOROS                                         KM      COM     174
CONGO, Democratic Republic of (was Zaire)       CD      COD     180
CONGO, Republic of                              CG      COG     178
COOK ISLANDS                                    CK      COK     184
COSTA RICA                                      CR      CRI     188
COTE D'IVOIRE                                   CI      CIV     384
CROATIA (local name: Hrvatska)                  HR      HRV     191      
CUBA                                            CU      CUB     192
CYPRUS                                          CY      CYP     196
CZECH REPUBLIC                                  CZ      CZE     203  
DENMARK                                         DK      DNK     208
DJIBOUTI                                        DJ      DJI     262
DOMINICA                                        DM      DMA     212
DOMINICAN REPUBLIC                              DO      DOM     214
ECUADOR                                         EC      ECU     218
EGYPT                                           EG      EGY     818
EL SALVADOR                                     SV      SLV     222
EQUATORIAL GUINEA                               GQ      GNQ     226
ERITREA                                         ER      ERI     232
ESTONIA                                         EE      EST     233  
ETHIOPIA                                        ET      ETH     231
FALKLAND ISLANDS (MALVINAS)                     FK      FLK     238
FAROE ISLANDS                                   FO      FRO     234
FIJI                                            FJ      FJI     242
FINLAND                                         FI      FIN     246
FRANCE                                          FR      FRA     250
FRENCH GUIANA                                   GF      GUF     254
FRENCH POLYNESIA                                PF      PYF     258
FRENCH SOUTHERN TERRITORIES                     TF      ATF     260
GABON                                           GA      GAB     266
GAMBIA                                          GM      GMB     270
GEORGIA                                         GE      GEO     268  
GERMANY                                         DE      DEU     276
GHANA                                           GH      GHA     288
GIBRALTAR                                       GI      GIB     292
GREECE                                          GR      GRC     300
GREENLAND                                       GL      GRL     304
GRENADA                                         GD      GRD     308
GUADELOUPE                                      GP      GLP     312
GUAM                                            GU      GUM     316
GUATEMALA                                       GT      GTM     320
GUINEA                                          GN      GIN     324
GUINEA-BISSAU                                   GW      GNB     624
GUYANA                                          GY      GUY     328
HAITI                                           HT      HTI     332
HEARD AND MC DONALD ISLANDS                     HM      HMD     334
HONDURAS                                        HN      HND     340
HONG KONG                                       HK      HKG     344
HUNGARY                                         HU      HUN     348
ICELAND                                         IS      ISL     352
INDIA                                           IN      IND     356
INDONESIA                                       ID      IDN     360
IRAN (ISLAMIC REPUBLIC OF)                      IR      IRN     364
IRAQ                                            IQ      IRQ     368
IRELAND                                         IE      IRL     372
ISRAEL                                          IL      ISR     376
ITALY                                           IT      ITA     380
JAMAICA                                         JM      JAM     388
JAPAN                                           JP      JPN     392
JORDAN                                          JO      JOR     400
KAZAKHSTAN                                      KZ      KAZ     398  
KENYA                                           KE      KEN     404
KIRIBATI                                        KI      KIR     296
KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF          KP      PRK     408
KOREA, REPUBLIC OF                              KR      KOR     410
KUWAIT                                          KW      KWT     414
KYRGYZSTAN                                      KG      KGZ     417  
LAO PEOPLE'S DEMOCRATIC REPUBLIC                LA      LAO     418
LATVIA                                          LV      LVA     428  
LEBANON                                         LB      LBN     422
LESOTHO                                         LS      LSO     426
LIBERIA                                         LR      LBR     430
LIBYAN ARAB JAMAHIRIYA                          LY      LBY     434
LIECHTENSTEIN                                   LI      LIE     438
LITHUANIA                                       LT      LTU     440  
LUXEMBOURG                                      LU      LUX     442
MACAU                                           MO      MAC     446
MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF      MK      MKD     807 
MADAGASCAR                                      MG      MDG     450
MALAWI                                          MW      MWI     454
MALAYSIA                                        MY      MYS     458
MALDIVES                                        MV      MDV     462
MALI                                            ML      MLI     466
MALTA                                           MT      MLT     470
MARSHALL ISLANDS                                MH      MHL     584
MARTINIQUE                                      MQ      MTQ     474
MAURITANIA                                      MR      MRT     478
MAURITIUS                                       MU      MUS     480
MAYOTTE                                         YT      MYT     175  
MEXICO                                          MX      MEX     484
MICRONESIA, FEDERATED STATES OF                 FM      FSM     583
MOLDOVA, REPUBLIC OF                            MD      MDA     498  
MONACO                                          MC      MCO     492
MONGOLIA                                        MN      MNG     496
MONTSERRAT                                      MS      MSR     500
MOROCCO                                         MA      MAR     504
MOZAMBIQUE                                      MZ      MOZ     508
MYANMAR                                         MM      MMR     104
NAMIBIA                                         NA      NAM     516
NAURU                                           NR      NRU     520
NEPAL                                           NP      NPL     524
NETHERLANDS                                     NL      NLD     528
NETHERLANDS ANTILLES                            AN      ANT     530
NEW CALEDONIA                                   NC      NCL     540
NEW ZEALAND                                     NZ      NZL     554
NICARAGUA                                       NI      NIC     558
NIGER                                           NE      NER     562
NIGERIA                                         NG      NGA     566
NIUE                                            NU      NIU     570
NORFOLK ISLAND                                  NF      NFK     574
NORTHERN MARIANA ISLANDS                        MP      MNP     580
NORWAY                                          NO      NOR     578
OMAN                                            OM      OMN     512
PAKISTAN                                        PK      PAK     586
PALAU                                           PW      PLW     585
PALESTINIAN TERRITORY, Occupied                 PS      PSE     275
PANAMA                                          PA      PAN     591
PAPUA NEW GUINEA                                PG      PNG     598
PARAGUAY                                        PY      PRY     600
PERU                                            PE      PER     604
PHILIPPINES                                     PH      PHL     608
PITCAIRN                                        PN      PCN     612
POLAND                                          PL      POL     616
PORTUGAL                                        PT      PRT     620
PUERTO RICO                                     PR      PRI     630
QATAR                                           QA      QAT     634
REUNION                                         RE      REU     638
ROMANIA                                         RO      ROU     642
RUSSIAN FEDERATION                              RU      RUS     643
RWANDA                                          RW      RWA     646
SAINT HELENA                                    SH      SHN     654
SAINT KITTS AND NEVIS                           KN      KNA     659
SAINT LUCIA                                     LC      LCA     662
SAINT PIERRE AND MIQUELON                       PM      SPM     666
SAINT VINCENT AND THE GRENADINES                VC      VCT     670
SAMOA                                           WS      WSM     882
SAN MARINO                                      SM      SMR     674
SAO TOME AND PRINCIPE                           ST      STP     678
SAUDI ARABIA                                    SA      SAU     682
SENEGAL                                         SN      SEN     686
SERBIA AND MONTENEGRO                           CS      SCG     891
SEYCHELLES                                      SC      SYC     690
SIERRA LEONE                                    SL      SLE     694
SINGAPORE                                       SG      SGP     702
SLOVAKIA                                        SK      SVK     703  
SLOVENIA                                        SI      SVN     705  
SOLOMON ISLANDS                                 SB      SLB     090
SOMALIA                                         SO      SOM     706
SOUTH AFRICA                                    ZA      ZAF     710
SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS    GS      SGS     239
SPAIN                                           ES      ESP     724
SRI LANKA                                       LK      LKA     144
SUDAN                                           SD      SDN     736
SURINAME                                        SR      SUR     740
SVALBARD AND JAN MAYEN ISLANDS                  SJ      SJM     744
SWAZILAND                                       SZ      SWZ     748
SWEDEN                                          SE      SWE     752
SWITZERLAND                                     CH      CHE     756
SYRIAN ARAB REPUBLIC                            SY      SYR     760
TAIWAN                                          TW      TWN     158
TAJIKISTAN                                      TJ      TJK     762  
TANZANIA, UNITED REPUBLIC OF                    TZ      TZA     834
THAILAND                                        TH      THA     764
TIMOR-LESTE                                     TL      TLS     626
TOGO                                            TG      TGO     768
TOKELAU                                         TK      TKL     772
TONGA                                           TO      TON     776
TRINIDAD AND TOBAGO                             TT      TTO     780
TUNISIA                                         TN      TUN     788
TURKEY                                          TR      TUR     792
TURKMENISTAN                                    TM      TKM     795  
TURKS AND CAICOS ISLANDS                        TC      TCA     796
TUVALU                                          TV      TUV     798
UGANDA                                          UG      UGA     800
UKRAINE                                         UA      UKR     804
UNITED ARAB EMIRATES                            AE      ARE     784
UNITED KINGDOM                                  GB      GBR     826
UNITED STATES                                   US      USA     840
UNITED STATES MINOR OUTLYING ISLANDS            UM      UMI     581
URUGUAY                                         UY      URY     858
UZBEKISTAN                                      UZ      UZB     860  
VANUATU                                         VU      VUT     548
VATICAN CITY STATE (HOLY SEE)                   VA      VAT     336
VENEZUELA                                       VE      VEN     862
VIET NAM                                        VN      VNM     704
VIRGIN ISLANDS (BRITISH)                        VG      VGB     092
VIRGIN ISLANDS (U.S.)                           VI      VIR     850
WALLIS AND FUTUNA ISLANDS                       WF      WLF     876
WESTERN SAHARA                                  EH      ESH     732
YEMEN                                           YE      YEM     887
ZAMBIA                                          ZM      ZMB     894
ZIMBABWE                                        ZW      ZWE     716

C. GS1 General Specification
----------------------------
The GS1 General Specification defines a global standard for encoding data about 
products. Data is encoded as a series of number pairs where the first number, 
usually shown in (brackets) is an application identifier (AI), and the second 
is a formatted representation of the data. For example (21)6773 can be read as 
"Serial Number 6773" where the AI (21) signifies that the data is a serial 
number. Note that when using Zint AI data is entered using [square] brackets. 
This allows rounded brackets to be included in the data which is allowed by the 
specification. When the barcode symbol is generated these square brackets are 
replaced by rounded brackets in any text displayed. A list of valid AI numbers 
is given below. 

C.1 Application Identifiers [1]
---------------------------
00   Serial Shipping Container Code (SSCC)
01   Global Trade Item Number (GTIN)
02   # of containers
10   Batch Number
11   Production Date
13   Packaging Date
15   Sell by Date (Quality Control)
17   Expiration Date
20   Product Variant
21   Serial Number
22   HIBCC Quantity, Date, Batch and Link
23x  Lot Number
240  Additional Product Identification
250  Second Serial Number
30   Quantity Each
310y Product Net Weight in kg
311y Product Length/1st Dimension, in meters
312y Product Width/Diameter/2nd Dimension, in meters
313y Product Depth/Thickness/3rd Dimension, in meters
314y Product Area, in square meters
315y Product Volume, in liters
316y product Volume, in cubic meters
320y Product Net Weight, in pounds
321y Product Length/1st Dimension, in inches
322y Product Length/1st Dimension, in feet
323y Product Length/1st Dimension, in yards
324y Product Width/Diameter/2nd Dimension, in inches
325y Product Width/Diameter/2nd Dimension, in feet
326y Product Width/Diameter/2nd Dimension, in yards
327y Product Depth/Thickness/3rd Dimension, in inches
328y Product Depth/Thickness/3rd Dimension, in feet
329y Product Depth/Thickness/3rd Dimension, in yards
330y Container Gross Weight (kg)
331y Container Length/1st Dimension (Meters)
332y Container Width/Diameter/2nd Dimension (Meters)
333y Container Depth/Thickness/3rd Dimension (Meters)
334y Container Area (Square Meters)
335y Container Gross Volume (Liters)
336y Container Gross Volume (Cubic Meters)
340y Container Gross Weight (Pounds)
341y Container Length/1st Dimension, in inches
342y Container Length/1st Dimension, in feet
343y Container Length/1st Dimension in, in yards
344y Container Width/Diameter/2nd Dimension, in inches
345y Container Width/Diameter/2nd Dimension, in feet
346y Container Width/Diameter/2nd Dimension, in yards
347y Container Depth/Thickness/Height/3rd Dimension, in inches
348y Container Depth/Thickness/Height/3rd Dimension, in feet
349y Container Depth/Thickness/Height/3rd Dimension, in yards
350y Product Area (Square Inches)
351y Product Area (Square Feet)
352y Product Area (Square Yards)
353y Container Area (Square Inches)
354y Container Area (Square Feet)
355y Container Area (Suqare Yards)
356y Net Weight (Troy Ounces)
360y Product Volume (Quarts)
361y Product Volume (Gallons)
362y Container Gross Volume (Quarts)
363y Container Gross Volume (Gallons)
364y Product Volume (Cubic Inches)
365y Product Volume (Cubic Feet)
366y Product Volume (Cubic Yards)
367y Container Gross Volume (Cubic Inches)
368y Container Gross Volume (Cubic Feet)
369y Container Gross Volume (Cubic Yards)
37   Number of Units Contained
400  Customer Purchase Order Number
410  Ship To/Deliver To Location Code (Global Location Number)
411  Bill To/Invoice Location Code (Global Location Number)
412  Purchase From Location Code (Global Location Number)
420  Ship To/Deliver To Postal Code (Single Postal Authority)
421  Ship To/Deliver To Postal Code (Multiple Postal Authority)
8001 Roll Products - Width/Length/Core Diameter
8002 Electronic Serial Number (ESN) for Cellular Phone
8003 Global Returnable Asset Identifier
8004 Global Individual Asset Identifier
8005 Price per Unit of Measure
8100 Coupon Extended Code: Number System and Offer
8101 Coupon Extended Code: Number System, Offer, End of Offer
8102 Coupon Extended Code: Number System preceded by 090 Mutually Agreed 
     Between Trading Partners
91   Internal Company Codes
92   Internal Company Codes
93   Internal Company Codes
94   Internal Company Codes
95   Internal Company Codes
96   Internal Company Codes
97   Internal Company Codes
98   Internal Company Codes
99   Internal Company Codes

C.2 Fixed Length Fields
-----------------------
The GS1 Specification requires that some of the data to be encoded fits a 
standard length field. Zint will generate an error if the correct data lengths 
are not entered. The following table details which AIs have fixed length data 
fields and how long the data should be for each: 

------------------------------------
Application  |  Number of Characters
Identifier   |  (AI and Data Field)
------------------------------------
00           |  20
01           |  16
02           |  16
03           |  16
04           |  18
11           |  8
12           |  8
13           |  8
14           |  8
15           |  8
16           |  8
17           |  8
18           |  8
19           |  8
20           |  4
31           |  10
32           |  10
33           |  10
34           |  10
35           |  10
36           |  10
41           |  16
------------------------------------

[1] This information taken from Wikipedia (http://en.wikipedia.org/wiki/GS1) and 
used under the terms of the GNU Free Documentation License . 







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
2799
2800
2801
2802
2803
2804
2805








































































































































































































































































































































































































B   |     |     |  «      |  »  |  Ë  |  Û  |  ë  |  û
C   |     |     |  ¬      |  ¼  |  Ì  |  Ü  |  ì  |  ü
D   |     |     |  SHY    |  ½  |  à |  à |  í  |  ý
E   |     |     |  ®      |  ¾  |  Î  |  Þ  |  î  |  þ
F   |     |     |  ¯      |  ¿  |  à |  ß  |  î  |  ÿ
------------------------------------------------------









































































































































































































































































































































































































Deleted jni/zint/frontend/Makefile.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Linux makefile for zint - requires libzint
#
# make			compiles zint
# make install		copies binary to /usr/local/bin
# make uninstall	removes the binary
# make clean		cleans up a previous compilation and any object or editor files
#

ZINT_VERSION:=-DZINT_VERSION=\"2.6.0\"

CC := gcc
INCLUDE := -I/usr/include
CFLAGS := -g

prefix := /usr
bindir := $(prefix)/bin
DESTDIR :=
LIBS:= -lz -lm -lpng

all: zint zint-static

main.o: main.c
	$(CC) -c -Wall $(INCLUDE) $(CFLAGS) $(ZINT_VERSION) -I../backend main.c -o main.o

zint: main.o
	$(CC) -Wall $(INCLUDE) $(CFLAGS) $(ZINT_VERSION) -I../backend -L../backend main.o -o zint -lzint

zint-static: main.c
	$(CC) -Wall $(INCLUDE) $(CFLAGS) $(ZINT_VERSION) -I../backend main.o -o zint-static ../backend/libzint.a $(LIBS)

.PHONY: install uninstall clean dist

clean:
	rm -f zint zint-static *.o *.a *~ *.png *.eps *.svg *.log

install:
	install -D -p  zint $(DESTDIR)$(bindir)/zint

uninstall:
	rm $(DESTDIR)$(bindir)/zint
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















































































Changes to jni/zint/frontend/isotest.sh.

1
2
3

4
5
6
7
8
9
10

zint -o aimbc6_fig1.gif -b 24 -d "MULTIPLE ROWS IN CODE 49"
zint -o aimbc6_fig3.gif -b 24 -d "EXAMPLE 2"
zint -o aimbc6_figb1.gif -b 24 -d "EXAMPLE 2"

zint -o aimbc12_fig1.gif -b 140 -d 1234
zint -o aimbc12_fige1.gif -b 140 -d 1000000
zint -o aimbc12_figf1a.gif -b 140 -d 00
zint -o aimbc12_figf1b.gif -b 140 -d 000
zint -o aimbc12_figf1c.gif -b 140 -d 0000
zint -o aimbc12_figf1d.gif -b 140 -d 00000
zint -o aimbc12_figf1e.gif -b 140 -d 000000
>



>







1
2
3
4
5
6
7
8
9
10
11
12
echo Creating images for Code 49...
zint -o aimbc6_fig1.gif -b 24 -d "MULTIPLE ROWS IN CODE 49"
zint -o aimbc6_fig3.gif -b 24 -d "EXAMPLE 2"
zint -o aimbc6_figb1.gif -b 24 -d "EXAMPLE 2"
echo Creating images for Channel Code...
zint -o aimbc12_fig1.gif -b 140 -d 1234
zint -o aimbc12_fige1.gif -b 140 -d 1000000
zint -o aimbc12_figf1a.gif -b 140 -d 00
zint -o aimbc12_figf1b.gif -b 140 -d 000
zint -o aimbc12_figf1c.gif -b 140 -d 0000
zint -o aimbc12_figf1d.gif -b 140 -d 00000
zint -o aimbc12_figf1e.gif -b 140 -d 000000
35
36
37
38
39
40
41

42

43
44
45

46








47
48
49









50
51
52
53
54
55
56

57

58

59

60

61
62
63

64
65
66

67
68
69
70
71

72
73
74
75
76
77
78
79
80
81
82
83

84
85
86
87
88
89
90
91
92
93
94
95
96

97
98
99
100

101
102
103
104
105
106
107
zint -o aimbc12_figf1ad.gif -b 140 -d 1000000
zint -o aimbc12_figf1ae.gif -b 140 -d 26
zint -o aimbc12_figf1af.gif -b 140 -d 292
zint -o aimbc12_figf1ag.gif -b 140 -d 3493
zint -o aimbc12_figf1ah.gif -b 140 -d 44072
zint -o aimbc12_figf1ai.gif -b 140 -d 576688
zint -o aimbc12_figf1aj.gif -b 140 -d 7742862

zint -o aim_cbf_fig1.gif -b 74 -d "CODABLOCK F 34567890123456789010040digit"

zint -o aimd013_fig1a.gif -b 115 --scale=10 --cols=51 --gs1 -d "[17]070620[10]ABC123456"
zint -o aimd013_fig1b.gif -b 115 --scale=10 --cols=23 --gs1 -d "[17]070620[10]ABC123456"
zint -o aimd013_fig4.gif -b 115 --scale=10 --gs1 -d "[17]070620[10]ABC123456"

zint -o aimd013_fig9.gif -b 115 --scale=10 -d "Dots can be Square!"








zint -o aimd014_fig1.gif -b 142 -d "Grid Matrix"
zint -o aimd014_fig12.gif -b 142 -d "Grid Matrix"
zint -o aimd014_figd1.gif -b 142 -d "AAT2556 电池充电器+é™åŽ‹è½¬æ¢å™¨ 200mA至2A tel:86 019 82512738"









zint -o en797_fig1.gif -b 13 -d 501234567890
zint -o en797_fig2.gif -b 13 -d 2012345
zint -o en797_fig3.gif -b 34 -d 01234567890
zint -o en797_fig4.gif -b 37 -d 0012345
zint -o en797_fig5.gif -b 13 -d 501234567890+12
zint -o en797_fig6.gif -b 13 -d 501234567890+86104
zint -o en798_fig1.gif -b 18 -d A37859B

zint -o en12323_fig3.gif -b 23 -d "ab0123456789"

zint -o iso15417_fig1.gif -b 20 -d AIM

zint -o iso15438_fig1.gif -b 55 -d "PDF417 Symbology Standard"

zint -o iso16388_fig1.gif -b 8 -d 1A

zint -o iso16022_fig1.gif -b 71 -d "A1B2C3D4E5F6G7H8I9J0K1L2"
zint -o iso16022_figo2.gif -b 71 -d "123456"
zint -o iso16022_figr1.gif -b 71 -d "30Q324343430794<OQQ"

zint -o iso16023_fig2.gif -b 57 --mode=4 -d "THIS IS A 93 CHARACTER CODE SET A MESSAGE THAT FILLS A MODE 4, UNAPPENDED, MAXICODE SYMBOL..."
zint -o iso16023_figb2.gif -b 57 --mode=2 --primary="152382802840001" -d "[)>\R01\G961Z00004951\GUPSN\G06X610\G159\G1234567\G1/1\G\GY\G634 ALPHA DR\GPITTSBURGH\GPA\R\E"
zint -o iso16023_figh1.gif -b 57 --mode=4 -d "Maxi Code (19 chars)"

zint -o iso18004_fig1.gif -b 58 -d "QR Code Symbol"
zint -o iso18004_fig2.gif -b 97 -d "01234567"
zint -o iso18004_fig29.gif -b 58 -d "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
zint -o iso18004_figi2.gif -b 58 -d "01234567"
zint -o iso18004_figi4.gif -b 97 -d "01234567"

zint -o iso24723_fig1.gif -b 133 --primary=1311234567890 -d "[17]010615[10]A123456"
zint -o iso24723_fig2.gif -b 131 --mode=3 --primary="[01]93812345678901" -d "[10]ABCD123456[410]3898765432108"
zint -o iso24723_fig3.gif -b 136 --mode=1 --primary=121230 -d "[15]021231"
zint -o iso24723_fig4.gif -b 130 --mode=1 --primary=1234567 -d "[21]A12345678"
zint -o iso24723_fig5.gif -b 130 --mode=1 --primary=331234567890 -d "[99]1234-abcd"
zint -o iso24723_fig6.gif -b 137 --mode=1 --primary=341234567890 -d "[17]010200"
zint -o iso24723_fig7.gif -b 133 --mode=2 --primary=351234567890 -d "[21]abcdefghijklmnopqrstuv"
zint -o iso24723_fig8.gif -b 132 --mode=1 --primary=361234567890 -d "[11]990102"
zint -o iso24723_fig9.gif -b 134 --mode=1 --primary="[01]93712345678904[3103]001234" -d "[91]1A2B3C4D5E"
zint -o iso24723_fig10.gif -b 139 --mode=1 --primary="[01]00012345678905[10]ABCDEF" -d "[21]12345678"
zint -o iso24723_fig11.gif -b 131 --mode=1 --primary="[01]03212345678906" -d "[21]A1B2C3D4E5F6G7H8"
zint -o iso24723_fig12.gif -b 131 --mode=3 --primary="[00]030123456789012340" -d "[02]13012345678909[10]1234567ABCDEFG"

zint -o iso24724_fig1.gif -b 29 -d 2001234567890
zint -o iso24724_fig2.gif -b 29 -d 0441234567890
zint -o iso24724_fig4.gif -b 29 --height=11 -d 0001234567890
zint -o iso24724_fig5.gif -b 79 -d 0001234567890
zint -o iso24724_fig6.gif -b 80 -d 0003456789012
zint -o iso24724_fig7.gif -b 30 -d 1501234567890
zint -o iso24724_fig8.gif -b 30 -d 0031234567890
zint -o iso24724_fig10.gif -b 31 -d "[01]98898765432106[3202]012345[15]991231"
zint -o iso24724_fig11.gif -b 31 -d "[01]90012345678903[3103]001750"
zint -o iso24724_fig12.gif -b 81 -d "[01]98898765432106[3202]012345[15]991231"
zint -o iso24724_fig13.gif -b 81 -d "[01]95012345678903[3103]000123"
zint -o iso24724_figf2.gif -b 30 -d 0009876543210
zint -o iso24724_figr3.gif -b 31 -d "[10]12A"

zint -o iso24728_fig1a.gif -b 84 --cols=1 -d "ABCDEFGHIJKLMNOPQRSTUV"
zint -o iso24728_fig1b.gif -b 84 --cols=2 -d "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD"
zint -o iso24728_fig1c.gif -b 84 --cols=3 -d "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN"
zint -o iso24728_fig1d.gif -b 84 --cols=4 -d "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB"

zint -o iso24778_figa1a.gif -b 128 -d 0
zint -o iso24778_figa1b.gif -b 128 -d 25
zint -o iso24778_figa1c.gif -b 128 -d 125
zint -o iso24778_figa1d.gif -b 128 -d 255
zint -o iso24778_figg2.gif -b 92 -d "Code 2D!"
zint -o iso24778_figi1a.gif -b 92 -d "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
zint -o iso24778_figi1b.gif -b 92 -d "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"







>

>
|
|
|
>
|
>
>
>
>
>
>
>
>



>
>
>
>
>
>
>
>
>







>

>

>

>

>



>



>





>












>













>




>







37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
zint -o aimbc12_figf1ad.gif -b 140 -d 1000000
zint -o aimbc12_figf1ae.gif -b 140 -d 26
zint -o aimbc12_figf1af.gif -b 140 -d 292
zint -o aimbc12_figf1ag.gif -b 140 -d 3493
zint -o aimbc12_figf1ah.gif -b 140 -d 44072
zint -o aimbc12_figf1ai.gif -b 140 -d 576688
zint -o aimbc12_figf1aj.gif -b 140 -d 7742862
echo Creating images for Codablock F...
zint -o aim_cbf_fig1.gif -b 74 -d "CODABLOCK F 34567890123456789010040digit"
echo Creating images for DotCode...
zint -o aimd013_fig1a.gif -b 115 --scale=10 --cols=64 --gs1 -d "[01]00012345678906[17]201231[10]ABC123456"
zint -o aimd013_fig1b.gif -b 115 --scale=10 --cols=29 --gs1 -d "[01]00012345678906[17]201231[10]ABC123456"
zint -o aimd013_fig5.gif -b 115 --scale=10 --cols=23 --gs1 -d "[17]070620[10]ABC123456"
# Fig 6 is same as fig 5
zint -o aimd013_fig7.gif -b 115 --scale=10 -d "2741"
zint -o aimd013_fig8a.gif -b 115 --scale=10 --cols=40 --gs1 -d "[01]00012345678905"
zint -o aimd013_fig8b.gif -b 115 --scale=10 --cols=18 --gs1 -d "[01]00012345678905"
zint -o aimd013_fig8c.gif -b 115 --scale=10 --cols=35 --gs1 -d "[01]00012345678905"
zint -o aimd013_fig8d.gif -b 115 --scale=10 --cols=17 --gs1 -d "[01]00012345678905"
# Fig 10 is same as fig 1b
zint -o aimd013_fig11.gif -b 115 --scale=10 --cols=35 -d "Dots can be Square!"
zint -o aimd013_tableg1.gif -b 115 --scale=10 --cols=13 --gs1 -d "[99]8766"
echo Creating images for Grid Matrix...
zint -o aimd014_fig1.gif -b 142 -d "Grid Matrix"
zint -o aimd014_fig12.gif -b 142 -d "Grid Matrix"
zint -o aimd014_figd1.gif -b 142 -d "AAT2556 电池充电器+é™åŽ‹è½¬æ¢å™¨ 200mA至2A tel:86 019 82512738"
echo Creating images of Han Xin...
zint -o aimd015_fig1.gif -b 116 --esc --vers=24 -d "汉信ç (Chinese-Sensible Code)是一ç§èƒ½å¤Ÿæœ‰æ•ˆè¡¨ç¤ºæ±‰å­—ã€å›¾åƒç­‰ä¿¡æ¯çš„二维æ¡ç ã€‚å®ƒçš„ä¸»è¦æŠ€æœ¯ç‰¹è‰²æ˜¯ï¼š1. 具有高度的汉字表示能力和汉字压缩效率。2. ä¿¡æ¯å®¹é‡å¤§ã€‚ 3. ç¼–ç èŒƒå›´å¹¿ï¼Œå¯ä»¥å°†ç…§ç‰‡ã€æŒ‡çº¹ã€æŽŒçº¹ã€ç­¾å­—ã€å£°éŸ³ã€æ–‡å­—ç­‰å‡¡å¯æ•°å­—化的信æ¯è¿›è¡Œç¼–ç ã€‚4. 支æŒåŠ å¯†æŠ€æœ¯ã€‚5.抗污æŸå’Œç•¸å˜èƒ½åŠ›å¼ºã€‚6.修正错误能力强。7 .å¯ä¾›ç”¨æˆ·é€‰æ‹©çš„纠错能力。8ï¼Žå®¹æ˜“åˆ¶ä½œä¸”æˆæœ¬ä½Žã€‚9ï¼Žæ±‰ä¿¡ç æ”¯æŒ84个版本,å¯ä»¥ç”±ç”¨æˆ·è‡ªä¸»è¿›è¡Œé€‰æ‹©ï¼Œæœ€å°ç ä»…有指甲大å°ã€‚10. 外形美观。"
zint -o aimd015_fig3.gif -b 116 -d "æ±‰ä¿¡ç æ ‡å‡†"
zint -o aimd015_fig4.gif -b 116 --esc --vers=4 -d "æ±‰ä¿¡ç æ ‡å‡†\r\n中国物å“ç¼–ç ä¸­å¿ƒ"
zint -o aimd015_fig5.gif -b 116 --esc --vers=24 -d "æ±‰ä¿¡ç æ ‡å‡†\r\n中国物å“ç¼–ç ä¸­å¿ƒ\r\n北京网路畅想科技å‘展有é™å…¬å¸\r\nå¼ æˆæµ·ã€èµµæ¥ ã€é»„燕滨ã€ç½—ç§‹ç§‘ã€çŽ‹æ¯…ã€å¼ é“Žã€çŽ‹è¶Š\r\n施煜ã€è¾¹å³¥ã€ä¿®å…´å¼º\r\næ±‰ä¿¡ç æ ‡å‡†\r\n中国物å“ç¼–ç ä¸­å¿ƒ\r\n北京网路畅想科技å‘展有é™å…¬å¸"
zint -o aimd015_fig6.gif -b 116 --esc --vers=40 -d "本标准规定了一ç§çŸ©é˜µå¼äºŒç»´æ¡ç â€”—汉信ç çš„ç åˆ¶ä»¥åŠç¼–è¯‘ç æ–¹æ³•。本标准中对汉信ç çš„ç å›¾æ–¹æ¡ˆã€ä¿¡æ¯ç¼–ç æ–¹æ³•ã€çº é”™ç¼–译ç ç®—法ã€ä¿¡æ¯æŽ’布方法ã€å‚考译ç ç®—法等内容进行了详细的æè¿°ï¼Œæ±‰ä¿¡ç å¯é«˜æ•ˆè¡¨ç¤ºã€ŠGB 18030—2000 ä¿¡æ¯æŠ€æœ¯ ä¿¡æ¯äº¤æ¢ç”¨æ±‰å­—ç¼–ç å­—符集基本集的扩充》中的汉字信æ¯ï¼Œå¹¶å…·æœ‰æ•°æ®å®¹é‡å¤§ã€æŠ—畸å˜å’ŒæŠ—污æŸèƒ½åŠ›å¼ºã€å¤–观美观等特点,适åˆäºŽåœ¨æˆ‘国å„行业的广泛应用。 测试文本,测试人:施煜,边峥,修兴强,è¢å¨²ï¼Œæµ‹è¯•目的:汉字表示,测试版本:40\r\n"
zint -o aimd015_fig7.gif -b 116 --esc --vers=62 -d "本标准规定了一ç§çŸ©é˜µå¼äºŒç»´æ¡ç â€”—汉信ç çš„ç åˆ¶ä»¥åŠç¼–è¯‘ç æ–¹æ³•。本标准中对汉信ç çš„ç å›¾æ–¹æ¡ˆã€ä¿¡æ¯ç¼–ç æ–¹æ³•ã€çº é”™ç¼–译ç ç®—法ã€ä¿¡æ¯æŽ’布方法ã€å‚考译ç ç®—法等内容进行了详细的æè¿°ï¼Œæ±‰ä¿¡ç å¯é«˜æ•ˆè¡¨ç¤ºã€ŠGB 18030—2000 ä¿¡æ¯æŠ€æœ¯ ä¿¡æ¯äº¤æ¢ç”¨æ±‰å­—ç¼–ç å­—符集基本集的扩充》中的汉字信æ¯ï¼Œå¹¶å…·æœ‰æ•°æ®å®¹é‡å¤§ã€æŠ—畸å˜å’ŒæŠ—污æŸèƒ½åŠ›å¼ºã€å¤–观美观等特点,适åˆäºŽåœ¨æˆ‘国å„行业的广泛应用。 测试文本,测试人:施煜,边峥,修兴强,è¢å¨²ï¼Œæµ‹è¯•目的:汉字表示,测试版本:40\r\n本标准规定了一ç§çŸ©é˜µå¼äºŒç»´æ¡ç â€”—汉信ç çš„ç åˆ¶ä»¥åŠç¼–è¯‘ç æ–¹æ³•。本标准中对汉信ç çš„ç å›¾æ–¹æ¡ˆã€ä¿¡æ¯ç¼–ç æ–¹æ³•ã€çº é”™ç¼–译ç ç®—法ã€ä¿¡æ¯æŽ’布方法ã€å‚考译ç ç®—法等内容进行了详细的æè¿°ï¼Œæ±‰ä¿¡ç å¯é«˜æ•ˆè¡¨ç¤ºã€ŠGB 18030—2000 ä¿¡æ¯æŠ€æœ¯ ä¿¡æ¯äº¤æ¢ç”¨æ±‰å­—ç¼–ç å­—符集基本集的扩充》中的汉字信æ¯ï¼Œå¹¶å…·æœ‰æ•°æ®å®¹é‡å¤§ã€æŠ—畸å˜å’ŒæŠ—污æŸèƒ½åŠ›å¼ºã€å¤–观美观等特点,适åˆäºŽåœ¨æˆ‘国å„行业的广泛应用。 测试文本,测试人:施煜,边峥,修兴强,è¢å¨²ï¼Œæµ‹è¯•目的:汉字表示,测试版本:40\r\n本标准规定了一ç§çŸ©é˜µå¼äºŒç»´æ¡ç â€”—汉信ç çš„ç åˆ¶ä»¥åŠç¼–è¯‘ç æ–¹æ³•。本标准中对汉信ç çš„ç å›¾æ–¹æ¡ˆã€ä¿¡æ¯ç¼–ç æ–¹æ³•ã€çº é”™ç¼–译ç ç®—法RSã€ä¿¡æ¯æŽ’布方法ã€å‚考译ç ç®—法等内容进行了详细的æè¿°ï¼Œæ±‰ä¿¡ç å¯é«˜æ•ˆè¡¨ç¤ºã€ŠGB 18030—2000 ä¿¡æ¯æŠ€æœ¯   122"
zint -o aimd015_fig8.gif -b 116 --esc --vers=84 -d "本标准规定了一ç§çŸ©é˜µå¼äºŒç»´æ¡ç â€”—汉信ç çš„ç åˆ¶ä»¥åŠç¼–è¯‘ç æ–¹æ³•。本标准中对汉信ç çš„ç å›¾æ–¹æ¡ˆã€ä¿¡æ¯ç¼–ç æ–¹æ³•ã€çº é”™ç¼–译ç ç®—法ã€ä¿¡æ¯æŽ’布方法ã€å‚考译ç ç®—法等内容进行了详细的æè¿°ï¼Œæ±‰ä¿¡ç å¯é«˜æ•ˆè¡¨ç¤ºã€ŠGB 18030—2000 ä¿¡æ¯æŠ€æœ¯ ä¿¡æ¯äº¤æ¢ç”¨æ±‰å­—ç¼–ç å­—符集基本集的扩充》中的汉字信æ¯ï¼Œå¹¶å…·æœ‰æ•°æ®å®¹é‡å¤§ã€æŠ—畸å˜å’ŒæŠ—污æŸèƒ½åŠ›å¼ºã€å¤–观美观等特点,适åˆäºŽåœ¨æˆ‘国å„行业的广泛应用。 测试文本,测试人:施煜,边峥,修兴强,è¢å¨²ï¼Œæµ‹è¯•目的:汉字表示,测试版本:84\r\n本标准规定了一ç§çŸ©é˜µå¼äºŒç»´æ¡ç â€”—汉信ç çš„ç åˆ¶ä»¥åŠç¼–è¯‘ç æ–¹æ³•。本标准中对汉信ç çš„ç å›¾æ–¹æ¡ˆã€ä¿¡æ¯ç¼–ç æ–¹æ³•ã€çº é”™ç¼–译ç ç®—法ã€ä¿¡æ¯æŽ’布方法ã€å‚考译ç ç®—法等内容进行了详细的æè¿°ï¼Œæ±‰ä¿¡ç å¯é«˜æ•ˆè¡¨ç¤ºã€ŠGB 18030—2000 ä¿¡æ¯æŠ€æœ¯ ä¿¡æ¯äº¤æ¢ç”¨æ±‰å­—ç¼–ç å­—符集基本集的扩充》中的汉字信æ¯ï¼Œå¹¶å…·æœ‰æ•°æ®å®¹é‡å¤§ã€æŠ—畸å˜å’ŒæŠ—污æŸèƒ½åŠ›å¼ºã€å¤–观美观等特点,适åˆäºŽåœ¨æˆ‘国å„行业的广泛应用。 测试文本,测试人:施煜,边峥,修兴强,è¢å¨²ï¼Œæµ‹è¯•目的:汉字表示,测试版本:84\r\n本标准规定了一ç§çŸ©é˜µå¼äºŒç»´æ¡ç â€”—汉信ç çš„ç åˆ¶ä»¥åŠç¼–è¯‘ç æ–¹æ³•。本标准中对汉信ç çš„ç å›¾æ–¹æ¡ˆã€ä¿¡æ¯ç¼–ç æ–¹æ³•ã€çº é”™ç¼–译ç ç®—法ã€ä¿¡æ¯æŽ’布方法ã€å‚考译ç ç®—法等内容进行了详细的æè¿°ï¼Œæ±‰ä¿¡ç å¯é«˜æ•ˆè¡¨ç¤ºã€ŠGB 18030—2000 ä¿¡æ¯æŠ€æœ¯ ä¿¡æ¯äº¤æ¢ç”¨æ±‰å­—ç¼–ç å­—符集基本集的扩充》中的汉字信æ¯ï¼Œå¹¶å…·æœ‰æ•°æ®å®¹é‡å¤§ã€æŠ—畸å˜å’ŒæŠ—污æŸèƒ½åŠ›å¼ºã€å¤–观美观等特点,适åˆäºŽåœ¨æˆ‘国å„行业的广泛应用。 测试文本,测试人:施煜,边峥,修兴强,è¢å¨²ï¼Œæµ‹è¯•目的:汉字表示,测试版本:40本标准规定了一ç§çŸ©é˜µå¼äºŒç»´æ¡ç â€”—汉信ç çš„ç åˆ¶ä»¥åŠç¼–è¯‘ç æ–¹æ³•。本标准中对汉信ç çš„ç å›¾æ–¹æ¡ˆã€ä¿¡æ¯ç¼–ç æ–¹æ³•ã€çº é”™ç¼–译ç ç®—法ã€ä¿¡æ¯æŽ’布方法ã€å‚考译ç ç®—法等内容进行了详细的æè¿°ï¼Œæ±‰ä¿¡ç å¯é«˜æ•ˆè¡¨ç¤ºã€ŠGB 18030—2000 ä¿¡æ¯æŠ€æœ¯ ä¿¡æ¯äº¤æ¢ç”¨æ±‰å­—ç¼–ç å­—符集基本集的扩充》中的汉字信æ¯ï¼Œå¹¶å…·æœ‰æ•°æ®å®¹é‡å¤§ã€æŠ—畸å˜å’ŒæŠ—污æŸèƒ½åŠ›å¼ºã€å¤–观美观等特点,适åˆäºŽåœ¨æˆ‘国å„行业的广泛应用。 测试文本,测试人:施煜,边峥,修兴强,è¢å¨²ï¼Œæµ‹è¯•目的:汉字表示,测试版本:84\r\n"
echo Creating images of EAN/UPC...
zint -o en797_fig1.gif -b 13 -d 501234567890
zint -o en797_fig2.gif -b 13 -d 2012345
zint -o en797_fig3.gif -b 34 -d 01234567890
zint -o en797_fig4.gif -b 37 -d 0012345
zint -o en797_fig5.gif -b 13 -d 501234567890+12
zint -o en797_fig6.gif -b 13 -d 501234567890+86104
zint -o en798_fig1.gif -b 18 -d A37859B
echo Creating images for Code 16k...
zint -o en12323_fig3.gif -b 23 -d "ab0123456789"
echo Creating images for Code 128...
zint -o iso15417_fig1.gif -b 20 -d AIM
echo Creating images for PDF417...
zint -o iso15438_fig1.gif -b 55 -d "PDF417 Symbology Standard"
echo Creating images for Code 39...
zint -o iso16388_fig1.gif -b 8 -d 1A
echo Creating images for Data Matrix...
zint -o iso16022_fig1.gif -b 71 -d "A1B2C3D4E5F6G7H8I9J0K1L2"
zint -o iso16022_figo2.gif -b 71 -d "123456"
zint -o iso16022_figr1.gif -b 71 -d "30Q324343430794<OQQ"
echo Creating images for Maxicode
zint -o iso16023_fig2.gif -b 57 --mode=4 -d "THIS IS A 93 CHARACTER CODE SET A MESSAGE THAT FILLS A MODE 4, UNAPPENDED, MAXICODE SYMBOL..."
zint -o iso16023_figb2.gif -b 57 --mode=2 --primary="152382802840001" -d "[)>\R01\G961Z00004951\GUPSN\G06X610\G159\G1234567\G1/1\G\GY\G634 ALPHA DR\GPITTSBURGH\GPA\R\E"
zint -o iso16023_figh1.gif -b 57 --mode=4 -d "Maxi Code (19 chars)"
echo Creating images for QR Code...
zint -o iso18004_fig1.gif -b 58 -d "QR Code Symbol"
zint -o iso18004_fig2.gif -b 97 -d "01234567"
zint -o iso18004_fig29.gif -b 58 -d "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
zint -o iso18004_figi2.gif -b 58 -d "01234567"
zint -o iso18004_figi4.gif -b 97 -d "01234567"
echo Creating images for Composite DataBar...
zint -o iso24723_fig1.gif -b 133 --primary=1311234567890 -d "[17]010615[10]A123456"
zint -o iso24723_fig2.gif -b 131 --mode=3 --primary="[01]93812345678901" -d "[10]ABCD123456[410]3898765432108"
zint -o iso24723_fig3.gif -b 136 --mode=1 --primary=121230 -d "[15]021231"
zint -o iso24723_fig4.gif -b 130 --mode=1 --primary=1234567 -d "[21]A12345678"
zint -o iso24723_fig5.gif -b 130 --mode=1 --primary=331234567890 -d "[99]1234-abcd"
zint -o iso24723_fig6.gif -b 137 --mode=1 --primary=341234567890 -d "[17]010200"
zint -o iso24723_fig7.gif -b 133 --mode=2 --primary=351234567890 -d "[21]abcdefghijklmnopqrstuv"
zint -o iso24723_fig8.gif -b 132 --mode=1 --primary=361234567890 -d "[11]990102"
zint -o iso24723_fig9.gif -b 134 --mode=1 --primary="[01]93712345678904[3103]001234" -d "[91]1A2B3C4D5E"
zint -o iso24723_fig10.gif -b 139 --mode=1 --primary="[01]00012345678905[10]ABCDEF" -d "[21]12345678"
zint -o iso24723_fig11.gif -b 131 --mode=1 --primary="[01]03212345678906" -d "[21]A1B2C3D4E5F6G7H8"
zint -o iso24723_fig12.gif -b 131 --mode=3 --primary="[00]030123456789012340" -d "[02]13012345678909[10]1234567ABCDEFG"
echo Creating images for GS1 DataBar...
zint -o iso24724_fig1.gif -b 29 -d 2001234567890
zint -o iso24724_fig2.gif -b 29 -d 0441234567890
zint -o iso24724_fig4.gif -b 29 --height=11 -d 0001234567890
zint -o iso24724_fig5.gif -b 79 -d 0001234567890
zint -o iso24724_fig6.gif -b 80 -d 0003456789012
zint -o iso24724_fig7.gif -b 30 -d 1501234567890
zint -o iso24724_fig8.gif -b 30 -d 0031234567890
zint -o iso24724_fig10.gif -b 31 -d "[01]98898765432106[3202]012345[15]991231"
zint -o iso24724_fig11.gif -b 31 -d "[01]90012345678903[3103]001750"
zint -o iso24724_fig12.gif -b 81 -d "[01]98898765432106[3202]012345[15]991231"
zint -o iso24724_fig13.gif -b 81 -d "[01]95012345678903[3103]000123"
zint -o iso24724_figf2.gif -b 30 -d 0009876543210
zint -o iso24724_figr3.gif -b 31 -d "[10]12A"
echo Creating images for MicroPDF417...
zint -o iso24728_fig1a.gif -b 84 --cols=1 -d "ABCDEFGHIJKLMNOPQRSTUV"
zint -o iso24728_fig1b.gif -b 84 --cols=2 -d "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCD"
zint -o iso24728_fig1c.gif -b 84 --cols=3 -d "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMN"
zint -o iso24728_fig1d.gif -b 84 --cols=4 -d "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZAB"
echo Creating images for Aztec Code...
zint -o iso24778_figa1a.gif -b 128 -d 0
zint -o iso24778_figa1b.gif -b 128 -d 25
zint -o iso24778_figa1c.gif -b 128 -d 125
zint -o iso24778_figa1d.gif -b 128 -d 255
zint -o iso24778_figg2.gif -b 92 -d "Code 2D!"
zint -o iso24778_figi1a.gif -b 92 -d "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
zint -o iso24778_figi1b.gif -b 92 -d "3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333"
Changes to jni/zint/frontend/main.c.
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
            "34: UPC-A             81: GS1 DataBar ESO         137: Comp DataBar Stack\n"
            "35: UPC-A + Check     82: Planet                  138: Comp DataBar Stack Omni\n"
            "37: UPC-E             84: MicroPDF                139: Comp DataBar ESO\n"
            "38: UPC-E + Check     85: USPS OneCode            140: Channel Code\n"
            "40: Postnet           86: UK Plessey              141: Code One\n"
            "47: MSI Plessey       87: Telepen Numeric         142: Grid Matrix\n"
            "49: FIM               89: ITF-14                  143: UPNQR\n"
            "50: Logmars           90: KIX Code\n"
            );
}

/* Output usage information */
void usage(void) {
    printf( "Zint version %d.%d.%d\n"
            "Encode input data in a barcode and save as BMP/EMF/EPS/GIF/PCX/PNG/SVG/TIF\n\n"







|







63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
            "34: UPC-A             81: GS1 DataBar ESO         137: Comp DataBar Stack\n"
            "35: UPC-A + Check     82: Planet                  138: Comp DataBar Stack Omni\n"
            "37: UPC-E             84: MicroPDF                139: Comp DataBar ESO\n"
            "38: UPC-E + Check     85: USPS OneCode            140: Channel Code\n"
            "40: Postnet           86: UK Plessey              141: Code One\n"
            "47: MSI Plessey       87: Telepen Numeric         142: Grid Matrix\n"
            "49: FIM               89: ITF-14                  143: UPNQR\n"
            "50: Logmars           90: KIX Code                145: rMQR\n"
            );
}

/* Output usage information */
void usage(void) {
    printf( "Zint version %d.%d.%d\n"
            "Encode input data in a barcode and save as BMP/EMF/EPS/GIF/PCX/PNG/SVG/TIF\n\n"
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
                            case 0x7f: // DEL
                                output_file[o] = '_';
                                break;
                            default:
                                output_file[o] = buffer[i];
                        }
                    }
                    
                    // Skip escape characters
                    if ((buffer[i] == 0x5c) && (symbol->input_mode & ESCAPE_MODE)) {
                        i++;
                        if (buffer[i] == 'x') {
                            i += 2;
                        }
                    }







|







322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
                            case 0x7f: // DEL
                                output_file[o] = '_';
                                break;
                            default:
                                output_file[o] = buffer[i];
                        }
                    }

                    // Skip escape characters
                    if ((buffer[i] == 0x5c) && (symbol->input_mode & ESCAPE_MODE)) {
                        i++;
                        if (buffer[i] == 'x') {
                            i += 2;
                        }
                    }
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
                    }
                    error_number = ZBarcode_Encode(my_symbol, (unsigned char*) optarg, strlen(optarg));
                    generated = 1;
                    if (error_number != 0) {
                            fprintf(stderr, "%s\n", my_symbol->errtxt);
                            fflush(stderr);
                    }
                    if (error_number < 5) {    
                        error_number = ZBarcode_Print(my_symbol, rotate_angle);
                        
                        if (error_number != 0) {
                            fprintf(stderr, "%s\n", my_symbol->errtxt);
                            fflush(stderr);
                            ZBarcode_Delete(my_symbol);
                            return 1;
                        }
                    }







|

|







708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
                    }
                    error_number = ZBarcode_Encode(my_symbol, (unsigned char*) optarg, strlen(optarg));
                    generated = 1;
                    if (error_number != 0) {
                            fprintf(stderr, "%s\n", my_symbol->errtxt);
                            fflush(stderr);
                    }
                    if (error_number < 5) {
                        error_number = ZBarcode_Print(my_symbol, rotate_angle);

                        if (error_number != 0) {
                            fprintf(stderr, "%s\n", my_symbol->errtxt);
                            fflush(stderr);
                            ZBarcode_Delete(my_symbol);
                            return 1;
                        }
                    }
Deleted jni/zint/frontend_qt/Makefile.Debug.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
#############################################################################
# Makefile for building: qtZint
# Generated by qmake (3.0) (Qt 5.7.1)
# Project:  frontend_qt.pro
# Template: app
#############################################################################

MAKEFILE      = Makefile.Debug

####### Compiler, tools and options

CC            = cl
CXX           = cl
DEFINES       = -DUNICODE -DWIN32 -DQT_UITOOLS_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS        = -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zi -MDd -W3 -w44456 -w44457 -w44458 /Fddebug\qtZint.vc.pdb $(DEFINES)
CXXFLAGS      = -nologo -Zc:wchar_t -FS -Zc:strictStrings -Zc:throwingNew -Zi -MDd -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -GR -EHsc /Fddebug\qtZint.vc.pdb $(DEFINES)
INCPATH       = -I. -I. -I..\backend_qt -I..\backend -Ic:\qt\5.7.1static\include -Ic:\qt\5.7.1static\include\QtUiTools -Ic:\qt\5.7.1static\include\QtWidgets -Ic:\qt\5.7.1static\include\QtGui -Ic:\qt\5.7.1static\include\QtCore -Idebug -I. -Ic:\qt\5.7.1static\mkspecs\win32-msvc2015 
LINKER        = link
LFLAGS        = /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'"
LIBS          = glu32.lib opengl32.lib gdi32.lib /LIBPATH:c:\qt\5.7.1static\lib qtmaind.lib /LIBPATH:..\backend_qt\release /LIBPATH:"..\..\lpng\projects\vstudio\Release Library" ..\backend_qt\release\QtZint.lib c:\qt\5.7.1static\lib\Qt5Core.lib kernel32.lib user32.lib shell32.lib uuid.lib ole32.lib advapi32.lib ws2_32.lib mpr.lib c:\qt\5.7.1static\lib\qtpcre.lib "..\..\lpng\projects\vstudio\Release Library\libpng16.lib" "..\..\lpng\projects\vstudio\Release Library\zlib.lib" Qt5UiToolsd.lib Qt5Widgetsd.lib Qt5Guid.lib Qt5Cored.lib /LIBPATH:c:\qt\5.7.1static\plugins\platforms qwindowsd.lib /LIBPATH:c:\qt\5.7.1static\plugins\imageformats qddsd.lib qicnsd.lib qicod.lib qtgad.lib qtiffd.lib qwbmpd.lib qwebpd.lib 
QMAKE         = C:\Qt\5.7.1static\bin\qmake.exe
IDC           = idc
IDL           = midl
ZIP           = zip -r -9
DEF_FILE      = 
RES_FILE      = 
COPY          = copy /y
SED           = $(QMAKE) -install sed
COPY_FILE     = copy /y
COPY_DIR      = xcopy /s /q /y /i
DEL_FILE      = del
DEL_DIR       = rmdir
MOVE          = move
CHK_DIR_EXISTS= if not exist
MKDIR         = mkdir
INSTALL_FILE    = copy /y
INSTALL_PROGRAM = copy /y
INSTALL_DIR     = xcopy /s /q /y /i

####### Output directory

OBJECTS_DIR   = debug

####### Files

SOURCES       = barcodeitem.cpp \
		datawindow.cpp \
		exportwindow.cpp \
		main.cpp \
		mainwindow.cpp \
		sequencewindow.cpp C:/test/git/zint-code/frontend_qt/qtzint_plugin_import.cpp \
		debug\qrc_resources.cpp \
		debug\moc_datawindow.cpp \
		debug\moc_exportwindow.cpp \
		debug\moc_mainwindow.cpp \
		debug\moc_sequencewindow.cpp
OBJECTS       = debug\barcodeitem.obj \
		debug\datawindow.obj \
		debug\exportwindow.obj \
		debug\main.obj \
		debug\mainwindow.obj \
		debug\sequencewindow.obj \
		debug\qtzint_plugin_import.obj \
		debug\qrc_resources.obj \
		debug\moc_datawindow.obj \
		debug\moc_exportwindow.obj \
		debug\moc_mainwindow.obj \
		debug\moc_sequencewindow.obj

DIST          =  barcodeitem.h \
		datawindow.h \
		exportwindow.h \
		mainwindow.h \
		sequencewindow.h barcodeitem.cpp \
		datawindow.cpp \
		exportwindow.cpp \
		main.cpp \
		mainwindow.cpp \
		sequencewindow.cpp
QMAKE_TARGET  = qtZint
DESTDIR        = debug\ #avoid trailing-slash linebreak
TARGET         = qtZint.exe
DESTDIR_TARGET = debug\qtZint.exe

####### Implicit rules

.SUFFIXES: .c .cpp .cc .cxx

{C:/test/git/zint-code/frontend_qt}.cpp{debug\}.obj::
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{C:/test/git/zint-code/frontend_qt}.cc{debug\}.obj::
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{C:/test/git/zint-code/frontend_qt}.cxx{debug\}.obj::
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{C:/test/git/zint-code/frontend_qt}.c{debug\}.obj::
	$(CC) -c $(CFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{debug}.cpp{debug\}.obj::
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{debug}.cc{debug\}.obj::
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{debug}.cxx{debug\}.obj::
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{debug}.c{debug\}.obj::
	$(CC) -c $(CFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{.}.cpp{debug\}.obj::
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{.}.cc{debug\}.obj::
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{.}.cxx{debug\}.obj::
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

{.}.c{debug\}.obj::
	$(CC) -c $(CFLAGS) $(INCPATH) -Fodebug\ @<<
	$<
<<

####### Build rules

first: all
all: Makefile.Debug  $(DESTDIR_TARGET)

$(DESTDIR_TARGET): c:\qt\5.7.1static\lib\Qt5UiToolsd.lib c:\qt\5.7.1static\lib\Qt5Widgetsd.lib c:\qt\5.7.1static\lib\Qt5Guid.lib c:\qt\5.7.1static\lib\Qt5Cored.lib ui_extData.h ui_extExport.h ui_extSequence.h ui_grpAztec.h ui_grpC128.h ui_grpC16k.h ui_grpC39.h ui_grpC49.h ui_grpChannel.h ui_grpCodeOne.h ui_grpCodablockF.h ui_grpDBExtend.h ui_grpDM.h ui_grpGrid.h ui_grpMaxicode.h ui_grpMicroPDF.h ui_grpMQR.h ui_grpMSICheck.h ui_grpPDF417.h ui_grpQR.h ui_grpHX.h ui_mainWindow.h ui_grpDotCode.h $(OBJECTS) 
	$(LINKER) $(LFLAGS) /MANIFEST:embed /OUT:$(DESTDIR_TARGET) @<<
$(OBJECTS) $(LIBS)
<<

qmake: FORCE
	@$(QMAKE) -o Makefile.Debug frontend_qt.pro

qmake_all: FORCE

dist:
	$(ZIP) qtZint.zip $(SOURCES) $(DIST) frontend_qt.pro c:\qt\5.7.1static\mkspecs\features\spec_pre.prf ..\..\..\..\qt\5.7.1static\mkspecs\common\angle.conf ..\..\..\..\qt\5.7.1static\mkspecs\common\msvc-base.conf ..\..\..\..\qt\5.7.1static\mkspecs\common\msvc-desktop.conf c:\qt\5.7.1static\mkspecs\qconfig.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dcore.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dcore_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dextras.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dextras_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dinput.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dinput_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dlogic.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dlogic_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dquick.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dquick_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dquickextras.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dquickextras_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dquickinput.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dquickinput_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dquickrender.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3dquickrender_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3drender.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_3drender_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_axbase.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_axbase_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_axcontainer.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_axcontainer_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_axserver.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_axserver_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_bluetooth.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_bluetooth_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_bootstrap_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_charts.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_charts_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_clucene_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_concurrent.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_concurrent_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_core.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_core_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_datavisualization.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_datavisualization_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_dbus.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_dbus_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_gamepad.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_gamepad_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_gui.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_gui_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_help.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_help_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_location.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_location_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_multimedia.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_multimedia_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_multimediawidgets.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_multimediawidgets_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_network.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_network_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_nfc.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_nfc_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_opengl.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_opengl_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_openglextensions.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_openglextensions_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_packetprotocol_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_platformsupport_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_positioning.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_positioning_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_printsupport.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_printsupport_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_purchasing.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_purchasing_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_qml.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_qml_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_qmldebug_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_qmldevtools_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_qmltest.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_qmltest_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_qtmultimediaquicktools_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_quick.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_quick_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_quickcontrols2.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_quickcontrols2_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_quickparticles_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_quicktemplates2_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_quickwidgets.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_quickwidgets_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_script.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_script_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_scripttools.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_scripttools_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_scxml.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_scxml_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_sensors.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_sensors_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_serialbus.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_serialbus_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_serialport.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_serialport_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_sql.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_sql_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_svg.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_svg_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_testlib.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_testlib_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_uiplugin.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_uitools.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_uitools_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_webchannel.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_webchannel_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_websockets.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_websockets_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_widgets.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_widgets_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_winextras.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_winextras_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_xml.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_xml_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_xmlpatterns.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_xmlpatterns_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_lib_zlib_private.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_assimpsceneio.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_dsengine.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_gltfsceneio.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qdds.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qgenericbearer.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qicns.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qico.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qminimal.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qmldbg_debugger.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qmldbg_inspector.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qmldbg_local.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qmldbg_native.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qmldbg_profiler.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qmldbg_quickprofiler.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qmldbg_server.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qmldbg_tcp.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qnativewifibearer.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qoffscreen.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qsvg.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qsvgicon.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtaudio_windows.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtga.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtgeoservices_mapbox.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtgeoservices_nokia.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtgeoservices_osm.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtiff.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtmedia_audioengine.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtmultimedia_m3u.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtpeakcanbus.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtposition_geoclue.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtposition_positionpoll.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtposition_serialnmea.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtsensorgestures_plugin.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtsensorgestures_shakeplugin.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtsensors_generic.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qttinycanbus.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtuiotouchplugin.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qtvirtualkeyboardplugin.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qwbmp.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qwebp.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_qwindows.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_softwarecontext.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_windowsprintersupport.pri c:\qt\5.7.1static\mkspecs\modules\qt_plugin_xinputgamepad.pri c:\qt\5.7.1static\mkspecs\features\qt_functions.prf c:\qt\5.7.1static\mkspecs\features\qt_config.prf c:\qt\5.7.1static\mkspecs\features\win32\qt_config.prf c:\qt\5.7.1static\mkspecs\win32-msvc2015\qmake.conf c:\qt\5.7.1static\mkspecs\features\spec_post.prf c:\qt\5.7.1static\mkspecs\features\exclusive_builds.prf c:\qt\5.7.1static\mkspecs\features\toolchain.prf c:\qt\5.7.1static\mkspecs\features\default_pre.prf c:\qt\5.7.1static\mkspecs\features\win32\default_pre.prf c:\qt\5.7.1static\mkspecs\features\resolve_config.prf c:\qt\5.7.1static\mkspecs\features\exclusive_builds_post.prf c:\qt\5.7.1static\mkspecs\features\default_post.prf c:\qt\5.7.1static\mkspecs\features\build_pass.prf c:\qt\5.7.1static\mkspecs\features\qt.prf c:\qt\5.7.1static\mkspecs\features\resources.prf c:\qt\5.7.1static\mkspecs\features\moc.prf c:\qt\5.7.1static\mkspecs\features\win32\opengl.prf c:\qt\5.7.1static\mkspecs\features\uic.prf c:\qt\5.7.1static\mkspecs\features\warn_on.prf c:\qt\5.7.1static\mkspecs\features\win32\rtti.prf c:\qt\5.7.1static\mkspecs\features\precompile_header.prf c:\qt\5.7.1static\mkspecs\features\file_copies.prf c:\qt\5.7.1static\mkspecs\features\win32\windows.prf c:\qt\5.7.1static\mkspecs\features\testcase_targets.prf c:\qt\5.7.1static\mkspecs\features\exceptions.prf c:\qt\5.7.1static\mkspecs\features\yacc.prf c:\qt\5.7.1static\mkspecs\features\lex.prf frontend_qt.pro resources.qrc c:\qt\5.7.1static\lib\Qt5Core.prl frontend_de.ts frontend_de.ts RESOURCES HEADERS SOURCES OBJECTIVE_SOURCES FORMS NO_PCH_SOURCES YACCSOURCES YACCSOURCES LEXSOURCES 

clean: compiler_clean 
	-$(DEL_FILE) debug\barcodeitem.obj debug\datawindow.obj debug\exportwindow.obj debug\main.obj debug\mainwindow.obj debug\sequencewindow.obj debug\qtzint_plugin_import.obj debug\qrc_resources.obj debug\moc_datawindow.obj debug\moc_exportwindow.obj debug\moc_mainwindow.obj debug\moc_sequencewindow.obj
	-$(DEL_FILE) debug\qtZint.vc.pdb debug\qtZint.ilk debug\qtZint.idb

distclean: clean 
	-$(DEL_FILE) C:\test\git\zint-code\frontend_qt\qtzint_plugin_import.cpp debug\qtZint.pdb
	-$(DEL_FILE) $(DESTDIR_TARGET)
	-$(DEL_FILE) Makefile.Debug

mocclean: compiler_moc_header_clean compiler_moc_source_clean

mocables: compiler_moc_header_make_all compiler_moc_source_make_all

check: first

benchmark: first

compiler_rcc_make_all: debug\qrc_resources.cpp
compiler_rcc_clean:
	-$(DEL_FILE) debug\qrc_resources.cpp
debug\qrc_resources.cpp: resources.qrc \
		c:\qt\5.7.1static\bin\rcc.exe \
		grpDM.ui \
		grpQR.ui \
		grpC16k.ui \
		grpMSICheck.ui \
		grpGrid.ui \
		grpMicroPDF.ui \
		grpMaxicode.ui \
		grpC39.ui \
		grpC49.ui \
		grpCodeOne.ui \
		grpPDF417.ui \
		grpDBExtend.ui \
		grpMQR.ui \
		grpDotCode.ui \
		grpCodablockF.ui \
		grpChannel.ui \
		grpC128.ui \
		grpAztec.ui \
		grpHX.ui \
		images\zoomout.png \
		images\rotateleft.png \
		images\zoomin.png \
		images\zint.png \
		images\rotateright.png
	c:\qt\5.7.1static\bin\rcc.exe -name resources resources.qrc -o debug\qrc_resources.cpp

compiler_moc_header_make_all: debug\moc_datawindow.cpp debug\moc_exportwindow.cpp debug\moc_mainwindow.cpp debug\moc_sequencewindow.cpp
compiler_moc_header_clean:
	-$(DEL_FILE) debug\moc_datawindow.cpp debug\moc_exportwindow.cpp debug\moc_mainwindow.cpp debug\moc_sequencewindow.cpp
debug\moc_datawindow.cpp: ui_extData.h \
		datawindow.h \
		c:\qt\5.7.1static\bin\moc.exe
	c:\qt\5.7.1static\bin\moc.exe $(DEFINES) -D_MSC_VER=1900 -D_WIN32 -Ic:/qt/5.7.1static/mkspecs/win32-msvc2015 -IC:/test/git/zint-code/frontend_qt -IC:/test/git/zint-code/frontend_qt -IC:/test/git/zint-code/backend_qt -IC:/test/git/zint-code/backend -Ic:/qt/5.7.1static/include -Ic:/qt/5.7.1static/include/QtUiTools -Ic:/qt/5.7.1static/include/QtWidgets -Ic:/qt/5.7.1static/include/QtGui -Ic:/qt/5.7.1static/include/QtCore datawindow.h -o debug\moc_datawindow.cpp

debug\moc_exportwindow.cpp: ui_extExport.h \
		barcodeitem.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsItem \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsitem.h \
		c:\qt\5.7.1static\include\QtCore\qglobal.h \
		c:\qt\5.7.1static\include\QtCore\qconfig.h \
		c:\qt\5.7.1static\include\QtCore\qfeatures.h \
		c:\qt\5.7.1static\include\QtCore\qsystemdetection.h \
		c:\qt\5.7.1static\include\QtCore\qprocessordetection.h \
		c:\qt\5.7.1static\include\QtCore\qcompilerdetection.h \
		c:\qt\5.7.1static\include\QtCore\qtypeinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtypetraits.h \
		c:\qt\5.7.1static\include\QtCore\qisenum.h \
		c:\qt\5.7.1static\include\QtCore\qsysinfo.h \
		c:\qt\5.7.1static\include\QtCore\qlogging.h \
		c:\qt\5.7.1static\include\QtCore\qflags.h \
		c:\qt\5.7.1static\include\QtCore\qatomic.h \
		c:\qt\5.7.1static\include\QtCore\qbasicatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_bootstrap.h \
		c:\qt\5.7.1static\include\QtCore\qgenericatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_cxx11.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_msvc.h \
		c:\qt\5.7.1static\include\QtCore\qglobalstatic.h \
		c:\qt\5.7.1static\include\QtCore\qmutex.h \
		c:\qt\5.7.1static\include\QtCore\qnumeric.h \
		c:\qt\5.7.1static\include\QtCore\qversiontagging.h \
		c:\qt\5.7.1static\include\QtCore\qobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs.h \
		c:\qt\5.7.1static\include\QtCore\qnamespace.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs_impl.h \
		c:\qt\5.7.1static\include\QtCore\qstring.h \
		c:\qt\5.7.1static\include\QtCore\qchar.h \
		c:\qt\5.7.1static\include\QtCore\qbytearray.h \
		c:\qt\5.7.1static\include\QtCore\qrefcount.h \
		c:\qt\5.7.1static\include\QtCore\qarraydata.h \
		c:\qt\5.7.1static\include\QtCore\qstringbuilder.h \
		c:\qt\5.7.1static\include\QtCore\qlist.h \
		c:\qt\5.7.1static\include\QtCore\qalgorithms.h \
		c:\qt\5.7.1static\include\QtCore\qiterator.h \
		c:\qt\5.7.1static\include\QtCore\qhashfunctions.h \
		c:\qt\5.7.1static\include\QtCore\qpair.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraylist.h \
		c:\qt\5.7.1static\include\QtCore\qstringlist.h \
		c:\qt\5.7.1static\include\QtCore\qregexp.h \
		c:\qt\5.7.1static\include\QtCore\qstringmatcher.h \
		c:\qt\5.7.1static\include\QtCore\qcoreevent.h \
		c:\qt\5.7.1static\include\QtCore\qscopedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qmetatype.h \
		c:\qt\5.7.1static\include\QtCore\qvarlengtharray.h \
		c:\qt\5.7.1static\include\QtCore\qcontainerfwd.h \
		c:\qt\5.7.1static\include\QtCore\qobject_impl.h \
		c:\qt\5.7.1static\include\QtCore\qvariant.h \
		c:\qt\5.7.1static\include\QtCore\qmap.h \
		c:\qt\5.7.1static\include\QtCore\qdebug.h \
		c:\qt\5.7.1static\include\QtCore\qhash.h \
		c:\qt\5.7.1static\include\QtCore\qtextstream.h \
		c:\qt\5.7.1static\include\QtCore\qiodevice.h \
		c:\qt\5.7.1static\include\QtCore\qlocale.h \
		c:\qt\5.7.1static\include\QtCore\qshareddata.h \
		c:\qt\5.7.1static\include\QtCore\qvector.h \
		c:\qt\5.7.1static\include\QtCore\qpoint.h \
		c:\qt\5.7.1static\include\QtCore\qset.h \
		c:\qt\5.7.1static\include\QtCore\qcontiguouscache.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer_impl.h \
		c:\qt\5.7.1static\include\QtCore\qrect.h \
		c:\qt\5.7.1static\include\QtCore\qmargins.h \
		c:\qt\5.7.1static\include\QtCore\qsize.h \
		c:\qt\5.7.1static\include\QtGui\qpainterpath.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qpolygon.h \
		c:\qt\5.7.1static\include\QtGui\qregion.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs_win.h \
		c:\qt\5.7.1static\include\QtCore\qdatastream.h \
		c:\qt\5.7.1static\include\QtCore\qline.h \
		c:\qt\5.7.1static\include\QtGui\qpixmap.h \
		c:\qt\5.7.1static\include\QtGui\qpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qcolor.h \
		c:\qt\5.7.1static\include\QtGui\qrgb.h \
		c:\qt\5.7.1static\include\QtGui\qrgba64.h \
		c:\qt\5.7.1static\include\QtGui\qimage.h \
		c:\qt\5.7.1static\include\QtGui\qpixelformat.h \
		c:\qt\5.7.1static\include\QtGui\qtransform.h \
		..\backend_qt\qzint.h \
		c:\qt\5.7.1static\include\QtGui\QColor \
		c:\qt\5.7.1static\include\QtGui\QPainter \
		c:\qt\5.7.1static\include\QtGui\qpainter.h \
		c:\qt\5.7.1static\include\QtGui\qtextoption.h \
		c:\qt\5.7.1static\include\QtGui\qpen.h \
		c:\qt\5.7.1static\include\QtGui\qbrush.h \
		c:\qt\5.7.1static\include\QtGui\qfontinfo.h \
		c:\qt\5.7.1static\include\QtGui\qfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontmetrics.h \
		..\backend\zint.h \
		exportwindow.h \
		c:\qt\5.7.1static\bin\moc.exe
	c:\qt\5.7.1static\bin\moc.exe $(DEFINES) -D_MSC_VER=1900 -D_WIN32 -Ic:/qt/5.7.1static/mkspecs/win32-msvc2015 -IC:/test/git/zint-code/frontend_qt -IC:/test/git/zint-code/frontend_qt -IC:/test/git/zint-code/backend_qt -IC:/test/git/zint-code/backend -Ic:/qt/5.7.1static/include -Ic:/qt/5.7.1static/include/QtUiTools -Ic:/qt/5.7.1static/include/QtWidgets -Ic:/qt/5.7.1static/include/QtGui -Ic:/qt/5.7.1static/include/QtCore exportwindow.h -o debug\moc_exportwindow.cpp

debug\moc_mainwindow.cpp: c:\qt\5.7.1static\include\QtGui\QtGui \
		c:\qt\5.7.1static\include\QtGui\QtGuiDepends \
		c:\qt\5.7.1static\include\QtCore\QtCore \
		c:\qt\5.7.1static\include\QtCore\QtCoreDepends \
		c:\qt\5.7.1static\include\QtCore\qabstractanimation.h \
		c:\qt\5.7.1static\include\QtCore\qobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs.h \
		c:\qt\5.7.1static\include\QtCore\qnamespace.h \
		c:\qt\5.7.1static\include\QtCore\qglobal.h \
		c:\qt\5.7.1static\include\QtCore\qconfig.h \
		c:\qt\5.7.1static\include\QtCore\qfeatures.h \
		c:\qt\5.7.1static\include\QtCore\qsystemdetection.h \
		c:\qt\5.7.1static\include\QtCore\qprocessordetection.h \
		c:\qt\5.7.1static\include\QtCore\qcompilerdetection.h \
		c:\qt\5.7.1static\include\QtCore\qtypeinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtypetraits.h \
		c:\qt\5.7.1static\include\QtCore\qisenum.h \
		c:\qt\5.7.1static\include\QtCore\qsysinfo.h \
		c:\qt\5.7.1static\include\QtCore\qlogging.h \
		c:\qt\5.7.1static\include\QtCore\qflags.h \
		c:\qt\5.7.1static\include\QtCore\qatomic.h \
		c:\qt\5.7.1static\include\QtCore\qbasicatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_bootstrap.h \
		c:\qt\5.7.1static\include\QtCore\qgenericatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_cxx11.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_msvc.h \
		c:\qt\5.7.1static\include\QtCore\qglobalstatic.h \
		c:\qt\5.7.1static\include\QtCore\qmutex.h \
		c:\qt\5.7.1static\include\QtCore\qnumeric.h \
		c:\qt\5.7.1static\include\QtCore\qversiontagging.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs_impl.h \
		c:\qt\5.7.1static\include\QtCore\qstring.h \
		c:\qt\5.7.1static\include\QtCore\qchar.h \
		c:\qt\5.7.1static\include\QtCore\qbytearray.h \
		c:\qt\5.7.1static\include\QtCore\qrefcount.h \
		c:\qt\5.7.1static\include\QtCore\qarraydata.h \
		c:\qt\5.7.1static\include\QtCore\qstringbuilder.h \
		c:\qt\5.7.1static\include\QtCore\qlist.h \
		c:\qt\5.7.1static\include\QtCore\qalgorithms.h \
		c:\qt\5.7.1static\include\QtCore\qiterator.h \
		c:\qt\5.7.1static\include\QtCore\qhashfunctions.h \
		c:\qt\5.7.1static\include\QtCore\qpair.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraylist.h \
		c:\qt\5.7.1static\include\QtCore\qstringlist.h \
		c:\qt\5.7.1static\include\QtCore\qregexp.h \
		c:\qt\5.7.1static\include\QtCore\qstringmatcher.h \
		c:\qt\5.7.1static\include\QtCore\qcoreevent.h \
		c:\qt\5.7.1static\include\QtCore\qscopedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qmetatype.h \
		c:\qt\5.7.1static\include\QtCore\qvarlengtharray.h \
		c:\qt\5.7.1static\include\QtCore\qcontainerfwd.h \
		c:\qt\5.7.1static\include\QtCore\qobject_impl.h \
		c:\qt\5.7.1static\include\QtCore\qanimationgroup.h \
		c:\qt\5.7.1static\include\QtCore\qparallelanimationgroup.h \
		c:\qt\5.7.1static\include\QtCore\qpauseanimation.h \
		c:\qt\5.7.1static\include\QtCore\qpropertyanimation.h \
		c:\qt\5.7.1static\include\QtCore\qvariantanimation.h \
		c:\qt\5.7.1static\include\QtCore\qeasingcurve.h \
		c:\qt\5.7.1static\include\QtCore\qvector.h \
		c:\qt\5.7.1static\include\QtCore\qpoint.h \
		c:\qt\5.7.1static\include\QtCore\qvariant.h \
		c:\qt\5.7.1static\include\QtCore\qmap.h \
		c:\qt\5.7.1static\include\QtCore\qdebug.h \
		c:\qt\5.7.1static\include\QtCore\qhash.h \
		c:\qt\5.7.1static\include\QtCore\qtextstream.h \
		c:\qt\5.7.1static\include\QtCore\qiodevice.h \
		c:\qt\5.7.1static\include\QtCore\qlocale.h \
		c:\qt\5.7.1static\include\QtCore\qshareddata.h \
		c:\qt\5.7.1static\include\QtCore\qset.h \
		c:\qt\5.7.1static\include\QtCore\qcontiguouscache.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer_impl.h \
		c:\qt\5.7.1static\include\QtCore\qsequentialanimationgroup.h \
		c:\qt\5.7.1static\include\QtCore\qtextcodec.h \
		c:\qt\5.7.1static\include\QtCore\qendian.h \
		c:\qt\5.7.1static\include\QtCore\qlibraryinfo.h \
		c:\qt\5.7.1static\include\QtCore\qdatetime.h \
		c:\qt\5.7.1static\include\QtCore\qbuffer.h \
		c:\qt\5.7.1static\include\QtCore\qdatastream.h \
		c:\qt\5.7.1static\include\QtCore\qdir.h \
		c:\qt\5.7.1static\include\QtCore\qfileinfo.h \
		c:\qt\5.7.1static\include\QtCore\qfile.h \
		c:\qt\5.7.1static\include\QtCore\qfiledevice.h \
		c:\qt\5.7.1static\include\QtCore\qdiriterator.h \
		c:\qt\5.7.1static\include\QtCore\qfileselector.h \
		c:\qt\5.7.1static\include\QtCore\QObject \
		c:\qt\5.7.1static\include\QtCore\QStringList \
		c:\qt\5.7.1static\include\QtCore\qfilesystemwatcher.h \
		c:\qt\5.7.1static\include\QtCore\qlockfile.h \
		c:\qt\5.7.1static\include\QtCore\qloggingcategory.h \
		c:\qt\5.7.1static\include\QtCore\qprocess.h \
		c:\qt\5.7.1static\include\QtCore\qresource.h \
		c:\qt\5.7.1static\include\QtCore\qsavefile.h \
		c:\qt\5.7.1static\include\QtCore\qsettings.h \
		c:\qt\5.7.1static\include\QtCore\qstandardpaths.h \
		c:\qt\5.7.1static\include\QtCore\qstorageinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtemporarydir.h \
		c:\qt\5.7.1static\include\QtCore\QScopedPointer \
		c:\qt\5.7.1static\include\QtCore\qtemporaryfile.h \
		c:\qt\5.7.1static\include\QtCore\qurl.h \
		c:\qt\5.7.1static\include\QtCore\qurlquery.h \
		c:\qt\5.7.1static\include\QtCore\qabstractitemmodel.h \
		c:\qt\5.7.1static\include\QtCore\qabstractproxymodel.h \
		c:\qt\5.7.1static\include\QtCore\qidentityproxymodel.h \
		c:\qt\5.7.1static\include\QtCore\qitemselectionmodel.h \
		c:\qt\5.7.1static\include\QtCore\qsortfilterproxymodel.h \
		c:\qt\5.7.1static\include\QtCore\qstringlistmodel.h \
		c:\qt\5.7.1static\include\QtCore\qjsonarray.h \
		c:\qt\5.7.1static\include\QtCore\qjsonvalue.h \
		c:\qt\5.7.1static\include\QtCore\qjsondocument.h \
		c:\qt\5.7.1static\include\QtCore\qjsonobject.h \
		c:\qt\5.7.1static\include\QtCore\qabstracteventdispatcher.h \
		c:\qt\5.7.1static\include\QtCore\qeventloop.h \
		c:\qt\5.7.1static\include\QtCore\qabstractnativeeventfilter.h \
		c:\qt\5.7.1static\include\QtCore\qbasictimer.h \
		c:\qt\5.7.1static\include\QtCore\qcoreapplication.h \
		c:\qt\5.7.1static\include\QtCore\qmath.h \
		c:\qt\5.7.1static\include\QtCore\qmetaobject.h \
		c:\qt\5.7.1static\include\QtCore\qmimedata.h \
		c:\qt\5.7.1static\include\QtCore\qobjectcleanuphandler.h \
		c:\qt\5.7.1static\include\QtCore\qpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedmemory.h \
		c:\qt\5.7.1static\include\QtCore\qsignalmapper.h \
		c:\qt\5.7.1static\include\QtCore\qsocketnotifier.h \
		c:\qt\5.7.1static\include\QtCore\qsystemsemaphore.h \
		c:\qt\5.7.1static\include\QtCore\qtimer.h \
		c:\qt\5.7.1static\include\QtCore\qtranslator.h \
		c:\qt\5.7.1static\include\QtCore\qwineventnotifier.h \
		c:\qt\5.7.1static\include\QtCore\qmimedatabase.h \
		c:\qt\5.7.1static\include\QtCore\qmimetype.h \
		c:\qt\5.7.1static\include\QtCore\qfactoryinterface.h \
		c:\qt\5.7.1static\include\QtCore\qlibrary.h \
		c:\qt\5.7.1static\include\QtCore\qplugin.h \
		c:\qt\5.7.1static\include\QtCore\qpluginloader.h \
		c:\qt\5.7.1static\include\QtCore\quuid.h \
		c:\qt\5.7.1static\include\QtCore\qabstractstate.h \
		c:\qt\5.7.1static\include\QtCore\qabstracttransition.h \
		c:\qt\5.7.1static\include\QtCore\qeventtransition.h \
		c:\qt\5.7.1static\include\QtCore\qfinalstate.h \
		c:\qt\5.7.1static\include\QtCore\qhistorystate.h \
		c:\qt\5.7.1static\include\QtCore\qsignaltransition.h \
		c:\qt\5.7.1static\include\QtCore\qstate.h \
		c:\qt\5.7.1static\include\QtCore\qstatemachine.h \
		c:\qt\5.7.1static\include\QtCore\qexception.h \
		c:\qt\5.7.1static\include\QtCore\qfuture.h \
		c:\qt\5.7.1static\include\QtCore\qfutureinterface.h \
		c:\qt\5.7.1static\include\QtCore\qrunnable.h \
		c:\qt\5.7.1static\include\QtCore\qresultstore.h \
		c:\qt\5.7.1static\include\QtCore\qfuturesynchronizer.h \
		c:\qt\5.7.1static\include\QtCore\qfuturewatcher.h \
		c:\qt\5.7.1static\include\QtCore\qreadwritelock.h \
		c:\qt\5.7.1static\include\QtCore\qsemaphore.h \
		c:\qt\5.7.1static\include\QtCore\qthread.h \
		c:\qt\5.7.1static\include\QtCore\qthreadpool.h \
		c:\qt\5.7.1static\include\QtCore\qthreadstorage.h \
		c:\qt\5.7.1static\include\QtCore\qwaitcondition.h \
		c:\qt\5.7.1static\include\QtCore\qarraydataops.h \
		c:\qt\5.7.1static\include\QtCore\qarraydatapointer.h \
		c:\qt\5.7.1static\include\QtCore\qbitarray.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraymatcher.h \
		c:\qt\5.7.1static\include\QtCore\qcache.h \
		c:\qt\5.7.1static\include\QtCore\qcollator.h \
		c:\qt\5.7.1static\include\QtCore\qcommandlineoption.h \
		c:\qt\5.7.1static\include\QtCore\qcommandlineparser.h \
		c:\qt\5.7.1static\include\QtCore\qcryptographichash.h \
		c:\qt\5.7.1static\include\QtCore\qelapsedtimer.h \
		c:\qt\5.7.1static\include\QtCore\qline.h \
		c:\qt\5.7.1static\include\QtCore\qlinkedlist.h \
		c:\qt\5.7.1static\include\QtCore\qmargins.h \
		c:\qt\5.7.1static\include\QtCore\qmessageauthenticationcode.h \
		c:\qt\5.7.1static\include\QtCore\qqueue.h \
		c:\qt\5.7.1static\include\QtCore\qrect.h \
		c:\qt\5.7.1static\include\QtCore\qsize.h \
		c:\qt\5.7.1static\include\QtCore\qregularexpression.h \
		c:\qt\5.7.1static\include\QtCore\qscopedvaluerollback.h \
		c:\qt\5.7.1static\include\QtCore\qstack.h \
		c:\qt\5.7.1static\include\QtCore\qtextboundaryfinder.h \
		c:\qt\5.7.1static\include\QtCore\qtimeline.h \
		c:\qt\5.7.1static\include\QtCore\qtimezone.h \
		c:\qt\5.7.1static\include\QtCore\qversionnumber.h \
		c:\qt\5.7.1static\include\QtCore\qxmlstream.h \
		c:\qt\5.7.1static\include\QtCore\qtcoreversion.h \
		c:\qt\5.7.1static\include\QtGui\qaccessible.h \
		c:\qt\5.7.1static\include\QtGui\qcolor.h \
		c:\qt\5.7.1static\include\QtGui\qrgb.h \
		c:\qt\5.7.1static\include\QtGui\qrgba64.h \
		c:\qt\5.7.1static\include\QtGui\qevent.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs_win.h \
		c:\qt\5.7.1static\include\QtGui\qregion.h \
		c:\qt\5.7.1static\include\QtGui\qkeysequence.h \
		c:\qt\5.7.1static\include\QtGui\qvector2d.h \
		c:\qt\5.7.1static\include\QtGui\qtouchdevice.h \
		c:\qt\5.7.1static\include\QtGui\qaccessiblebridge.h \
		c:\qt\5.7.1static\include\QtGui\qaccessibleobject.h \
		c:\qt\5.7.1static\include\QtGui\qaccessibleplugin.h \
		c:\qt\5.7.1static\include\QtGui\qbitmap.h \
		c:\qt\5.7.1static\include\QtGui\qpixmap.h \
		c:\qt\5.7.1static\include\QtGui\qpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qimage.h \
		c:\qt\5.7.1static\include\QtGui\qpixelformat.h \
		c:\qt\5.7.1static\include\QtGui\qtransform.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qpolygon.h \
		c:\qt\5.7.1static\include\QtGui\qpainterpath.h \
		c:\qt\5.7.1static\include\QtGui\qicon.h \
		c:\qt\5.7.1static\include\QtGui\qiconengine.h \
		c:\qt\5.7.1static\include\QtGui\qiconengineplugin.h \
		c:\qt\5.7.1static\include\QtGui\qimageiohandler.h \
		c:\qt\5.7.1static\include\QtGui\qimagereader.h \
		c:\qt\5.7.1static\include\QtGui\qimagewriter.h \
		c:\qt\5.7.1static\include\QtGui\qmovie.h \
		c:\qt\5.7.1static\include\QtGui\qpicture.h \
		c:\qt\5.7.1static\include\QtGui\qpictureformatplugin.h \
		c:\qt\5.7.1static\include\QtGui\qpixmapcache.h \
		c:\qt\5.7.1static\include\QtGui\qstandarditemmodel.h \
		c:\qt\5.7.1static\include\QtGui\qbrush.h \
		c:\qt\5.7.1static\include\QtGui\qfont.h \
		c:\qt\5.7.1static\include\QtGui\qclipboard.h \
		c:\qt\5.7.1static\include\QtGui\qcursor.h \
		c:\qt\5.7.1static\include\QtGui\qdrag.h \
		c:\qt\5.7.1static\include\QtGui\qgenericplugin.h \
		c:\qt\5.7.1static\include\QtGui\qgenericpluginfactory.h \
		c:\qt\5.7.1static\include\QtGui\qguiapplication.h \
		c:\qt\5.7.1static\include\QtGui\qinputmethod.h \
		c:\qt\5.7.1static\include\QtGui\qoffscreensurface.h \
		c:\qt\5.7.1static\include\QtGui\qsurface.h \
		c:\qt\5.7.1static\include\QtGui\qsurfaceformat.h \
		c:\qt\5.7.1static\include\QtGui\qopenglcontext.h \
		c:\qt\5.7.1static\include\QtGui\QSurfaceFormat \
		c:\qt\5.7.1static\include\QtGui\qopengl.h \
		c:\qt\5.7.1static\include\QtCore\qt_windows.h \
		c:\qt\5.7.1static\include\QtGui\qopengles2ext.h \
		c:\qt\5.7.1static\include\QtGui\qopenglext.h \
		c:\qt\5.7.1static\include\QtGui\qopenglversionfunctions.h \
		c:\qt\5.7.1static\include\QtGui\qopenglwindow.h \
		c:\qt\5.7.1static\include\QtGui\QPaintDeviceWindow \
		c:\qt\5.7.1static\include\QtGui\qpaintdevicewindow.h \
		c:\qt\5.7.1static\include\QtGui\QWindow \
		c:\qt\5.7.1static\include\QtGui\qwindow.h \
		c:\qt\5.7.1static\include\QtCore\QEvent \
		c:\qt\5.7.1static\include\QtCore\QMargins \
		c:\qt\5.7.1static\include\QtCore\QRect \
		c:\qt\5.7.1static\include\QtGui\QPaintDevice \
		c:\qt\5.7.1static\include\QtGui\QOpenGLContext \
		c:\qt\5.7.1static\include\QtGui\QImage \
		c:\qt\5.7.1static\include\QtGui\qpalette.h \
		c:\qt\5.7.1static\include\QtGui\qrasterwindow.h \
		c:\qt\5.7.1static\include\QtGui\qscreen.h \
		c:\qt\5.7.1static\include\QtCore\QList \
		c:\qt\5.7.1static\include\QtCore\QSize \
		c:\qt\5.7.1static\include\QtCore\QSizeF \
		c:\qt\5.7.1static\include\QtGui\QTransform \
		c:\qt\5.7.1static\include\QtGui\qsessionmanager.h \
		c:\qt\5.7.1static\include\QtGui\qstylehints.h \
		c:\qt\5.7.1static\include\QtGui\qgenericmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix4x4.h \
		c:\qt\5.7.1static\include\QtGui\qvector3d.h \
		c:\qt\5.7.1static\include\QtGui\qvector4d.h \
		c:\qt\5.7.1static\include\QtGui\qquaternion.h \
		c:\qt\5.7.1static\include\QtGui\qopenglbuffer.h \
		c:\qt\5.7.1static\include\QtGui\qopengldebug.h \
		c:\qt\5.7.1static\include\QtGui\qopenglextrafunctions.h \
		c:\qt\5.7.1static\include\QtGui\qopenglfunctions.h \
		c:\qt\5.7.1static\include\QtGui\qopenglframebufferobject.h \
		c:\qt\5.7.1static\include\QtGui\qopenglpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qopenglpixeltransferoptions.h \
		c:\qt\5.7.1static\include\QtCore\QSharedDataPointer \
		c:\qt\5.7.1static\include\QtGui\qopenglshaderprogram.h \
		c:\qt\5.7.1static\include\QtGui\qopengltexture.h \
		c:\qt\5.7.1static\include\QtGui\qopengltimerquery.h \
		c:\qt\5.7.1static\include\QtGui\qopenglvertexarrayobject.h \
		c:\qt\5.7.1static\include\QtGui\qbackingstore.h \
		c:\qt\5.7.1static\include\QtGui\qpagedpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qpagelayout.h \
		c:\qt\5.7.1static\include\QtGui\qpagesize.h \
		c:\qt\5.7.1static\include\QtGui\qpaintengine.h \
		c:\qt\5.7.1static\include\QtGui\qpainter.h \
		c:\qt\5.7.1static\include\QtGui\qtextoption.h \
		c:\qt\5.7.1static\include\QtGui\qpen.h \
		c:\qt\5.7.1static\include\QtGui\qfontinfo.h \
		c:\qt\5.7.1static\include\QtGui\qfontmetrics.h \
		c:\qt\5.7.1static\include\QtGui\qpdfwriter.h \
		c:\qt\5.7.1static\include\QtGui\qabstracttextdocumentlayout.h \
		c:\qt\5.7.1static\include\QtGui\qtextlayout.h \
		c:\qt\5.7.1static\include\QtGui\qtextformat.h \
		c:\qt\5.7.1static\include\QtGui\qglyphrun.h \
		c:\qt\5.7.1static\include\QtGui\qrawfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontdatabase.h \
		c:\qt\5.7.1static\include\QtGui\qtextcursor.h \
		c:\qt\5.7.1static\include\QtGui\qtextdocument.h \
		c:\qt\5.7.1static\include\QtGui\qstatictext.h \
		c:\qt\5.7.1static\include\QtGui\qsyntaxhighlighter.h \
		c:\qt\5.7.1static\include\QtGui\qtextobject.h \
		c:\qt\5.7.1static\include\QtGui\qtextdocumentfragment.h \
		c:\qt\5.7.1static\include\QtGui\qtextdocumentwriter.h \
		c:\qt\5.7.1static\include\QtGui\qtextlist.h \
		c:\qt\5.7.1static\include\QtGui\qtexttable.h \
		c:\qt\5.7.1static\include\QtGui\qdesktopservices.h \
		c:\qt\5.7.1static\include\QtGui\qvalidator.h \
		c:\qt\5.7.1static\include\QtGui\qtguiversion.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsItem \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsitem.h \
		c:\qt\5.7.1static\include\QtWidgets\QMainWindow \
		c:\qt\5.7.1static\include\QtWidgets\qmainwindow.h \
		c:\qt\5.7.1static\include\QtWidgets\qwidget.h \
		c:\qt\5.7.1static\include\QtWidgets\qsizepolicy.h \
		c:\qt\5.7.1static\include\QtWidgets\qtabwidget.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsScene \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsscene.h \
		ui_mainWindow.h \
		barcodeitem.h \
		..\backend_qt\qzint.h \
		c:\qt\5.7.1static\include\QtGui\QColor \
		c:\qt\5.7.1static\include\QtGui\QPainter \
		..\backend\zint.h \
		mainwindow.h \
		c:\qt\5.7.1static\bin\moc.exe
	c:\qt\5.7.1static\bin\moc.exe $(DEFINES) -D_MSC_VER=1900 -D_WIN32 -Ic:/qt/5.7.1static/mkspecs/win32-msvc2015 -IC:/test/git/zint-code/frontend_qt -IC:/test/git/zint-code/frontend_qt -IC:/test/git/zint-code/backend_qt -IC:/test/git/zint-code/backend -Ic:/qt/5.7.1static/include -Ic:/qt/5.7.1static/include/QtUiTools -Ic:/qt/5.7.1static/include/QtWidgets -Ic:/qt/5.7.1static/include/QtGui -Ic:/qt/5.7.1static/include/QtCore mainwindow.h -o debug\moc_mainwindow.cpp

debug\moc_sequencewindow.cpp: ui_extSequence.h \
		barcodeitem.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsItem \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsitem.h \
		c:\qt\5.7.1static\include\QtCore\qglobal.h \
		c:\qt\5.7.1static\include\QtCore\qconfig.h \
		c:\qt\5.7.1static\include\QtCore\qfeatures.h \
		c:\qt\5.7.1static\include\QtCore\qsystemdetection.h \
		c:\qt\5.7.1static\include\QtCore\qprocessordetection.h \
		c:\qt\5.7.1static\include\QtCore\qcompilerdetection.h \
		c:\qt\5.7.1static\include\QtCore\qtypeinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtypetraits.h \
		c:\qt\5.7.1static\include\QtCore\qisenum.h \
		c:\qt\5.7.1static\include\QtCore\qsysinfo.h \
		c:\qt\5.7.1static\include\QtCore\qlogging.h \
		c:\qt\5.7.1static\include\QtCore\qflags.h \
		c:\qt\5.7.1static\include\QtCore\qatomic.h \
		c:\qt\5.7.1static\include\QtCore\qbasicatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_bootstrap.h \
		c:\qt\5.7.1static\include\QtCore\qgenericatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_cxx11.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_msvc.h \
		c:\qt\5.7.1static\include\QtCore\qglobalstatic.h \
		c:\qt\5.7.1static\include\QtCore\qmutex.h \
		c:\qt\5.7.1static\include\QtCore\qnumeric.h \
		c:\qt\5.7.1static\include\QtCore\qversiontagging.h \
		c:\qt\5.7.1static\include\QtCore\qobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs.h \
		c:\qt\5.7.1static\include\QtCore\qnamespace.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs_impl.h \
		c:\qt\5.7.1static\include\QtCore\qstring.h \
		c:\qt\5.7.1static\include\QtCore\qchar.h \
		c:\qt\5.7.1static\include\QtCore\qbytearray.h \
		c:\qt\5.7.1static\include\QtCore\qrefcount.h \
		c:\qt\5.7.1static\include\QtCore\qarraydata.h \
		c:\qt\5.7.1static\include\QtCore\qstringbuilder.h \
		c:\qt\5.7.1static\include\QtCore\qlist.h \
		c:\qt\5.7.1static\include\QtCore\qalgorithms.h \
		c:\qt\5.7.1static\include\QtCore\qiterator.h \
		c:\qt\5.7.1static\include\QtCore\qhashfunctions.h \
		c:\qt\5.7.1static\include\QtCore\qpair.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraylist.h \
		c:\qt\5.7.1static\include\QtCore\qstringlist.h \
		c:\qt\5.7.1static\include\QtCore\qregexp.h \
		c:\qt\5.7.1static\include\QtCore\qstringmatcher.h \
		c:\qt\5.7.1static\include\QtCore\qcoreevent.h \
		c:\qt\5.7.1static\include\QtCore\qscopedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qmetatype.h \
		c:\qt\5.7.1static\include\QtCore\qvarlengtharray.h \
		c:\qt\5.7.1static\include\QtCore\qcontainerfwd.h \
		c:\qt\5.7.1static\include\QtCore\qobject_impl.h \
		c:\qt\5.7.1static\include\QtCore\qvariant.h \
		c:\qt\5.7.1static\include\QtCore\qmap.h \
		c:\qt\5.7.1static\include\QtCore\qdebug.h \
		c:\qt\5.7.1static\include\QtCore\qhash.h \
		c:\qt\5.7.1static\include\QtCore\qtextstream.h \
		c:\qt\5.7.1static\include\QtCore\qiodevice.h \
		c:\qt\5.7.1static\include\QtCore\qlocale.h \
		c:\qt\5.7.1static\include\QtCore\qshareddata.h \
		c:\qt\5.7.1static\include\QtCore\qvector.h \
		c:\qt\5.7.1static\include\QtCore\qpoint.h \
		c:\qt\5.7.1static\include\QtCore\qset.h \
		c:\qt\5.7.1static\include\QtCore\qcontiguouscache.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer_impl.h \
		c:\qt\5.7.1static\include\QtCore\qrect.h \
		c:\qt\5.7.1static\include\QtCore\qmargins.h \
		c:\qt\5.7.1static\include\QtCore\qsize.h \
		c:\qt\5.7.1static\include\QtGui\qpainterpath.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qpolygon.h \
		c:\qt\5.7.1static\include\QtGui\qregion.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs_win.h \
		c:\qt\5.7.1static\include\QtCore\qdatastream.h \
		c:\qt\5.7.1static\include\QtCore\qline.h \
		c:\qt\5.7.1static\include\QtGui\qpixmap.h \
		c:\qt\5.7.1static\include\QtGui\qpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qcolor.h \
		c:\qt\5.7.1static\include\QtGui\qrgb.h \
		c:\qt\5.7.1static\include\QtGui\qrgba64.h \
		c:\qt\5.7.1static\include\QtGui\qimage.h \
		c:\qt\5.7.1static\include\QtGui\qpixelformat.h \
		c:\qt\5.7.1static\include\QtGui\qtransform.h \
		..\backend_qt\qzint.h \
		c:\qt\5.7.1static\include\QtGui\QColor \
		c:\qt\5.7.1static\include\QtGui\QPainter \
		c:\qt\5.7.1static\include\QtGui\qpainter.h \
		c:\qt\5.7.1static\include\QtGui\qtextoption.h \
		c:\qt\5.7.1static\include\QtGui\qpen.h \
		c:\qt\5.7.1static\include\QtGui\qbrush.h \
		c:\qt\5.7.1static\include\QtGui\qfontinfo.h \
		c:\qt\5.7.1static\include\QtGui\qfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontmetrics.h \
		..\backend\zint.h \
		sequencewindow.h \
		c:\qt\5.7.1static\bin\moc.exe
	c:\qt\5.7.1static\bin\moc.exe $(DEFINES) -D_MSC_VER=1900 -D_WIN32 -Ic:/qt/5.7.1static/mkspecs/win32-msvc2015 -IC:/test/git/zint-code/frontend_qt -IC:/test/git/zint-code/frontend_qt -IC:/test/git/zint-code/backend_qt -IC:/test/git/zint-code/backend -Ic:/qt/5.7.1static/include -Ic:/qt/5.7.1static/include/QtUiTools -Ic:/qt/5.7.1static/include/QtWidgets -Ic:/qt/5.7.1static/include/QtGui -Ic:/qt/5.7.1static/include/QtCore sequencewindow.h -o debug\moc_sequencewindow.cpp

compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all: ui_extData.h ui_extExport.h ui_extSequence.h ui_grpAztec.h ui_grpC128.h ui_grpC16k.h ui_grpC39.h ui_grpC49.h ui_grpChannel.h ui_grpCodeOne.h ui_grpCodablockF.h ui_grpDBExtend.h ui_grpDM.h ui_grpGrid.h ui_grpMaxicode.h ui_grpMicroPDF.h ui_grpMQR.h ui_grpMSICheck.h ui_grpPDF417.h ui_grpQR.h ui_grpHX.h ui_mainWindow.h ui_grpDotCode.h
compiler_uic_clean:
	-$(DEL_FILE) ui_extData.h ui_extExport.h ui_extSequence.h ui_grpAztec.h ui_grpC128.h ui_grpC16k.h ui_grpC39.h ui_grpC49.h ui_grpChannel.h ui_grpCodeOne.h ui_grpCodablockF.h ui_grpDBExtend.h ui_grpDM.h ui_grpGrid.h ui_grpMaxicode.h ui_grpMicroPDF.h ui_grpMQR.h ui_grpMSICheck.h ui_grpPDF417.h ui_grpQR.h ui_grpHX.h ui_mainWindow.h ui_grpDotCode.h
ui_extData.h: extData.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe extData.ui -o ui_extData.h

ui_extExport.h: extExport.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe extExport.ui -o ui_extExport.h

ui_extSequence.h: extSequence.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe extSequence.ui -o ui_extSequence.h

ui_grpAztec.h: grpAztec.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpAztec.ui -o ui_grpAztec.h

ui_grpC128.h: grpC128.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpC128.ui -o ui_grpC128.h

ui_grpC16k.h: grpC16k.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpC16k.ui -o ui_grpC16k.h

ui_grpC39.h: grpC39.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpC39.ui -o ui_grpC39.h

ui_grpC49.h: grpC49.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpC49.ui -o ui_grpC49.h

ui_grpChannel.h: grpChannel.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpChannel.ui -o ui_grpChannel.h

ui_grpCodeOne.h: grpCodeOne.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpCodeOne.ui -o ui_grpCodeOne.h

ui_grpCodablockF.h: grpCodablockF.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpCodablockF.ui -o ui_grpCodablockF.h

ui_grpDBExtend.h: grpDBExtend.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpDBExtend.ui -o ui_grpDBExtend.h

ui_grpDM.h: grpDM.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpDM.ui -o ui_grpDM.h

ui_grpGrid.h: grpGrid.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpGrid.ui -o ui_grpGrid.h

ui_grpMaxicode.h: grpMaxicode.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpMaxicode.ui -o ui_grpMaxicode.h

ui_grpMicroPDF.h: grpMicroPDF.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpMicroPDF.ui -o ui_grpMicroPDF.h

ui_grpMQR.h: grpMQR.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpMQR.ui -o ui_grpMQR.h

ui_grpMSICheck.h: grpMSICheck.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpMSICheck.ui -o ui_grpMSICheck.h

ui_grpPDF417.h: grpPDF417.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpPDF417.ui -o ui_grpPDF417.h

ui_grpQR.h: grpQR.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpQR.ui -o ui_grpQR.h

ui_grpHX.h: grpHX.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpHX.ui -o ui_grpHX.h

ui_mainWindow.h: mainWindow.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe mainWindow.ui -o ui_mainWindow.h

ui_grpDotCode.h: grpDotCode.ui \
		c:\qt\5.7.1static\bin\uic.exe
	c:\qt\5.7.1static\bin\uic.exe grpDotCode.ui -o ui_grpDotCode.h

compiler_no_pch_compiler_make_all:
compiler_no_pch_compiler_clean:
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean: compiler_rcc_clean compiler_moc_header_clean compiler_uic_clean 



####### Compile

debug\barcodeitem.obj: barcodeitem.cpp c:\qt\5.7.1static\include\QtCore\QDebug \
		c:\qt\5.7.1static\include\QtCore\qdebug.h \
		c:\qt\5.7.1static\include\QtCore\qalgorithms.h \
		c:\qt\5.7.1static\include\QtCore\qglobal.h \
		c:\qt\5.7.1static\include\QtCore\qconfig.h \
		c:\qt\5.7.1static\include\QtCore\qfeatures.h \
		c:\qt\5.7.1static\include\QtCore\qsystemdetection.h \
		c:\qt\5.7.1static\include\QtCore\qprocessordetection.h \
		c:\qt\5.7.1static\include\QtCore\qcompilerdetection.h \
		c:\qt\5.7.1static\include\QtCore\qtypeinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtypetraits.h \
		c:\qt\5.7.1static\include\QtCore\qisenum.h \
		c:\qt\5.7.1static\include\QtCore\qsysinfo.h \
		c:\qt\5.7.1static\include\QtCore\qlogging.h \
		c:\qt\5.7.1static\include\QtCore\qflags.h \
		c:\qt\5.7.1static\include\QtCore\qatomic.h \
		c:\qt\5.7.1static\include\QtCore\qbasicatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_bootstrap.h \
		c:\qt\5.7.1static\include\QtCore\qgenericatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_cxx11.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_msvc.h \
		c:\qt\5.7.1static\include\QtCore\qglobalstatic.h \
		c:\qt\5.7.1static\include\QtCore\qmutex.h \
		c:\qt\5.7.1static\include\QtCore\qnumeric.h \
		c:\qt\5.7.1static\include\QtCore\qversiontagging.h \
		c:\qt\5.7.1static\include\QtCore\qhash.h \
		c:\qt\5.7.1static\include\QtCore\qchar.h \
		c:\qt\5.7.1static\include\QtCore\qiterator.h \
		c:\qt\5.7.1static\include\QtCore\qlist.h \
		c:\qt\5.7.1static\include\QtCore\qrefcount.h \
		c:\qt\5.7.1static\include\QtCore\qarraydata.h \
		c:\qt\5.7.1static\include\QtCore\qhashfunctions.h \
		c:\qt\5.7.1static\include\QtCore\qpair.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraylist.h \
		c:\qt\5.7.1static\include\QtCore\qbytearray.h \
		c:\qt\5.7.1static\include\QtCore\qnamespace.h \
		c:\qt\5.7.1static\include\QtCore\qstring.h \
		c:\qt\5.7.1static\include\QtCore\qstringbuilder.h \
		c:\qt\5.7.1static\include\QtCore\qstringlist.h \
		c:\qt\5.7.1static\include\QtCore\qregexp.h \
		c:\qt\5.7.1static\include\QtCore\qstringmatcher.h \
		c:\qt\5.7.1static\include\QtCore\qmap.h \
		c:\qt\5.7.1static\include\QtCore\qtextstream.h \
		c:\qt\5.7.1static\include\QtCore\qiodevice.h \
		c:\qt\5.7.1static\include\QtCore\qobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs_impl.h \
		c:\qt\5.7.1static\include\QtCore\qcoreevent.h \
		c:\qt\5.7.1static\include\QtCore\qscopedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qmetatype.h \
		c:\qt\5.7.1static\include\QtCore\qvarlengtharray.h \
		c:\qt\5.7.1static\include\QtCore\qcontainerfwd.h \
		c:\qt\5.7.1static\include\QtCore\qobject_impl.h \
		c:\qt\5.7.1static\include\QtCore\qlocale.h \
		c:\qt\5.7.1static\include\QtCore\qvariant.h \
		c:\qt\5.7.1static\include\QtCore\qshareddata.h \
		c:\qt\5.7.1static\include\QtCore\qvector.h \
		c:\qt\5.7.1static\include\QtCore\qpoint.h \
		c:\qt\5.7.1static\include\QtCore\qset.h \
		c:\qt\5.7.1static\include\QtCore\qcontiguouscache.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer_impl.h \
		barcodeitem.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsItem \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsitem.h \
		c:\qt\5.7.1static\include\QtCore\qrect.h \
		c:\qt\5.7.1static\include\QtCore\qmargins.h \
		c:\qt\5.7.1static\include\QtCore\qsize.h \
		c:\qt\5.7.1static\include\QtGui\qpainterpath.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qpolygon.h \
		c:\qt\5.7.1static\include\QtGui\qregion.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs_win.h \
		c:\qt\5.7.1static\include\QtCore\qdatastream.h \
		c:\qt\5.7.1static\include\QtCore\qline.h \
		c:\qt\5.7.1static\include\QtGui\qpixmap.h \
		c:\qt\5.7.1static\include\QtGui\qpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qcolor.h \
		c:\qt\5.7.1static\include\QtGui\qrgb.h \
		c:\qt\5.7.1static\include\QtGui\qrgba64.h \
		c:\qt\5.7.1static\include\QtGui\qimage.h \
		c:\qt\5.7.1static\include\QtGui\qpixelformat.h \
		c:\qt\5.7.1static\include\QtGui\qtransform.h \
		..\backend_qt\qzint.h \
		c:\qt\5.7.1static\include\QtGui\QColor \
		c:\qt\5.7.1static\include\QtGui\QPainter \
		c:\qt\5.7.1static\include\QtGui\qpainter.h \
		c:\qt\5.7.1static\include\QtGui\qtextoption.h \
		c:\qt\5.7.1static\include\QtGui\qpen.h \
		c:\qt\5.7.1static\include\QtGui\qbrush.h \
		c:\qt\5.7.1static\include\QtGui\qfontinfo.h \
		c:\qt\5.7.1static\include\QtGui\qfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontmetrics.h \
		..\backend\zint.h

debug\datawindow.obj: datawindow.cpp c:\qt\5.7.1static\include\QtCore\QDebug \
		c:\qt\5.7.1static\include\QtCore\qdebug.h \
		c:\qt\5.7.1static\include\QtCore\qalgorithms.h \
		c:\qt\5.7.1static\include\QtCore\qglobal.h \
		c:\qt\5.7.1static\include\QtCore\qconfig.h \
		c:\qt\5.7.1static\include\QtCore\qfeatures.h \
		c:\qt\5.7.1static\include\QtCore\qsystemdetection.h \
		c:\qt\5.7.1static\include\QtCore\qprocessordetection.h \
		c:\qt\5.7.1static\include\QtCore\qcompilerdetection.h \
		c:\qt\5.7.1static\include\QtCore\qtypeinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtypetraits.h \
		c:\qt\5.7.1static\include\QtCore\qisenum.h \
		c:\qt\5.7.1static\include\QtCore\qsysinfo.h \
		c:\qt\5.7.1static\include\QtCore\qlogging.h \
		c:\qt\5.7.1static\include\QtCore\qflags.h \
		c:\qt\5.7.1static\include\QtCore\qatomic.h \
		c:\qt\5.7.1static\include\QtCore\qbasicatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_bootstrap.h \
		c:\qt\5.7.1static\include\QtCore\qgenericatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_cxx11.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_msvc.h \
		c:\qt\5.7.1static\include\QtCore\qglobalstatic.h \
		c:\qt\5.7.1static\include\QtCore\qmutex.h \
		c:\qt\5.7.1static\include\QtCore\qnumeric.h \
		c:\qt\5.7.1static\include\QtCore\qversiontagging.h \
		c:\qt\5.7.1static\include\QtCore\qhash.h \
		c:\qt\5.7.1static\include\QtCore\qchar.h \
		c:\qt\5.7.1static\include\QtCore\qiterator.h \
		c:\qt\5.7.1static\include\QtCore\qlist.h \
		c:\qt\5.7.1static\include\QtCore\qrefcount.h \
		c:\qt\5.7.1static\include\QtCore\qarraydata.h \
		c:\qt\5.7.1static\include\QtCore\qhashfunctions.h \
		c:\qt\5.7.1static\include\QtCore\qpair.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraylist.h \
		c:\qt\5.7.1static\include\QtCore\qbytearray.h \
		c:\qt\5.7.1static\include\QtCore\qnamespace.h \
		c:\qt\5.7.1static\include\QtCore\qstring.h \
		c:\qt\5.7.1static\include\QtCore\qstringbuilder.h \
		c:\qt\5.7.1static\include\QtCore\qstringlist.h \
		c:\qt\5.7.1static\include\QtCore\qregexp.h \
		c:\qt\5.7.1static\include\QtCore\qstringmatcher.h \
		c:\qt\5.7.1static\include\QtCore\qmap.h \
		c:\qt\5.7.1static\include\QtCore\qtextstream.h \
		c:\qt\5.7.1static\include\QtCore\qiodevice.h \
		c:\qt\5.7.1static\include\QtCore\qobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs_impl.h \
		c:\qt\5.7.1static\include\QtCore\qcoreevent.h \
		c:\qt\5.7.1static\include\QtCore\qscopedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qmetatype.h \
		c:\qt\5.7.1static\include\QtCore\qvarlengtharray.h \
		c:\qt\5.7.1static\include\QtCore\qcontainerfwd.h \
		c:\qt\5.7.1static\include\QtCore\qobject_impl.h \
		c:\qt\5.7.1static\include\QtCore\qlocale.h \
		c:\qt\5.7.1static\include\QtCore\qvariant.h \
		c:\qt\5.7.1static\include\QtCore\qshareddata.h \
		c:\qt\5.7.1static\include\QtCore\qvector.h \
		c:\qt\5.7.1static\include\QtCore\qpoint.h \
		c:\qt\5.7.1static\include\QtCore\qset.h \
		c:\qt\5.7.1static\include\QtCore\qcontiguouscache.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer_impl.h \
		c:\qt\5.7.1static\include\QtWidgets\QFileDialog \
		c:\qt\5.7.1static\include\QtWidgets\qfiledialog.h \
		c:\qt\5.7.1static\include\QtCore\qdir.h \
		c:\qt\5.7.1static\include\QtCore\qfileinfo.h \
		c:\qt\5.7.1static\include\QtCore\qfile.h \
		c:\qt\5.7.1static\include\QtCore\qfiledevice.h \
		c:\qt\5.7.1static\include\QtCore\qurl.h \
		c:\qt\5.7.1static\include\QtCore\qurlquery.h \
		c:\qt\5.7.1static\include\QtWidgets\qdialog.h \
		c:\qt\5.7.1static\include\QtWidgets\qwidget.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs_win.h \
		c:\qt\5.7.1static\include\QtCore\qmargins.h \
		c:\qt\5.7.1static\include\QtGui\qpaintdevice.h \
		c:\qt\5.7.1static\include\QtCore\qrect.h \
		c:\qt\5.7.1static\include\QtCore\qsize.h \
		c:\qt\5.7.1static\include\QtGui\qpalette.h \
		c:\qt\5.7.1static\include\QtGui\qcolor.h \
		c:\qt\5.7.1static\include\QtGui\qrgb.h \
		c:\qt\5.7.1static\include\QtGui\qrgba64.h \
		c:\qt\5.7.1static\include\QtGui\qbrush.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qpolygon.h \
		c:\qt\5.7.1static\include\QtGui\qregion.h \
		c:\qt\5.7.1static\include\QtCore\qdatastream.h \
		c:\qt\5.7.1static\include\QtCore\qline.h \
		c:\qt\5.7.1static\include\QtGui\qtransform.h \
		c:\qt\5.7.1static\include\QtGui\qpainterpath.h \
		c:\qt\5.7.1static\include\QtGui\qimage.h \
		c:\qt\5.7.1static\include\QtGui\qpixelformat.h \
		c:\qt\5.7.1static\include\QtGui\qpixmap.h \
		c:\qt\5.7.1static\include\QtGui\qfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontmetrics.h \
		c:\qt\5.7.1static\include\QtGui\qfontinfo.h \
		c:\qt\5.7.1static\include\QtWidgets\qsizepolicy.h \
		c:\qt\5.7.1static\include\QtGui\qcursor.h \
		c:\qt\5.7.1static\include\QtGui\qkeysequence.h \
		c:\qt\5.7.1static\include\QtGui\qevent.h \
		c:\qt\5.7.1static\include\QtGui\qvector2d.h \
		c:\qt\5.7.1static\include\QtGui\qtouchdevice.h \
		c:\qt\5.7.1static\include\QtUiTools\QUiLoader \
		c:\qt\5.7.1static\include\QtUiTools\quiloader.h \
		c:\qt\5.7.1static\include\QtCore\QObject \
		c:\qt\5.7.1static\include\QtCore\QScopedPointer \
		c:\qt\5.7.1static\include\QtCore\QStringList \
		c:\qt\5.7.1static\include\QtWidgets\QMessageBox \
		c:\qt\5.7.1static\include\QtWidgets\qmessagebox.h \
		datawindow.h \
		ui_extData.h

debug\exportwindow.obj: exportwindow.cpp c:\qt\5.7.1static\include\QtCore\QDebug \
		c:\qt\5.7.1static\include\QtCore\qdebug.h \
		c:\qt\5.7.1static\include\QtCore\qalgorithms.h \
		c:\qt\5.7.1static\include\QtCore\qglobal.h \
		c:\qt\5.7.1static\include\QtCore\qconfig.h \
		c:\qt\5.7.1static\include\QtCore\qfeatures.h \
		c:\qt\5.7.1static\include\QtCore\qsystemdetection.h \
		c:\qt\5.7.1static\include\QtCore\qprocessordetection.h \
		c:\qt\5.7.1static\include\QtCore\qcompilerdetection.h \
		c:\qt\5.7.1static\include\QtCore\qtypeinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtypetraits.h \
		c:\qt\5.7.1static\include\QtCore\qisenum.h \
		c:\qt\5.7.1static\include\QtCore\qsysinfo.h \
		c:\qt\5.7.1static\include\QtCore\qlogging.h \
		c:\qt\5.7.1static\include\QtCore\qflags.h \
		c:\qt\5.7.1static\include\QtCore\qatomic.h \
		c:\qt\5.7.1static\include\QtCore\qbasicatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_bootstrap.h \
		c:\qt\5.7.1static\include\QtCore\qgenericatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_cxx11.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_msvc.h \
		c:\qt\5.7.1static\include\QtCore\qglobalstatic.h \
		c:\qt\5.7.1static\include\QtCore\qmutex.h \
		c:\qt\5.7.1static\include\QtCore\qnumeric.h \
		c:\qt\5.7.1static\include\QtCore\qversiontagging.h \
		c:\qt\5.7.1static\include\QtCore\qhash.h \
		c:\qt\5.7.1static\include\QtCore\qchar.h \
		c:\qt\5.7.1static\include\QtCore\qiterator.h \
		c:\qt\5.7.1static\include\QtCore\qlist.h \
		c:\qt\5.7.1static\include\QtCore\qrefcount.h \
		c:\qt\5.7.1static\include\QtCore\qarraydata.h \
		c:\qt\5.7.1static\include\QtCore\qhashfunctions.h \
		c:\qt\5.7.1static\include\QtCore\qpair.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraylist.h \
		c:\qt\5.7.1static\include\QtCore\qbytearray.h \
		c:\qt\5.7.1static\include\QtCore\qnamespace.h \
		c:\qt\5.7.1static\include\QtCore\qstring.h \
		c:\qt\5.7.1static\include\QtCore\qstringbuilder.h \
		c:\qt\5.7.1static\include\QtCore\qstringlist.h \
		c:\qt\5.7.1static\include\QtCore\qregexp.h \
		c:\qt\5.7.1static\include\QtCore\qstringmatcher.h \
		c:\qt\5.7.1static\include\QtCore\qmap.h \
		c:\qt\5.7.1static\include\QtCore\qtextstream.h \
		c:\qt\5.7.1static\include\QtCore\qiodevice.h \
		c:\qt\5.7.1static\include\QtCore\qobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs_impl.h \
		c:\qt\5.7.1static\include\QtCore\qcoreevent.h \
		c:\qt\5.7.1static\include\QtCore\qscopedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qmetatype.h \
		c:\qt\5.7.1static\include\QtCore\qvarlengtharray.h \
		c:\qt\5.7.1static\include\QtCore\qcontainerfwd.h \
		c:\qt\5.7.1static\include\QtCore\qobject_impl.h \
		c:\qt\5.7.1static\include\QtCore\qlocale.h \
		c:\qt\5.7.1static\include\QtCore\qvariant.h \
		c:\qt\5.7.1static\include\QtCore\qshareddata.h \
		c:\qt\5.7.1static\include\QtCore\qvector.h \
		c:\qt\5.7.1static\include\QtCore\qpoint.h \
		c:\qt\5.7.1static\include\QtCore\qset.h \
		c:\qt\5.7.1static\include\QtCore\qcontiguouscache.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer_impl.h \
		c:\qt\5.7.1static\include\QtUiTools\QUiLoader \
		c:\qt\5.7.1static\include\QtUiTools\quiloader.h \
		c:\qt\5.7.1static\include\QtCore\QObject \
		c:\qt\5.7.1static\include\QtCore\QScopedPointer \
		c:\qt\5.7.1static\include\QtWidgets\QFileDialog \
		c:\qt\5.7.1static\include\QtWidgets\qfiledialog.h \
		c:\qt\5.7.1static\include\QtCore\qdir.h \
		c:\qt\5.7.1static\include\QtCore\qfileinfo.h \
		c:\qt\5.7.1static\include\QtCore\qfile.h \
		c:\qt\5.7.1static\include\QtCore\qfiledevice.h \
		c:\qt\5.7.1static\include\QtCore\qurl.h \
		c:\qt\5.7.1static\include\QtCore\qurlquery.h \
		c:\qt\5.7.1static\include\QtWidgets\qdialog.h \
		c:\qt\5.7.1static\include\QtWidgets\qwidget.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs_win.h \
		c:\qt\5.7.1static\include\QtCore\qmargins.h \
		c:\qt\5.7.1static\include\QtGui\qpaintdevice.h \
		c:\qt\5.7.1static\include\QtCore\qrect.h \
		c:\qt\5.7.1static\include\QtCore\qsize.h \
		c:\qt\5.7.1static\include\QtGui\qpalette.h \
		c:\qt\5.7.1static\include\QtGui\qcolor.h \
		c:\qt\5.7.1static\include\QtGui\qrgb.h \
		c:\qt\5.7.1static\include\QtGui\qrgba64.h \
		c:\qt\5.7.1static\include\QtGui\qbrush.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qpolygon.h \
		c:\qt\5.7.1static\include\QtGui\qregion.h \
		c:\qt\5.7.1static\include\QtCore\qdatastream.h \
		c:\qt\5.7.1static\include\QtCore\qline.h \
		c:\qt\5.7.1static\include\QtGui\qtransform.h \
		c:\qt\5.7.1static\include\QtGui\qpainterpath.h \
		c:\qt\5.7.1static\include\QtGui\qimage.h \
		c:\qt\5.7.1static\include\QtGui\qpixelformat.h \
		c:\qt\5.7.1static\include\QtGui\qpixmap.h \
		c:\qt\5.7.1static\include\QtGui\qfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontmetrics.h \
		c:\qt\5.7.1static\include\QtGui\qfontinfo.h \
		c:\qt\5.7.1static\include\QtWidgets\qsizepolicy.h \
		c:\qt\5.7.1static\include\QtGui\qcursor.h \
		c:\qt\5.7.1static\include\QtGui\qkeysequence.h \
		c:\qt\5.7.1static\include\QtGui\qevent.h \
		c:\qt\5.7.1static\include\QtGui\qvector2d.h \
		c:\qt\5.7.1static\include\QtGui\qtouchdevice.h \
		c:\qt\5.7.1static\include\QtWidgets\QMessageBox \
		c:\qt\5.7.1static\include\QtWidgets\qmessagebox.h \
		c:\qt\5.7.1static\include\QtCore\QSettings \
		c:\qt\5.7.1static\include\QtCore\qsettings.h \
		exportwindow.h \
		ui_extExport.h \
		barcodeitem.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsItem \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsitem.h \
		..\backend_qt\qzint.h \
		c:\qt\5.7.1static\include\QtGui\QColor \
		c:\qt\5.7.1static\include\QtGui\QPainter \
		c:\qt\5.7.1static\include\QtGui\qpainter.h \
		c:\qt\5.7.1static\include\QtGui\qtextoption.h \
		c:\qt\5.7.1static\include\QtGui\qpen.h \
		..\backend\zint.h

debug\main.obj: main.cpp c:\qt\5.7.1static\include\QtWidgets\QApplication \
		c:\qt\5.7.1static\include\QtWidgets\qapplication.h \
		c:\qt\5.7.1static\include\QtCore\qcoreapplication.h \
		c:\qt\5.7.1static\include\QtCore\qglobal.h \
		c:\qt\5.7.1static\include\QtCore\qconfig.h \
		c:\qt\5.7.1static\include\QtCore\qfeatures.h \
		c:\qt\5.7.1static\include\QtCore\qsystemdetection.h \
		c:\qt\5.7.1static\include\QtCore\qprocessordetection.h \
		c:\qt\5.7.1static\include\QtCore\qcompilerdetection.h \
		c:\qt\5.7.1static\include\QtCore\qtypeinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtypetraits.h \
		c:\qt\5.7.1static\include\QtCore\qisenum.h \
		c:\qt\5.7.1static\include\QtCore\qsysinfo.h \
		c:\qt\5.7.1static\include\QtCore\qlogging.h \
		c:\qt\5.7.1static\include\QtCore\qflags.h \
		c:\qt\5.7.1static\include\QtCore\qatomic.h \
		c:\qt\5.7.1static\include\QtCore\qbasicatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_bootstrap.h \
		c:\qt\5.7.1static\include\QtCore\qgenericatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_cxx11.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_msvc.h \
		c:\qt\5.7.1static\include\QtCore\qglobalstatic.h \
		c:\qt\5.7.1static\include\QtCore\qmutex.h \
		c:\qt\5.7.1static\include\QtCore\qnumeric.h \
		c:\qt\5.7.1static\include\QtCore\qversiontagging.h \
		c:\qt\5.7.1static\include\QtCore\qstring.h \
		c:\qt\5.7.1static\include\QtCore\qchar.h \
		c:\qt\5.7.1static\include\QtCore\qbytearray.h \
		c:\qt\5.7.1static\include\QtCore\qrefcount.h \
		c:\qt\5.7.1static\include\QtCore\qnamespace.h \
		c:\qt\5.7.1static\include\QtCore\qarraydata.h \
		c:\qt\5.7.1static\include\QtCore\qstringbuilder.h \
		c:\qt\5.7.1static\include\QtCore\qobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs_impl.h \
		c:\qt\5.7.1static\include\QtCore\qlist.h \
		c:\qt\5.7.1static\include\QtCore\qalgorithms.h \
		c:\qt\5.7.1static\include\QtCore\qiterator.h \
		c:\qt\5.7.1static\include\QtCore\qhashfunctions.h \
		c:\qt\5.7.1static\include\QtCore\qpair.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraylist.h \
		c:\qt\5.7.1static\include\QtCore\qstringlist.h \
		c:\qt\5.7.1static\include\QtCore\qregexp.h \
		c:\qt\5.7.1static\include\QtCore\qstringmatcher.h \
		c:\qt\5.7.1static\include\QtCore\qcoreevent.h \
		c:\qt\5.7.1static\include\QtCore\qscopedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qmetatype.h \
		c:\qt\5.7.1static\include\QtCore\qvarlengtharray.h \
		c:\qt\5.7.1static\include\QtCore\qcontainerfwd.h \
		c:\qt\5.7.1static\include\QtCore\qobject_impl.h \
		c:\qt\5.7.1static\include\QtCore\qeventloop.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs_win.h \
		c:\qt\5.7.1static\include\QtCore\qpoint.h \
		c:\qt\5.7.1static\include\QtCore\qsize.h \
		c:\qt\5.7.1static\include\QtGui\qcursor.h \
		c:\qt\5.7.1static\include\QtWidgets\qdesktopwidget.h \
		c:\qt\5.7.1static\include\QtWidgets\qwidget.h \
		c:\qt\5.7.1static\include\QtCore\qmargins.h \
		c:\qt\5.7.1static\include\QtGui\qpaintdevice.h \
		c:\qt\5.7.1static\include\QtCore\qrect.h \
		c:\qt\5.7.1static\include\QtGui\qpalette.h \
		c:\qt\5.7.1static\include\QtGui\qcolor.h \
		c:\qt\5.7.1static\include\QtGui\qrgb.h \
		c:\qt\5.7.1static\include\QtGui\qrgba64.h \
		c:\qt\5.7.1static\include\QtGui\qbrush.h \
		c:\qt\5.7.1static\include\QtCore\qvector.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qpolygon.h \
		c:\qt\5.7.1static\include\QtGui\qregion.h \
		c:\qt\5.7.1static\include\QtCore\qdatastream.h \
		c:\qt\5.7.1static\include\QtCore\qiodevice.h \
		c:\qt\5.7.1static\include\QtCore\qline.h \
		c:\qt\5.7.1static\include\QtGui\qtransform.h \
		c:\qt\5.7.1static\include\QtGui\qpainterpath.h \
		c:\qt\5.7.1static\include\QtGui\qimage.h \
		c:\qt\5.7.1static\include\QtGui\qpixelformat.h \
		c:\qt\5.7.1static\include\QtGui\qpixmap.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qshareddata.h \
		c:\qt\5.7.1static\include\QtCore\qhash.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer_impl.h \
		c:\qt\5.7.1static\include\QtGui\qfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontmetrics.h \
		c:\qt\5.7.1static\include\QtGui\qfontinfo.h \
		c:\qt\5.7.1static\include\QtWidgets\qsizepolicy.h \
		c:\qt\5.7.1static\include\QtGui\qkeysequence.h \
		c:\qt\5.7.1static\include\QtGui\qevent.h \
		c:\qt\5.7.1static\include\QtCore\qvariant.h \
		c:\qt\5.7.1static\include\QtCore\qmap.h \
		c:\qt\5.7.1static\include\QtCore\qdebug.h \
		c:\qt\5.7.1static\include\QtCore\qtextstream.h \
		c:\qt\5.7.1static\include\QtCore\qlocale.h \
		c:\qt\5.7.1static\include\QtCore\qset.h \
		c:\qt\5.7.1static\include\QtCore\qcontiguouscache.h \
		c:\qt\5.7.1static\include\QtCore\qurl.h \
		c:\qt\5.7.1static\include\QtCore\qurlquery.h \
		c:\qt\5.7.1static\include\QtCore\qfile.h \
		c:\qt\5.7.1static\include\QtCore\qfiledevice.h \
		c:\qt\5.7.1static\include\QtGui\qvector2d.h \
		c:\qt\5.7.1static\include\QtGui\qtouchdevice.h \
		c:\qt\5.7.1static\include\QtGui\qguiapplication.h \
		c:\qt\5.7.1static\include\QtGui\qinputmethod.h \
		mainwindow.h \
		c:\qt\5.7.1static\include\QtGui\QtGui \
		c:\qt\5.7.1static\include\QtGui\QtGuiDepends \
		c:\qt\5.7.1static\include\QtCore\QtCore \
		c:\qt\5.7.1static\include\QtCore\QtCoreDepends \
		c:\qt\5.7.1static\include\QtCore\qabstractanimation.h \
		c:\qt\5.7.1static\include\QtCore\qanimationgroup.h \
		c:\qt\5.7.1static\include\QtCore\qparallelanimationgroup.h \
		c:\qt\5.7.1static\include\QtCore\qpauseanimation.h \
		c:\qt\5.7.1static\include\QtCore\qpropertyanimation.h \
		c:\qt\5.7.1static\include\QtCore\qvariantanimation.h \
		c:\qt\5.7.1static\include\QtCore\qeasingcurve.h \
		c:\qt\5.7.1static\include\QtCore\qsequentialanimationgroup.h \
		c:\qt\5.7.1static\include\QtCore\qtextcodec.h \
		c:\qt\5.7.1static\include\QtCore\qendian.h \
		c:\qt\5.7.1static\include\QtCore\qlibraryinfo.h \
		c:\qt\5.7.1static\include\QtCore\qdatetime.h \
		c:\qt\5.7.1static\include\QtCore\qbuffer.h \
		c:\qt\5.7.1static\include\QtCore\qdir.h \
		c:\qt\5.7.1static\include\QtCore\qfileinfo.h \
		c:\qt\5.7.1static\include\QtCore\qdiriterator.h \
		c:\qt\5.7.1static\include\QtCore\qfileselector.h \
		c:\qt\5.7.1static\include\QtCore\QObject \
		c:\qt\5.7.1static\include\QtCore\QStringList \
		c:\qt\5.7.1static\include\QtCore\qfilesystemwatcher.h \
		c:\qt\5.7.1static\include\QtCore\qlockfile.h \
		c:\qt\5.7.1static\include\QtCore\qloggingcategory.h \
		c:\qt\5.7.1static\include\QtCore\qprocess.h \
		c:\qt\5.7.1static\include\QtCore\qresource.h \
		c:\qt\5.7.1static\include\QtCore\qsavefile.h \
		c:\qt\5.7.1static\include\QtCore\qsettings.h \
		c:\qt\5.7.1static\include\QtCore\qstandardpaths.h \
		c:\qt\5.7.1static\include\QtCore\qstorageinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtemporarydir.h \
		c:\qt\5.7.1static\include\QtCore\QScopedPointer \
		c:\qt\5.7.1static\include\QtCore\qtemporaryfile.h \
		c:\qt\5.7.1static\include\QtCore\qabstractitemmodel.h \
		c:\qt\5.7.1static\include\QtCore\qabstractproxymodel.h \
		c:\qt\5.7.1static\include\QtCore\qidentityproxymodel.h \
		c:\qt\5.7.1static\include\QtCore\qitemselectionmodel.h \
		c:\qt\5.7.1static\include\QtCore\qsortfilterproxymodel.h \
		c:\qt\5.7.1static\include\QtCore\qstringlistmodel.h \
		c:\qt\5.7.1static\include\QtCore\qjsonarray.h \
		c:\qt\5.7.1static\include\QtCore\qjsonvalue.h \
		c:\qt\5.7.1static\include\QtCore\qjsondocument.h \
		c:\qt\5.7.1static\include\QtCore\qjsonobject.h \
		c:\qt\5.7.1static\include\QtCore\qabstracteventdispatcher.h \
		c:\qt\5.7.1static\include\QtCore\qabstractnativeeventfilter.h \
		c:\qt\5.7.1static\include\QtCore\qbasictimer.h \
		c:\qt\5.7.1static\include\QtCore\qmath.h \
		c:\qt\5.7.1static\include\QtCore\qmetaobject.h \
		c:\qt\5.7.1static\include\QtCore\qmimedata.h \
		c:\qt\5.7.1static\include\QtCore\qobjectcleanuphandler.h \
		c:\qt\5.7.1static\include\QtCore\qpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedmemory.h \
		c:\qt\5.7.1static\include\QtCore\qsignalmapper.h \
		c:\qt\5.7.1static\include\QtCore\qsocketnotifier.h \
		c:\qt\5.7.1static\include\QtCore\qsystemsemaphore.h \
		c:\qt\5.7.1static\include\QtCore\qtimer.h \
		c:\qt\5.7.1static\include\QtCore\qtranslator.h \
		c:\qt\5.7.1static\include\QtCore\qwineventnotifier.h \
		c:\qt\5.7.1static\include\QtCore\qmimedatabase.h \
		c:\qt\5.7.1static\include\QtCore\qmimetype.h \
		c:\qt\5.7.1static\include\QtCore\qfactoryinterface.h \
		c:\qt\5.7.1static\include\QtCore\qlibrary.h \
		c:\qt\5.7.1static\include\QtCore\qplugin.h \
		c:\qt\5.7.1static\include\QtCore\qpluginloader.h \
		c:\qt\5.7.1static\include\QtCore\quuid.h \
		c:\qt\5.7.1static\include\QtCore\qabstractstate.h \
		c:\qt\5.7.1static\include\QtCore\qabstracttransition.h \
		c:\qt\5.7.1static\include\QtCore\qeventtransition.h \
		c:\qt\5.7.1static\include\QtCore\qfinalstate.h \
		c:\qt\5.7.1static\include\QtCore\qhistorystate.h \
		c:\qt\5.7.1static\include\QtCore\qsignaltransition.h \
		c:\qt\5.7.1static\include\QtCore\qstate.h \
		c:\qt\5.7.1static\include\QtCore\qstatemachine.h \
		c:\qt\5.7.1static\include\QtCore\qexception.h \
		c:\qt\5.7.1static\include\QtCore\qfuture.h \
		c:\qt\5.7.1static\include\QtCore\qfutureinterface.h \
		c:\qt\5.7.1static\include\QtCore\qrunnable.h \
		c:\qt\5.7.1static\include\QtCore\qresultstore.h \
		c:\qt\5.7.1static\include\QtCore\qfuturesynchronizer.h \
		c:\qt\5.7.1static\include\QtCore\qfuturewatcher.h \
		c:\qt\5.7.1static\include\QtCore\qreadwritelock.h \
		c:\qt\5.7.1static\include\QtCore\qsemaphore.h \
		c:\qt\5.7.1static\include\QtCore\qthread.h \
		c:\qt\5.7.1static\include\QtCore\qthreadpool.h \
		c:\qt\5.7.1static\include\QtCore\qthreadstorage.h \
		c:\qt\5.7.1static\include\QtCore\qwaitcondition.h \
		c:\qt\5.7.1static\include\QtCore\qarraydataops.h \
		c:\qt\5.7.1static\include\QtCore\qarraydatapointer.h \
		c:\qt\5.7.1static\include\QtCore\qbitarray.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraymatcher.h \
		c:\qt\5.7.1static\include\QtCore\qcache.h \
		c:\qt\5.7.1static\include\QtCore\qcollator.h \
		c:\qt\5.7.1static\include\QtCore\qcommandlineoption.h \
		c:\qt\5.7.1static\include\QtCore\qcommandlineparser.h \
		c:\qt\5.7.1static\include\QtCore\qcryptographichash.h \
		c:\qt\5.7.1static\include\QtCore\qelapsedtimer.h \
		c:\qt\5.7.1static\include\QtCore\qlinkedlist.h \
		c:\qt\5.7.1static\include\QtCore\qmessageauthenticationcode.h \
		c:\qt\5.7.1static\include\QtCore\qqueue.h \
		c:\qt\5.7.1static\include\QtCore\qregularexpression.h \
		c:\qt\5.7.1static\include\QtCore\qscopedvaluerollback.h \
		c:\qt\5.7.1static\include\QtCore\qstack.h \
		c:\qt\5.7.1static\include\QtCore\qtextboundaryfinder.h \
		c:\qt\5.7.1static\include\QtCore\qtimeline.h \
		c:\qt\5.7.1static\include\QtCore\qtimezone.h \
		c:\qt\5.7.1static\include\QtCore\qversionnumber.h \
		c:\qt\5.7.1static\include\QtCore\qxmlstream.h \
		c:\qt\5.7.1static\include\QtCore\qtcoreversion.h \
		c:\qt\5.7.1static\include\QtGui\qaccessible.h \
		c:\qt\5.7.1static\include\QtGui\qaccessiblebridge.h \
		c:\qt\5.7.1static\include\QtGui\qaccessibleobject.h \
		c:\qt\5.7.1static\include\QtGui\qaccessibleplugin.h \
		c:\qt\5.7.1static\include\QtGui\qbitmap.h \
		c:\qt\5.7.1static\include\QtGui\qicon.h \
		c:\qt\5.7.1static\include\QtGui\qiconengine.h \
		c:\qt\5.7.1static\include\QtGui\qiconengineplugin.h \
		c:\qt\5.7.1static\include\QtGui\qimageiohandler.h \
		c:\qt\5.7.1static\include\QtGui\qimagereader.h \
		c:\qt\5.7.1static\include\QtGui\qimagewriter.h \
		c:\qt\5.7.1static\include\QtGui\qmovie.h \
		c:\qt\5.7.1static\include\QtGui\qpicture.h \
		c:\qt\5.7.1static\include\QtGui\qpictureformatplugin.h \
		c:\qt\5.7.1static\include\QtGui\qpixmapcache.h \
		c:\qt\5.7.1static\include\QtGui\qstandarditemmodel.h \
		c:\qt\5.7.1static\include\QtGui\qclipboard.h \
		c:\qt\5.7.1static\include\QtGui\qdrag.h \
		c:\qt\5.7.1static\include\QtGui\qgenericplugin.h \
		c:\qt\5.7.1static\include\QtGui\qgenericpluginfactory.h \
		c:\qt\5.7.1static\include\QtGui\qoffscreensurface.h \
		c:\qt\5.7.1static\include\QtGui\qsurface.h \
		c:\qt\5.7.1static\include\QtGui\qsurfaceformat.h \
		c:\qt\5.7.1static\include\QtGui\qopenglcontext.h \
		c:\qt\5.7.1static\include\QtGui\QSurfaceFormat \
		c:\qt\5.7.1static\include\QtGui\qopengl.h \
		c:\qt\5.7.1static\include\QtCore\qt_windows.h \
		c:\qt\5.7.1static\include\QtGui\qopengles2ext.h \
		c:\qt\5.7.1static\include\QtGui\qopenglext.h \
		c:\qt\5.7.1static\include\QtGui\qopenglversionfunctions.h \
		c:\qt\5.7.1static\include\QtGui\qopenglwindow.h \
		c:\qt\5.7.1static\include\QtGui\QPaintDeviceWindow \
		c:\qt\5.7.1static\include\QtGui\qpaintdevicewindow.h \
		c:\qt\5.7.1static\include\QtGui\QWindow \
		c:\qt\5.7.1static\include\QtGui\qwindow.h \
		c:\qt\5.7.1static\include\QtCore\QEvent \
		c:\qt\5.7.1static\include\QtCore\QMargins \
		c:\qt\5.7.1static\include\QtCore\QRect \
		c:\qt\5.7.1static\include\QtGui\QPaintDevice \
		c:\qt\5.7.1static\include\QtGui\QOpenGLContext \
		c:\qt\5.7.1static\include\QtGui\QImage \
		c:\qt\5.7.1static\include\QtGui\qrasterwindow.h \
		c:\qt\5.7.1static\include\QtGui\qscreen.h \
		c:\qt\5.7.1static\include\QtCore\QList \
		c:\qt\5.7.1static\include\QtCore\QSize \
		c:\qt\5.7.1static\include\QtCore\QSizeF \
		c:\qt\5.7.1static\include\QtGui\QTransform \
		c:\qt\5.7.1static\include\QtGui\qsessionmanager.h \
		c:\qt\5.7.1static\include\QtGui\qstylehints.h \
		c:\qt\5.7.1static\include\QtGui\qgenericmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix4x4.h \
		c:\qt\5.7.1static\include\QtGui\qvector3d.h \
		c:\qt\5.7.1static\include\QtGui\qvector4d.h \
		c:\qt\5.7.1static\include\QtGui\qquaternion.h \
		c:\qt\5.7.1static\include\QtGui\qopenglbuffer.h \
		c:\qt\5.7.1static\include\QtGui\qopengldebug.h \
		c:\qt\5.7.1static\include\QtGui\qopenglextrafunctions.h \
		c:\qt\5.7.1static\include\QtGui\qopenglfunctions.h \
		c:\qt\5.7.1static\include\QtGui\qopenglframebufferobject.h \
		c:\qt\5.7.1static\include\QtGui\qopenglpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qopenglpixeltransferoptions.h \
		c:\qt\5.7.1static\include\QtCore\QSharedDataPointer \
		c:\qt\5.7.1static\include\QtGui\qopenglshaderprogram.h \
		c:\qt\5.7.1static\include\QtGui\qopengltexture.h \
		c:\qt\5.7.1static\include\QtGui\qopengltimerquery.h \
		c:\qt\5.7.1static\include\QtGui\qopenglvertexarrayobject.h \
		c:\qt\5.7.1static\include\QtGui\qbackingstore.h \
		c:\qt\5.7.1static\include\QtGui\qpagedpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qpagelayout.h \
		c:\qt\5.7.1static\include\QtGui\qpagesize.h \
		c:\qt\5.7.1static\include\QtGui\qpaintengine.h \
		c:\qt\5.7.1static\include\QtGui\qpainter.h \
		c:\qt\5.7.1static\include\QtGui\qtextoption.h \
		c:\qt\5.7.1static\include\QtGui\qpen.h \
		c:\qt\5.7.1static\include\QtGui\qpdfwriter.h \
		c:\qt\5.7.1static\include\QtGui\qabstracttextdocumentlayout.h \
		c:\qt\5.7.1static\include\QtGui\qtextlayout.h \
		c:\qt\5.7.1static\include\QtGui\qtextformat.h \
		c:\qt\5.7.1static\include\QtGui\qglyphrun.h \
		c:\qt\5.7.1static\include\QtGui\qrawfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontdatabase.h \
		c:\qt\5.7.1static\include\QtGui\qtextcursor.h \
		c:\qt\5.7.1static\include\QtGui\qtextdocument.h \
		c:\qt\5.7.1static\include\QtGui\qstatictext.h \
		c:\qt\5.7.1static\include\QtGui\qsyntaxhighlighter.h \
		c:\qt\5.7.1static\include\QtGui\qtextobject.h \
		c:\qt\5.7.1static\include\QtGui\qtextdocumentfragment.h \
		c:\qt\5.7.1static\include\QtGui\qtextdocumentwriter.h \
		c:\qt\5.7.1static\include\QtGui\qtextlist.h \
		c:\qt\5.7.1static\include\QtGui\qtexttable.h \
		c:\qt\5.7.1static\include\QtGui\qdesktopservices.h \
		c:\qt\5.7.1static\include\QtGui\qvalidator.h \
		c:\qt\5.7.1static\include\QtGui\qtguiversion.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsItem \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsitem.h \
		c:\qt\5.7.1static\include\QtWidgets\QMainWindow \
		c:\qt\5.7.1static\include\QtWidgets\qmainwindow.h \
		c:\qt\5.7.1static\include\QtWidgets\qtabwidget.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsScene \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsscene.h \
		ui_mainWindow.h \
		barcodeitem.h \
		..\backend_qt\qzint.h \
		c:\qt\5.7.1static\include\QtGui\QColor \
		c:\qt\5.7.1static\include\QtGui\QPainter \
		..\backend\zint.h

debug\mainwindow.obj: mainwindow.cpp c:\qt\5.7.1static\include\QtCore\QDebug \
		c:\qt\5.7.1static\include\QtCore\qdebug.h \
		c:\qt\5.7.1static\include\QtCore\qalgorithms.h \
		c:\qt\5.7.1static\include\QtCore\qglobal.h \
		c:\qt\5.7.1static\include\QtCore\qconfig.h \
		c:\qt\5.7.1static\include\QtCore\qfeatures.h \
		c:\qt\5.7.1static\include\QtCore\qsystemdetection.h \
		c:\qt\5.7.1static\include\QtCore\qprocessordetection.h \
		c:\qt\5.7.1static\include\QtCore\qcompilerdetection.h \
		c:\qt\5.7.1static\include\QtCore\qtypeinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtypetraits.h \
		c:\qt\5.7.1static\include\QtCore\qisenum.h \
		c:\qt\5.7.1static\include\QtCore\qsysinfo.h \
		c:\qt\5.7.1static\include\QtCore\qlogging.h \
		c:\qt\5.7.1static\include\QtCore\qflags.h \
		c:\qt\5.7.1static\include\QtCore\qatomic.h \
		c:\qt\5.7.1static\include\QtCore\qbasicatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_bootstrap.h \
		c:\qt\5.7.1static\include\QtCore\qgenericatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_cxx11.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_msvc.h \
		c:\qt\5.7.1static\include\QtCore\qglobalstatic.h \
		c:\qt\5.7.1static\include\QtCore\qmutex.h \
		c:\qt\5.7.1static\include\QtCore\qnumeric.h \
		c:\qt\5.7.1static\include\QtCore\qversiontagging.h \
		c:\qt\5.7.1static\include\QtCore\qhash.h \
		c:\qt\5.7.1static\include\QtCore\qchar.h \
		c:\qt\5.7.1static\include\QtCore\qiterator.h \
		c:\qt\5.7.1static\include\QtCore\qlist.h \
		c:\qt\5.7.1static\include\QtCore\qrefcount.h \
		c:\qt\5.7.1static\include\QtCore\qarraydata.h \
		c:\qt\5.7.1static\include\QtCore\qhashfunctions.h \
		c:\qt\5.7.1static\include\QtCore\qpair.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraylist.h \
		c:\qt\5.7.1static\include\QtCore\qbytearray.h \
		c:\qt\5.7.1static\include\QtCore\qnamespace.h \
		c:\qt\5.7.1static\include\QtCore\qstring.h \
		c:\qt\5.7.1static\include\QtCore\qstringbuilder.h \
		c:\qt\5.7.1static\include\QtCore\qstringlist.h \
		c:\qt\5.7.1static\include\QtCore\qregexp.h \
		c:\qt\5.7.1static\include\QtCore\qstringmatcher.h \
		c:\qt\5.7.1static\include\QtCore\qmap.h \
		c:\qt\5.7.1static\include\QtCore\qtextstream.h \
		c:\qt\5.7.1static\include\QtCore\qiodevice.h \
		c:\qt\5.7.1static\include\QtCore\qobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs_impl.h \
		c:\qt\5.7.1static\include\QtCore\qcoreevent.h \
		c:\qt\5.7.1static\include\QtCore\qscopedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qmetatype.h \
		c:\qt\5.7.1static\include\QtCore\qvarlengtharray.h \
		c:\qt\5.7.1static\include\QtCore\qcontainerfwd.h \
		c:\qt\5.7.1static\include\QtCore\qobject_impl.h \
		c:\qt\5.7.1static\include\QtCore\qlocale.h \
		c:\qt\5.7.1static\include\QtCore\qvariant.h \
		c:\qt\5.7.1static\include\QtCore\qshareddata.h \
		c:\qt\5.7.1static\include\QtCore\qvector.h \
		c:\qt\5.7.1static\include\QtCore\qpoint.h \
		c:\qt\5.7.1static\include\QtCore\qset.h \
		c:\qt\5.7.1static\include\QtCore\qcontiguouscache.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer_impl.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsScene \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsscene.h \
		c:\qt\5.7.1static\include\QtCore\qrect.h \
		c:\qt\5.7.1static\include\QtCore\qmargins.h \
		c:\qt\5.7.1static\include\QtCore\qsize.h \
		c:\qt\5.7.1static\include\QtGui\qbrush.h \
		c:\qt\5.7.1static\include\QtGui\qcolor.h \
		c:\qt\5.7.1static\include\QtGui\qrgb.h \
		c:\qt\5.7.1static\include\QtGui\qrgba64.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qpolygon.h \
		c:\qt\5.7.1static\include\QtGui\qregion.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs_win.h \
		c:\qt\5.7.1static\include\QtCore\qdatastream.h \
		c:\qt\5.7.1static\include\QtCore\qline.h \
		c:\qt\5.7.1static\include\QtGui\qtransform.h \
		c:\qt\5.7.1static\include\QtGui\qpainterpath.h \
		c:\qt\5.7.1static\include\QtGui\qimage.h \
		c:\qt\5.7.1static\include\QtGui\qpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qpixelformat.h \
		c:\qt\5.7.1static\include\QtGui\qpixmap.h \
		c:\qt\5.7.1static\include\QtGui\qfont.h \
		c:\qt\5.7.1static\include\QtGui\qpen.h \
		c:\qt\5.7.1static\include\QtGui\QImage \
		c:\qt\5.7.1static\include\QtWidgets\QColorDialog \
		c:\qt\5.7.1static\include\QtWidgets\qcolordialog.h \
		c:\qt\5.7.1static\include\QtWidgets\qdialog.h \
		c:\qt\5.7.1static\include\QtWidgets\qwidget.h \
		c:\qt\5.7.1static\include\QtGui\qpalette.h \
		c:\qt\5.7.1static\include\QtGui\qfontmetrics.h \
		c:\qt\5.7.1static\include\QtGui\qfontinfo.h \
		c:\qt\5.7.1static\include\QtWidgets\qsizepolicy.h \
		c:\qt\5.7.1static\include\QtGui\qcursor.h \
		c:\qt\5.7.1static\include\QtGui\qkeysequence.h \
		c:\qt\5.7.1static\include\QtGui\qevent.h \
		c:\qt\5.7.1static\include\QtCore\qurl.h \
		c:\qt\5.7.1static\include\QtCore\qurlquery.h \
		c:\qt\5.7.1static\include\QtCore\qfile.h \
		c:\qt\5.7.1static\include\QtCore\qfiledevice.h \
		c:\qt\5.7.1static\include\QtGui\qvector2d.h \
		c:\qt\5.7.1static\include\QtGui\qtouchdevice.h \
		c:\qt\5.7.1static\include\QtUiTools\QUiLoader \
		c:\qt\5.7.1static\include\QtUiTools\quiloader.h \
		c:\qt\5.7.1static\include\QtCore\QObject \
		c:\qt\5.7.1static\include\QtCore\QScopedPointer \
		c:\qt\5.7.1static\include\QtCore\QFile \
		c:\qt\5.7.1static\include\QtWidgets\QRadioButton \
		c:\qt\5.7.1static\include\QtWidgets\qradiobutton.h \
		c:\qt\5.7.1static\include\QtWidgets\qabstractbutton.h \
		c:\qt\5.7.1static\include\QtGui\qicon.h \
		c:\qt\5.7.1static\include\QtWidgets\QFileDialog \
		c:\qt\5.7.1static\include\QtWidgets\qfiledialog.h \
		c:\qt\5.7.1static\include\QtCore\qdir.h \
		c:\qt\5.7.1static\include\QtCore\qfileinfo.h \
		c:\qt\5.7.1static\include\QtWidgets\QMessageBox \
		c:\qt\5.7.1static\include\QtWidgets\qmessagebox.h \
		c:\qt\5.7.1static\include\QtCore\QSettings \
		c:\qt\5.7.1static\include\QtCore\qsettings.h \
		c:\qt\5.7.1static\include\QtGui\QClipboard \
		c:\qt\5.7.1static\include\QtGui\qclipboard.h \
		c:\qt\5.7.1static\include\QtCore\QMimeData \
		c:\qt\5.7.1static\include\QtCore\qmimedata.h \
		mainwindow.h \
		c:\qt\5.7.1static\include\QtGui\QtGui \
		c:\qt\5.7.1static\include\QtGui\QtGuiDepends \
		c:\qt\5.7.1static\include\QtCore\QtCore \
		c:\qt\5.7.1static\include\QtCore\QtCoreDepends \
		c:\qt\5.7.1static\include\QtCore\qabstractanimation.h \
		c:\qt\5.7.1static\include\QtCore\qanimationgroup.h \
		c:\qt\5.7.1static\include\QtCore\qparallelanimationgroup.h \
		c:\qt\5.7.1static\include\QtCore\qpauseanimation.h \
		c:\qt\5.7.1static\include\QtCore\qpropertyanimation.h \
		c:\qt\5.7.1static\include\QtCore\qvariantanimation.h \
		c:\qt\5.7.1static\include\QtCore\qeasingcurve.h \
		c:\qt\5.7.1static\include\QtCore\qsequentialanimationgroup.h \
		c:\qt\5.7.1static\include\QtCore\qtextcodec.h \
		c:\qt\5.7.1static\include\QtCore\qendian.h \
		c:\qt\5.7.1static\include\QtCore\qlibraryinfo.h \
		c:\qt\5.7.1static\include\QtCore\qdatetime.h \
		c:\qt\5.7.1static\include\QtCore\qbuffer.h \
		c:\qt\5.7.1static\include\QtCore\qdiriterator.h \
		c:\qt\5.7.1static\include\QtCore\qfileselector.h \
		c:\qt\5.7.1static\include\QtCore\QStringList \
		c:\qt\5.7.1static\include\QtCore\qfilesystemwatcher.h \
		c:\qt\5.7.1static\include\QtCore\qlockfile.h \
		c:\qt\5.7.1static\include\QtCore\qloggingcategory.h \
		c:\qt\5.7.1static\include\QtCore\qprocess.h \
		c:\qt\5.7.1static\include\QtCore\qresource.h \
		c:\qt\5.7.1static\include\QtCore\qsavefile.h \
		c:\qt\5.7.1static\include\QtCore\qstandardpaths.h \
		c:\qt\5.7.1static\include\QtCore\qstorageinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtemporarydir.h \
		c:\qt\5.7.1static\include\QtCore\qtemporaryfile.h \
		c:\qt\5.7.1static\include\QtCore\qabstractitemmodel.h \
		c:\qt\5.7.1static\include\QtCore\qabstractproxymodel.h \
		c:\qt\5.7.1static\include\QtCore\qidentityproxymodel.h \
		c:\qt\5.7.1static\include\QtCore\qitemselectionmodel.h \
		c:\qt\5.7.1static\include\QtCore\qsortfilterproxymodel.h \
		c:\qt\5.7.1static\include\QtCore\qstringlistmodel.h \
		c:\qt\5.7.1static\include\QtCore\qjsonarray.h \
		c:\qt\5.7.1static\include\QtCore\qjsonvalue.h \
		c:\qt\5.7.1static\include\QtCore\qjsondocument.h \
		c:\qt\5.7.1static\include\QtCore\qjsonobject.h \
		c:\qt\5.7.1static\include\QtCore\qabstracteventdispatcher.h \
		c:\qt\5.7.1static\include\QtCore\qeventloop.h \
		c:\qt\5.7.1static\include\QtCore\qabstractnativeeventfilter.h \
		c:\qt\5.7.1static\include\QtCore\qbasictimer.h \
		c:\qt\5.7.1static\include\QtCore\qcoreapplication.h \
		c:\qt\5.7.1static\include\QtCore\qmath.h \
		c:\qt\5.7.1static\include\QtCore\qmetaobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectcleanuphandler.h \
		c:\qt\5.7.1static\include\QtCore\qpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedmemory.h \
		c:\qt\5.7.1static\include\QtCore\qsignalmapper.h \
		c:\qt\5.7.1static\include\QtCore\qsocketnotifier.h \
		c:\qt\5.7.1static\include\QtCore\qsystemsemaphore.h \
		c:\qt\5.7.1static\include\QtCore\qtimer.h \
		c:\qt\5.7.1static\include\QtCore\qtranslator.h \
		c:\qt\5.7.1static\include\QtCore\qwineventnotifier.h \
		c:\qt\5.7.1static\include\QtCore\qmimedatabase.h \
		c:\qt\5.7.1static\include\QtCore\qmimetype.h \
		c:\qt\5.7.1static\include\QtCore\qfactoryinterface.h \
		c:\qt\5.7.1static\include\QtCore\qlibrary.h \
		c:\qt\5.7.1static\include\QtCore\qplugin.h \
		c:\qt\5.7.1static\include\QtCore\qpluginloader.h \
		c:\qt\5.7.1static\include\QtCore\quuid.h \
		c:\qt\5.7.1static\include\QtCore\qabstractstate.h \
		c:\qt\5.7.1static\include\QtCore\qabstracttransition.h \
		c:\qt\5.7.1static\include\QtCore\qeventtransition.h \
		c:\qt\5.7.1static\include\QtCore\qfinalstate.h \
		c:\qt\5.7.1static\include\QtCore\qhistorystate.h \
		c:\qt\5.7.1static\include\QtCore\qsignaltransition.h \
		c:\qt\5.7.1static\include\QtCore\qstate.h \
		c:\qt\5.7.1static\include\QtCore\qstatemachine.h \
		c:\qt\5.7.1static\include\QtCore\qexception.h \
		c:\qt\5.7.1static\include\QtCore\qfuture.h \
		c:\qt\5.7.1static\include\QtCore\qfutureinterface.h \
		c:\qt\5.7.1static\include\QtCore\qrunnable.h \
		c:\qt\5.7.1static\include\QtCore\qresultstore.h \
		c:\qt\5.7.1static\include\QtCore\qfuturesynchronizer.h \
		c:\qt\5.7.1static\include\QtCore\qfuturewatcher.h \
		c:\qt\5.7.1static\include\QtCore\qreadwritelock.h \
		c:\qt\5.7.1static\include\QtCore\qsemaphore.h \
		c:\qt\5.7.1static\include\QtCore\qthread.h \
		c:\qt\5.7.1static\include\QtCore\qthreadpool.h \
		c:\qt\5.7.1static\include\QtCore\qthreadstorage.h \
		c:\qt\5.7.1static\include\QtCore\qwaitcondition.h \
		c:\qt\5.7.1static\include\QtCore\qarraydataops.h \
		c:\qt\5.7.1static\include\QtCore\qarraydatapointer.h \
		c:\qt\5.7.1static\include\QtCore\qbitarray.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraymatcher.h \
		c:\qt\5.7.1static\include\QtCore\qcache.h \
		c:\qt\5.7.1static\include\QtCore\qcollator.h \
		c:\qt\5.7.1static\include\QtCore\qcommandlineoption.h \
		c:\qt\5.7.1static\include\QtCore\qcommandlineparser.h \
		c:\qt\5.7.1static\include\QtCore\qcryptographichash.h \
		c:\qt\5.7.1static\include\QtCore\qelapsedtimer.h \
		c:\qt\5.7.1static\include\QtCore\qlinkedlist.h \
		c:\qt\5.7.1static\include\QtCore\qmessageauthenticationcode.h \
		c:\qt\5.7.1static\include\QtCore\qqueue.h \
		c:\qt\5.7.1static\include\QtCore\qregularexpression.h \
		c:\qt\5.7.1static\include\QtCore\qscopedvaluerollback.h \
		c:\qt\5.7.1static\include\QtCore\qstack.h \
		c:\qt\5.7.1static\include\QtCore\qtextboundaryfinder.h \
		c:\qt\5.7.1static\include\QtCore\qtimeline.h \
		c:\qt\5.7.1static\include\QtCore\qtimezone.h \
		c:\qt\5.7.1static\include\QtCore\qversionnumber.h \
		c:\qt\5.7.1static\include\QtCore\qxmlstream.h \
		c:\qt\5.7.1static\include\QtCore\qtcoreversion.h \
		c:\qt\5.7.1static\include\QtGui\qaccessible.h \
		c:\qt\5.7.1static\include\QtGui\qaccessiblebridge.h \
		c:\qt\5.7.1static\include\QtGui\qaccessibleobject.h \
		c:\qt\5.7.1static\include\QtGui\qaccessibleplugin.h \
		c:\qt\5.7.1static\include\QtGui\qbitmap.h \
		c:\qt\5.7.1static\include\QtGui\qiconengine.h \
		c:\qt\5.7.1static\include\QtGui\qiconengineplugin.h \
		c:\qt\5.7.1static\include\QtGui\qimageiohandler.h \
		c:\qt\5.7.1static\include\QtGui\qimagereader.h \
		c:\qt\5.7.1static\include\QtGui\qimagewriter.h \
		c:\qt\5.7.1static\include\QtGui\qmovie.h \
		c:\qt\5.7.1static\include\QtGui\qpicture.h \
		c:\qt\5.7.1static\include\QtGui\qpictureformatplugin.h \
		c:\qt\5.7.1static\include\QtGui\qpixmapcache.h \
		c:\qt\5.7.1static\include\QtGui\qstandarditemmodel.h \
		c:\qt\5.7.1static\include\QtGui\qdrag.h \
		c:\qt\5.7.1static\include\QtGui\qgenericplugin.h \
		c:\qt\5.7.1static\include\QtGui\qgenericpluginfactory.h \
		c:\qt\5.7.1static\include\QtGui\qguiapplication.h \
		c:\qt\5.7.1static\include\QtGui\qinputmethod.h \
		c:\qt\5.7.1static\include\QtGui\qoffscreensurface.h \
		c:\qt\5.7.1static\include\QtGui\qsurface.h \
		c:\qt\5.7.1static\include\QtGui\qsurfaceformat.h \
		c:\qt\5.7.1static\include\QtGui\qopenglcontext.h \
		c:\qt\5.7.1static\include\QtGui\QSurfaceFormat \
		c:\qt\5.7.1static\include\QtGui\qopengl.h \
		c:\qt\5.7.1static\include\QtCore\qt_windows.h \
		c:\qt\5.7.1static\include\QtGui\qopengles2ext.h \
		c:\qt\5.7.1static\include\QtGui\qopenglext.h \
		c:\qt\5.7.1static\include\QtGui\qopenglversionfunctions.h \
		c:\qt\5.7.1static\include\QtGui\qopenglwindow.h \
		c:\qt\5.7.1static\include\QtGui\QPaintDeviceWindow \
		c:\qt\5.7.1static\include\QtGui\qpaintdevicewindow.h \
		c:\qt\5.7.1static\include\QtGui\QWindow \
		c:\qt\5.7.1static\include\QtGui\qwindow.h \
		c:\qt\5.7.1static\include\QtCore\QEvent \
		c:\qt\5.7.1static\include\QtCore\QMargins \
		c:\qt\5.7.1static\include\QtCore\QRect \
		c:\qt\5.7.1static\include\QtGui\QPaintDevice \
		c:\qt\5.7.1static\include\QtGui\QOpenGLContext \
		c:\qt\5.7.1static\include\QtGui\qrasterwindow.h \
		c:\qt\5.7.1static\include\QtGui\qscreen.h \
		c:\qt\5.7.1static\include\QtCore\QList \
		c:\qt\5.7.1static\include\QtCore\QSize \
		c:\qt\5.7.1static\include\QtCore\QSizeF \
		c:\qt\5.7.1static\include\QtGui\QTransform \
		c:\qt\5.7.1static\include\QtGui\qsessionmanager.h \
		c:\qt\5.7.1static\include\QtGui\qstylehints.h \
		c:\qt\5.7.1static\include\QtGui\qgenericmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix4x4.h \
		c:\qt\5.7.1static\include\QtGui\qvector3d.h \
		c:\qt\5.7.1static\include\QtGui\qvector4d.h \
		c:\qt\5.7.1static\include\QtGui\qquaternion.h \
		c:\qt\5.7.1static\include\QtGui\qopenglbuffer.h \
		c:\qt\5.7.1static\include\QtGui\qopengldebug.h \
		c:\qt\5.7.1static\include\QtGui\qopenglextrafunctions.h \
		c:\qt\5.7.1static\include\QtGui\qopenglfunctions.h \
		c:\qt\5.7.1static\include\QtGui\qopenglframebufferobject.h \
		c:\qt\5.7.1static\include\QtGui\qopenglpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qopenglpixeltransferoptions.h \
		c:\qt\5.7.1static\include\QtCore\QSharedDataPointer \
		c:\qt\5.7.1static\include\QtGui\qopenglshaderprogram.h \
		c:\qt\5.7.1static\include\QtGui\qopengltexture.h \
		c:\qt\5.7.1static\include\QtGui\qopengltimerquery.h \
		c:\qt\5.7.1static\include\QtGui\qopenglvertexarrayobject.h \
		c:\qt\5.7.1static\include\QtGui\qbackingstore.h \
		c:\qt\5.7.1static\include\QtGui\qpagedpaintdevice.h \
		c:\qt\5.7.1static\include\QtGui\qpagelayout.h \
		c:\qt\5.7.1static\include\QtGui\qpagesize.h \
		c:\qt\5.7.1static\include\QtGui\qpaintengine.h \
		c:\qt\5.7.1static\include\QtGui\qpainter.h \
		c:\qt\5.7.1static\include\QtGui\qtextoption.h \
		c:\qt\5.7.1static\include\QtGui\qpdfwriter.h \
		c:\qt\5.7.1static\include\QtGui\qabstracttextdocumentlayout.h \
		c:\qt\5.7.1static\include\QtGui\qtextlayout.h \
		c:\qt\5.7.1static\include\QtGui\qtextformat.h \
		c:\qt\5.7.1static\include\QtGui\qglyphrun.h \
		c:\qt\5.7.1static\include\QtGui\qrawfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontdatabase.h \
		c:\qt\5.7.1static\include\QtGui\qtextcursor.h \
		c:\qt\5.7.1static\include\QtGui\qtextdocument.h \
		c:\qt\5.7.1static\include\QtGui\qstatictext.h \
		c:\qt\5.7.1static\include\QtGui\qsyntaxhighlighter.h \
		c:\qt\5.7.1static\include\QtGui\qtextobject.h \
		c:\qt\5.7.1static\include\QtGui\qtextdocumentfragment.h \
		c:\qt\5.7.1static\include\QtGui\qtextdocumentwriter.h \
		c:\qt\5.7.1static\include\QtGui\qtextlist.h \
		c:\qt\5.7.1static\include\QtGui\qtexttable.h \
		c:\qt\5.7.1static\include\QtGui\qdesktopservices.h \
		c:\qt\5.7.1static\include\QtGui\qvalidator.h \
		c:\qt\5.7.1static\include\QtGui\qtguiversion.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsItem \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsitem.h \
		c:\qt\5.7.1static\include\QtWidgets\QMainWindow \
		c:\qt\5.7.1static\include\QtWidgets\qmainwindow.h \
		c:\qt\5.7.1static\include\QtWidgets\qtabwidget.h \
		ui_mainWindow.h \
		barcodeitem.h \
		..\backend_qt\qzint.h \
		c:\qt\5.7.1static\include\QtGui\QColor \
		c:\qt\5.7.1static\include\QtGui\QPainter \
		..\backend\zint.h \
		datawindow.h \
		ui_extData.h \
		sequencewindow.h \
		ui_extSequence.h

debug\sequencewindow.obj: sequencewindow.cpp c:\qt\5.7.1static\include\QtCore\QDebug \
		c:\qt\5.7.1static\include\QtCore\qdebug.h \
		c:\qt\5.7.1static\include\QtCore\qalgorithms.h \
		c:\qt\5.7.1static\include\QtCore\qglobal.h \
		c:\qt\5.7.1static\include\QtCore\qconfig.h \
		c:\qt\5.7.1static\include\QtCore\qfeatures.h \
		c:\qt\5.7.1static\include\QtCore\qsystemdetection.h \
		c:\qt\5.7.1static\include\QtCore\qprocessordetection.h \
		c:\qt\5.7.1static\include\QtCore\qcompilerdetection.h \
		c:\qt\5.7.1static\include\QtCore\qtypeinfo.h \
		c:\qt\5.7.1static\include\QtCore\qtypetraits.h \
		c:\qt\5.7.1static\include\QtCore\qisenum.h \
		c:\qt\5.7.1static\include\QtCore\qsysinfo.h \
		c:\qt\5.7.1static\include\QtCore\qlogging.h \
		c:\qt\5.7.1static\include\QtCore\qflags.h \
		c:\qt\5.7.1static\include\QtCore\qatomic.h \
		c:\qt\5.7.1static\include\QtCore\qbasicatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_bootstrap.h \
		c:\qt\5.7.1static\include\QtCore\qgenericatomic.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_cxx11.h \
		c:\qt\5.7.1static\include\QtCore\qatomic_msvc.h \
		c:\qt\5.7.1static\include\QtCore\qglobalstatic.h \
		c:\qt\5.7.1static\include\QtCore\qmutex.h \
		c:\qt\5.7.1static\include\QtCore\qnumeric.h \
		c:\qt\5.7.1static\include\QtCore\qversiontagging.h \
		c:\qt\5.7.1static\include\QtCore\qhash.h \
		c:\qt\5.7.1static\include\QtCore\qchar.h \
		c:\qt\5.7.1static\include\QtCore\qiterator.h \
		c:\qt\5.7.1static\include\QtCore\qlist.h \
		c:\qt\5.7.1static\include\QtCore\qrefcount.h \
		c:\qt\5.7.1static\include\QtCore\qarraydata.h \
		c:\qt\5.7.1static\include\QtCore\qhashfunctions.h \
		c:\qt\5.7.1static\include\QtCore\qpair.h \
		c:\qt\5.7.1static\include\QtCore\qbytearraylist.h \
		c:\qt\5.7.1static\include\QtCore\qbytearray.h \
		c:\qt\5.7.1static\include\QtCore\qnamespace.h \
		c:\qt\5.7.1static\include\QtCore\qstring.h \
		c:\qt\5.7.1static\include\QtCore\qstringbuilder.h \
		c:\qt\5.7.1static\include\QtCore\qstringlist.h \
		c:\qt\5.7.1static\include\QtCore\qregexp.h \
		c:\qt\5.7.1static\include\QtCore\qstringmatcher.h \
		c:\qt\5.7.1static\include\QtCore\qmap.h \
		c:\qt\5.7.1static\include\QtCore\qtextstream.h \
		c:\qt\5.7.1static\include\QtCore\qiodevice.h \
		c:\qt\5.7.1static\include\QtCore\qobject.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs.h \
		c:\qt\5.7.1static\include\QtCore\qobjectdefs_impl.h \
		c:\qt\5.7.1static\include\QtCore\qcoreevent.h \
		c:\qt\5.7.1static\include\QtCore\qscopedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qmetatype.h \
		c:\qt\5.7.1static\include\QtCore\qvarlengtharray.h \
		c:\qt\5.7.1static\include\QtCore\qcontainerfwd.h \
		c:\qt\5.7.1static\include\QtCore\qobject_impl.h \
		c:\qt\5.7.1static\include\QtCore\qlocale.h \
		c:\qt\5.7.1static\include\QtCore\qvariant.h \
		c:\qt\5.7.1static\include\QtCore\qshareddata.h \
		c:\qt\5.7.1static\include\QtCore\qvector.h \
		c:\qt\5.7.1static\include\QtCore\qpoint.h \
		c:\qt\5.7.1static\include\QtCore\qset.h \
		c:\qt\5.7.1static\include\QtCore\qcontiguouscache.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer.h \
		c:\qt\5.7.1static\include\QtCore\qsharedpointer_impl.h \
		c:\qt\5.7.1static\include\QtCore\QFile \
		c:\qt\5.7.1static\include\QtCore\qfile.h \
		c:\qt\5.7.1static\include\QtCore\qfiledevice.h \
		c:\qt\5.7.1static\include\QtUiTools\QUiLoader \
		c:\qt\5.7.1static\include\QtUiTools\quiloader.h \
		c:\qt\5.7.1static\include\QtCore\QObject \
		c:\qt\5.7.1static\include\QtCore\QScopedPointer \
		c:\qt\5.7.1static\include\QtWidgets\QFileDialog \
		c:\qt\5.7.1static\include\QtWidgets\qfiledialog.h \
		c:\qt\5.7.1static\include\QtCore\qdir.h \
		c:\qt\5.7.1static\include\QtCore\qfileinfo.h \
		c:\qt\5.7.1static\include\QtCore\qurl.h \
		c:\qt\5.7.1static\include\QtCore\qurlquery.h \
		c:\qt\5.7.1static\include\QtWidgets\qdialog.h \
		c:\qt\5.7.1static\include\QtWidgets\qwidget.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs.h \
		c:\qt\5.7.1static\include\QtGui\qwindowdefs_win.h \
		c:\qt\5.7.1static\include\QtCore\qmargins.h \
		c:\qt\5.7.1static\include\QtGui\qpaintdevice.h \
		c:\qt\5.7.1static\include\QtCore\qrect.h \
		c:\qt\5.7.1static\include\QtCore\qsize.h \
		c:\qt\5.7.1static\include\QtGui\qpalette.h \
		c:\qt\5.7.1static\include\QtGui\qcolor.h \
		c:\qt\5.7.1static\include\QtGui\qrgb.h \
		c:\qt\5.7.1static\include\QtGui\qrgba64.h \
		c:\qt\5.7.1static\include\QtGui\qbrush.h \
		c:\qt\5.7.1static\include\QtGui\qmatrix.h \
		c:\qt\5.7.1static\include\QtGui\qpolygon.h \
		c:\qt\5.7.1static\include\QtGui\qregion.h \
		c:\qt\5.7.1static\include\QtCore\qdatastream.h \
		c:\qt\5.7.1static\include\QtCore\qline.h \
		c:\qt\5.7.1static\include\QtGui\qtransform.h \
		c:\qt\5.7.1static\include\QtGui\qpainterpath.h \
		c:\qt\5.7.1static\include\QtGui\qimage.h \
		c:\qt\5.7.1static\include\QtGui\qpixelformat.h \
		c:\qt\5.7.1static\include\QtGui\qpixmap.h \
		c:\qt\5.7.1static\include\QtGui\qfont.h \
		c:\qt\5.7.1static\include\QtGui\qfontmetrics.h \
		c:\qt\5.7.1static\include\QtGui\qfontinfo.h \
		c:\qt\5.7.1static\include\QtWidgets\qsizepolicy.h \
		c:\qt\5.7.1static\include\QtGui\qcursor.h \
		c:\qt\5.7.1static\include\QtGui\qkeysequence.h \
		c:\qt\5.7.1static\include\QtGui\qevent.h \
		c:\qt\5.7.1static\include\QtGui\qvector2d.h \
		c:\qt\5.7.1static\include\QtGui\qtouchdevice.h \
		c:\qt\5.7.1static\include\QtWidgets\QMessageBox \
		c:\qt\5.7.1static\include\QtWidgets\qmessagebox.h \
		sequencewindow.h \
		ui_extSequence.h \
		barcodeitem.h \
		c:\qt\5.7.1static\include\QtWidgets\QGraphicsItem \
		c:\qt\5.7.1static\include\QtWidgets\qgraphicsitem.h \
		..\backend_qt\qzint.h \
		c:\qt\5.7.1static\include\QtGui\QColor \
		c:\qt\5.7.1static\include\QtGui\QPainter \
		c:\qt\5.7.1static\include\QtGui\qpainter.h \
		c:\qt\5.7.1static\include\QtGui\qtextoption.h \
		c:\qt\5.7.1static\include\QtGui\qpen.h \
		..\backend\zint.h \
		exportwindow.h \
		ui_extExport.h

debug\qtzint_plugin_import.obj: C:/test/git/zint-code/frontend_qt/qtzint_plugin_import.cpp 

debug\qrc_resources.obj: debug\qrc_resources.cpp 

debug\moc_datawindow.obj: debug\moc_datawindow.cpp 

debug\moc_exportwindow.obj: debug\moc_exportwindow.cpp 

debug\moc_mainwindow.obj: debug\moc_mainwindow.cpp 

debug\moc_sequencewindow.obj: debug\moc_sequencewindow.cpp 

####### Install

install:  FORCE

uninstall:  FORCE

FORCE:

<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Changes to jni/zint/frontend_qt/barcodeitem.cpp.
18
19
20
21
22
23
24

25
26
27
28
29
30
31
#include "barcodeitem.h"

BarcodeItem::BarcodeItem()
		: QGraphicsItem()
{
	w=693;
	h=378; // Default widget size when created

}

BarcodeItem::~BarcodeItem()
{
}

void BarcodeItem::setSize(int width, int height) {







>







18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "barcodeitem.h"

BarcodeItem::BarcodeItem()
		: QGraphicsItem()
{
	w=693;
	h=378; // Default widget size when created
	ar = Zint::QZint::AspectRatioMode::IgnoreAspectRatio;
}

BarcodeItem::~BarcodeItem()
{
}

void BarcodeItem::setSize(int width, int height) {
Changes to jni/zint/frontend_qt/frontend_qt.pro.
24
25
26
27
28
29
30

31
32
33
34
35
36
37
38
39
40
41
42
43
44
         grpC49.ui \
         grpChannel.ui \
         grpCodeOne.ui \
         grpCodablockF.ui \
         grpDBExtend.ui \
         grpDM.ui \
         grpGrid.ui \

         grpMaxicode.ui \
         grpMicroPDF.ui \
         grpMQR.ui \
         grpMSICheck.ui \
         grpPDF417.ui \
         grpQR.ui \
         grpHX.ui \
         mainWindow.ui \
         grpDotCode.ui

SOURCES += barcodeitem.cpp \
        datawindow.cpp \
        exportwindow.cpp \
        main.cpp \







>






|







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
         grpC49.ui \
         grpChannel.ui \
         grpCodeOne.ui \
         grpCodablockF.ui \
         grpDBExtend.ui \
         grpDM.ui \
         grpGrid.ui \
         grpHX.ui \
         grpMaxicode.ui \
         grpMicroPDF.ui \
         grpMQR.ui \
         grpMSICheck.ui \
         grpPDF417.ui \
         grpQR.ui \
         grpRMQR.ui \
         mainWindow.ui \
         grpDotCode.ui

SOURCES += barcodeitem.cpp \
        datawindow.cpp \
        exportwindow.cpp \
        main.cpp \
Changes to jni/zint/frontend_qt/grpPDF417.ui.
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
        <property name="text" >
         <string>512 words</string>
        </property>
       </item>
      </widget>
     </item>
     <item row="2" column="0" >
      <widget class="QLabel" name="lblPDFWords" >
       <property name="text" >
        <string>Ma&amp;ximum Codeword Lengh:</string>
       </property>
       <property name="alignment" >
        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
       </property>
       <property name="buddy" >
        <cstring>codewords</cstring>
       </property>
      </widget>
     </item>
     <item row="2" column="1" >
      <widget class="QSpinBox" name="codewords" >
       <property name="minimum" >
        <number>928</number>
       </property>
       <property name="maximum" >
        <number>1800</number>
       </property>
       <property name="value" >
        <number>928</number>
       </property>
      </widget>
     </item>
     <item row="3" column="0" >
      <widget class="QRadioButton" name="radPDFStand" >
       <property name="text" >
        <string>S&amp;tandard</string>
       </property>
       <property name="checked" >
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item row="3" column="1" >
      <widget class="QRadioButton" name="radPDFHIBC" >
       <property name="text" >
        <string>&amp;HIBC PDF417</string>
       </property>
      </widget>
     </item>
     <item row="4" column="0" >
      <widget class="QRadioButton" name="radPDFTruncated" >
       <property name="text" >
        <string>&amp;Truncated</string>
       </property>
      </widget>
     </item>
    </layout>







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<









|






|







201
202
203
204
205
206
207


























208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
        <property name="text" >
         <string>512 words</string>
        </property>
       </item>
      </widget>
     </item>
     <item row="2" column="0" >


























      <widget class="QRadioButton" name="radPDFStand" >
       <property name="text" >
        <string>S&amp;tandard</string>
       </property>
       <property name="checked" >
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item row="2" column="1" >
      <widget class="QRadioButton" name="radPDFHIBC" >
       <property name="text" >
        <string>&amp;HIBC PDF417</string>
       </property>
      </widget>
     </item>
     <item row="3" column="0" >
      <widget class="QRadioButton" name="radPDFTruncated" >
       <property name="text" >
        <string>&amp;Truncated</string>
       </property>
      </widget>
     </item>
    </layout>
Added jni/zint/frontend_qt/grpRMQR.ui.
















































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>grpRMQR</class>
 <widget class="QWidget" name="grpRMQR">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>441</width>
    <height>238</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <layout class="QGridLayout" name="grpRMQROptions">
     <item row="0" column="0">
      <widget class="QRadioButton" name="radRMQRAuto">
       <property name="text">
        <string>A&amp;utomatic Resizing</string>
       </property>
       <property name="checked">
        <bool>true</bool>
       </property>
      </widget>
     </item>
     <item row="1" column="0">
      <widget class="QRadioButton" name="radRMQRSize">
       <property name="text">
        <string>Adjust Si&amp;ze To:</string>
       </property>
      </widget>
     </item>
     <item row="1" column="1">
      <widget class="QComboBox" name="cmbRMQRSize">
       <property name="enabled">
        <bool>false</bool>
       </property>
       <item>
        <property name="text">
         <string>R7x43</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R7x59</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R7x77</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R7x99</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R7x139</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R9x43</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R9x59</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R9x77</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R9x99</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R9x139</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R11x27</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R11x43</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R11x59</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R11x77</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R11x99</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R11x139</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R13x27</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R13x43</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R13x59</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R13x77</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R13x99</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R13x139</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R15x43</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R15x59</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R15x77</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R15x99</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R15x139</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R17x43</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R17x59</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R17x77</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R17x99</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R17x139</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R7x Automatic Width</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R9x Automatic Width</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R11x Automatic Width</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R13x Automatic Width</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R15 x Automatic Width</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>R17 x Automatic Width</string>
        </property>
       </item>
      </widget>
     </item>
     <item row="2" column="0">
      <widget class="QRadioButton" name="radRMQRECC">
       <property name="text">
        <string>Add &amp;Error Correction:</string>
       </property>
      </widget>
     </item>
     <item row="2" column="1">
      <widget class="QComboBox" name="cmbRMQRECC">
       <property name="enabled">
        <bool>false</bool>
       </property>
       <item>
        <property name="text">
         <string>~37% (Level M)</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>~65% (Level H)</string>
        </property>
       </item>
      </widget>
     </item>
    </layout>
   </item>
   <item>
    <widget class="QGroupBox" name="grpRMQRMode">
     <property name="minimumSize">
      <size>
       <width>0</width>
       <height>70</height>
      </size>
     </property>
     <property name="title">
      <string>Data Encoding</string>
     </property>
     <widget class="QWidget" name="gridLayoutWidget">
      <property name="geometry">
       <rect>
        <x>10</x>
        <y>30</y>
        <width>411</width>
        <height>80</height>
       </rect>
      </property>
      <layout class="QGridLayout" name="gridLayout_2">
       <item row="0" column="0">
        <widget class="QRadioButton" name="radRMQRStand">
         <property name="minimumSize">
          <size>
           <width>0</width>
           <height>0</height>
          </size>
         </property>
         <property name="text">
          <string>S&amp;tandard Mode</string>
         </property>
         <property name="checked">
          <bool>true</bool>
         </property>
        </widget>
       </item>
       <item row="0" column="1">
        <widget class="QRadioButton" name="radRMQRGS1">
         <property name="text">
          <string>&amp;GS-1 Data Mode</string>
         </property>
        </widget>
       </item>
      </layout>
     </widget>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>radRMQRSize</sender>
   <signal>toggled(bool)</signal>
   <receiver>cmbRMQRSize</receiver>
   <slot>setEnabled(bool)</slot>
   <hints>
    <hint type="sourcelabel">
     <x>89</x>
     <y>39</y>
    </hint>
    <hint type="destinationlabel">
     <x>255</x>
     <y>46</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>radRMQRECC</sender>
   <signal>toggled(bool)</signal>
   <receiver>cmbRMQRECC</receiver>
   <slot>setEnabled(bool)</slot>
   <hints>
    <hint type="sourcelabel">
     <x>95</x>
     <y>79</y>
    </hint>
    <hint type="destinationlabel">
     <x>308</x>
     <y>79</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>
Changes to jni/zint/frontend_qt/mainWindow.ui.
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  <property name="minimumSize">
   <size>
    <width>420</width>
    <height>500</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>Zint Barcode Studio 2.6</string>
  </property>
  <property name="windowIcon">
   <iconset resource="resources.qrc">
    <normaloff>:/images/zint.png</normaloff>:/images/zint.png</iconset>
  </property>
  <property name="autoFillBackground">
   <bool>false</bool>







|







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  <property name="minimumSize">
   <size>
    <width>420</width>
    <height>500</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>Zint Barcode Studio 2.7</string>
  </property>
  <property name="windowIcon">
   <iconset resource="resources.qrc">
    <normaloff>:/images/zint.png</normaloff>:/images/zint.png</iconset>
  </property>
  <property name="autoFillBackground">
   <bool>false</bool>
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
                   <string>Data to be encoded in 2D component
Remember to place [square brackets] around AI data</string>
                  </property>
                  <property name="html">
                   <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Noto Sans [monotype]'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif';&quot;&gt;Your Data Here!&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
                  </property>
                  <property name="acceptRichText">
                   <bool>false</bool>
                  </property>
                 </widget>
                </item>
               </layout>







|
|







304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
                   <string>Data to be encoded in 2D component
Remember to place [square brackets] around AI data</string>
                  </property>
                  <property name="html">
                   <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;Your Data Here!&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
                  </property>
                  <property name="acceptRichText">
                   <bool>false</bool>
                  </property>
                 </widget>
                </item>
               </layout>
327
328
329
330
331
332
333
334



335
336
337
338
339
340
341
          <attribute name="title">
           <string>Appearance</string>
          </attribute>
          <layout class="QVBoxLayout" name="verticalLayout_4">
           <item>
            <layout class="QGridLayout" name="gridLayout">
             <item row="0" column="0">
              <widget class="QLabel" name="label_3">



               <property name="text">
                <string>&amp;Height:</string>
               </property>
               <property name="alignment">
                <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
               </property>
               <property name="buddy">







|
>
>
>







327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
          <attribute name="title">
           <string>Appearance</string>
          </attribute>
          <layout class="QVBoxLayout" name="verticalLayout_4">
           <item>
            <layout class="QGridLayout" name="gridLayout">
             <item row="0" column="0">
              <widget class="QLabel" name="lblHeight">
               <property name="enabled">
                <bool>false</bool>
               </property>
               <property name="text">
                <string>&amp;Height:</string>
               </property>
               <property name="alignment">
                <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
               </property>
               <property name="buddy">
380
381
382
383
384
385
386



387
388
389
390
391
392
393
               <property name="buddy">
                <cstring>spnScale</cstring>
               </property>
              </widget>
             </item>
             <item row="0" column="1">
              <widget class="QSpinBox" name="heightb">



               <property name="toolTip">
                <string>Overall symbol height</string>
               </property>
               <property name="suffix">
                <string> X</string>
               </property>
               <property name="prefix">







>
>
>







383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
               <property name="buddy">
                <cstring>spnScale</cstring>
               </property>
              </widget>
             </item>
             <item row="0" column="1">
              <widget class="QSpinBox" name="heightb">
               <property name="enabled">
                <bool>false</bool>
               </property>
               <property name="toolTip">
                <string>Overall symbol height</string>
               </property>
               <property name="suffix">
                <string> X</string>
               </property>
               <property name="prefix">
518
519
520
521
522
523
524













525
526
527
528
529
530
531
               <property name="text">
                <string>&amp;Reset Colours</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>













           <item>
            <widget class="QCheckBox" name="chkHRTHide">
             <property name="toolTip">
              <string>Show text in image</string>
             </property>
             <property name="text">
              <string>Show H&amp;uman Readable Text</string>







>
>
>
>
>
>
>
>
>
>
>
>
>







524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
               <property name="text">
                <string>&amp;Reset Colours</string>
               </property>
              </widget>
             </item>
            </layout>
           </item>
           <item>
            <widget class="QCheckBox" name="chkAutoHeight">
             <property name="enabled">
              <bool>true</bool>
             </property>
             <property name="text">
              <string>Automatic Height</string>
             </property>
             <property name="checked">
              <bool>true</bool>
             </property>
            </widget>
           </item>
           <item>
            <widget class="QCheckBox" name="chkHRTHide">
             <property name="toolTip">
              <string>Show text in image</string>
             </property>
             <property name="text">
              <string>Show H&amp;uman Readable Text</string>
Changes to jni/zint/frontend_qt/mainwindow.cpp.
1
2
3
4
5
6
7
8
9
10
/***************************************************************************
 *   Copyright (C) 2008 by BogDan Vatra <bogdan@licentia.eu>               *
 *   Copyright (C) 2009-2017 by Robin Stuart <rstuart114@gmail.com>        *
 *                                                                         *
 *   This program is free software: you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation, either version 3 of the License, or     *
 *   (at your option) any later version.                                   *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *


|







1
2
3
4
5
6
7
8
9
10
/***************************************************************************
 *   Copyright (C) 2008 by BogDan Vatra <bogdan@licentia.eu>               *
 *   Copyright (C) 2009-2019 by Robin Stuart <rstuart114@gmail.com>        *
 *                                                                         *
 *   This program is free software: you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation, either version 3 of the License, or     *
 *   (at your option) any later version.                                   *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162

163
164
165
166
167
168
169

#include "mainwindow.h"
#include "datawindow.h"
#include "sequencewindow.h"
#include <stdio.h>

MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags fl)
		: QWidget(parent, fl),m_optionWidget(0)
{

    QCoreApplication::setOrganizationName("zint");
    QCoreApplication::setOrganizationDomain("zint.org.uk");
    QCoreApplication::setApplicationName("Barcode Studio");

    QSettings settings;

	char bstyle_text[][50] = {
		"Australia Post Redirect Code",
		"Australia Post Reply-Paid",
		"Australia Post Routing Code",
		"Australia Post Standard Customer",
		"Aztec Code (ISO 24778)",
		"Aztec Runes",
		"Channel Code",
		"Codabar",
                "Codablock-F",
		"Code 11",
		"Code 128 (ISO 15417)",
		"Code 16k",
		"Code 2 of 5 Data Logic",
		"Code 2 of 5 IATA",
		"Code 2 of 5 Industrial",
		"Code 2 of 5 Interleaved",
		"Code 2 of 5 Matrix",
		"Code 32 (Italian Pharmacode)",
		"Code 39 (ISO 16388)",
		"Code 39 Extended",
		"Code 49",
		"Code 93",
		"Code One",
		"Data Matrix (ISO 16022)",
		"Deutsche Post Identcode",
		"Deutsche Post Leitcode",
                "DotCode",
		"Dutch Post KIX",
		"EAN-14",
		"European Article Number (EAN)",
		"Facing Identification Mark (FIM)",
		"Flattermarken",
		"Grid Matrix",
		"GS1 DataBar Expanded Omnidirectional",
		"GS1 DataBar Expanded Stacked Omnidirectional",
		"GS1 DataBar Limited",
		"GS1 DataBar Omnidirectional",
		"GS1 DataBar Stacked",
		"GS1 DataBar Stacked Omnidirectional",
		"Han Xin (Chinese Sensible) Code",
                "ITF-14",
		"International Standard Book Number (ISBN)",
		"Japanese Postal Barcode",
		"Korean Postal Barcode",
		"LOGMARS",
		"Maxicode (ISO 16023)",
		"MicroPDF417 (ISO 24728)",
		"Micro QR Code",
		"MSI Plessey",
		"NVE-18",
		"PDF417 (ISO 15438)",
		"Pharmacode",
		"Pharmacode 2-track",
		"Pharma Zentralnummer (PZN)",
		"PLANET",
		"Postnet",
		"QR Code (ISO 18004)",

		"Royal Mail 4-state Barcode",
                "Royal Mail 4-state Mailmark",
		"Telepen",
		"Telepen Numeric",
		"UK Plessey",
                "UPNQR",
		"Universal Product Code (UPC-A)",
		"Universal Product Code (UPC-E)",
		"USPS Intelligent Mail"
	};

	/* createActions();
	createMenus();	*/

        scene = new QGraphicsScene(this);

	setupUi(this);
	view->setScene(scene);

	m_fgcolor=qRgb(settings.value("studio/ink/red", 0).toInt(),
                settings.value("studio/ink/green", 0).toInt(),
                settings.value("studio/ink/blue", 0).toInt());
	m_bgcolor=qRgb(settings.value("studio/paper/red", 0xff).toInt(),
                settings.value("studio/paper/green", 0xff).toInt(),
                settings.value("studio/paper/blue", 0xff).toInt());
	for (int i=0;i<metaObject()->enumerator(0).keyCount();i++) {
		bstyle->addItem(metaObject()->enumerator(0).key(i));
		bstyle->setItemText(i,bstyle_text[i]);
	}
	bstyle->setCurrentIndex(settings.value("studio/symbology", 10).toInt());
        txtData->setText(settings.value("studio/data", "Your Data Here!").toString());
        txtComposite->setText(settings.value("studio/composite_text", "Your Data Here!").toString());
        heightb->setValue(settings.value("studio/appearance/height", 50).toInt());
        bwidth->setValue(settings.value("studio/appearance/border", 50).toInt());
        spnWhitespace->setValue(settings.value("studio/appearance/whitespace", 0).toInt());
        spnScale->setValue(settings.value("studio/appearance/scale", 1.0).toFloat());
        btype->setCurrentIndex(settings.value("studio/appearance/border_type", 0).toInt());
	change_options();
        scene->addItem(&m_bc);
	update_preview();
	connect(bstyle, SIGNAL(currentIndexChanged( int )), SLOT(change_options()));
	connect(bstyle, SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
	connect(heightb, SIGNAL(valueChanged( int )), SLOT(update_preview()));
	connect(bwidth,  SIGNAL(valueChanged( int )), SLOT(update_preview()));
	connect(btype, SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
	connect(txtData, SIGNAL(textChanged( const QString& )), SLOT(update_preview()));
	connect(txtComposite, SIGNAL(textChanged()), SLOT(update_preview()));
	connect(chkComposite, SIGNAL(stateChanged( int )), SLOT(composite_enable()));
	connect(chkComposite, SIGNAL(stateChanged( int )), SLOT(update_preview()));
	connect(cmbCompType, SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
	connect(spnWhitespace, SIGNAL(valueChanged( int )), SLOT(update_preview()));
	connect(btnAbout, SIGNAL(clicked( bool )), SLOT(about()));
	connect(btnSave, SIGNAL(clicked( bool )), SLOT(save()));
	connect(spnScale, SIGNAL(valueChanged( double )), SLOT(change_print_scale()));
	connect(btnExit, SIGNAL(clicked( bool )), SLOT(quit_now()));
	connect(btnReset, SIGNAL(clicked( bool )), SLOT(reset_view()));
	connect(btnMoreData, SIGNAL(clicked( bool )), SLOT(open_data_dialog()));
	connect(btnSequence, SIGNAL(clicked( bool )), SLOT(open_sequence_dialog()));
	connect(chkHRTHide, SIGNAL(stateChanged( int )), SLOT(update_preview()));

    connect(btnCopySVG, SIGNAL(clicked( bool )), SLOT(copy_to_clipboard_svg()));
    connect(btnCopyBMP, SIGNAL(clicked( bool )), SLOT(copy_to_clipboard_bmp()));
}

MainWindow::~MainWindow()
{
    QSettings settings;







|








|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|

<
<
<
|

|
|

|


|


|
|
|
|
|







|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>







30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168

#include "mainwindow.h"
#include "datawindow.h"
#include "sequencewindow.h"
#include <stdio.h>

MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags fl)
        : QWidget(parent, fl),m_optionWidget(0)
{

    QCoreApplication::setOrganizationName("zint");
    QCoreApplication::setOrganizationDomain("zint.org.uk");
    QCoreApplication::setApplicationName("Barcode Studio");

    QSettings settings;

    char bstyle_text[][50] = {
        "Australia Post Redirect Code",
        "Australia Post Reply-Paid",
        "Australia Post Routing Code",
        "Australia Post Standard Customer",
        "Aztec Code (ISO 24778)",
        "Aztec Runes",
        "Channel Code",
        "Codabar",
        "Codablock-F",
        "Code 11",
        "Code 128 (ISO 15417)",
        "Code 16k",
        "Code 2 of 5 Data Logic",
        "Code 2 of 5 IATA",
        "Code 2 of 5 Industrial",
        "Code 2 of 5 Interleaved",
        "Code 2 of 5 Matrix",
        "Code 32 (Italian Pharmacode)",
        "Code 39 (ISO 16388)",
        "Code 39 Extended",
        "Code 49",
        "Code 93",
        "Code One",
        "Data Matrix (ISO 16022)",
        "Deutsche Post Identcode",
        "Deutsche Post Leitcode",
        "DotCode",
        "Dutch Post KIX",
        "EAN-14",
        "European Article Number (EAN)",
        "Facing Identification Mark (FIM)",
        "Flattermarken",
        "Grid Matrix",
        "GS1 DataBar Expanded Omnidirectional",
        "GS1 DataBar Expanded Stacked Omnidirectional",
        "GS1 DataBar Limited",
        "GS1 DataBar Omnidirectional",
        "GS1 DataBar Stacked",
        "GS1 DataBar Stacked Omnidirectional",
        "Han Xin (Chinese Sensible) Code",
        "ITF-14",
        "International Standard Book Number (ISBN)",
        "Japanese Postal Barcode",
        "Korean Postal Barcode",
        "LOGMARS",
        "Maxicode (ISO 16023)",
        "MicroPDF417 (ISO 24728)",
        "Micro QR Code",
        "MSI Plessey",
        "NVE-18",
        "PDF417 (ISO 15438)",
        "Pharmacode",
        "Pharmacode 2-track",
        "Pharma Zentralnummer (PZN)",
        "PLANET",
        "Postnet",
        "QR Code (ISO 18004)",
        "Rectangular Micro QR (rMQR)",
        "Royal Mail 4-state Barcode",
        "Royal Mail 4-state Mailmark",
        "Telepen",
        "Telepen Numeric",
        "UK Plessey",
        "UPNQR",
        "Universal Product Code (UPC-A)",
        "Universal Product Code (UPC-E)",
        "USPS Intelligent Mail"
    };




    scene = new QGraphicsScene(this);

    setupUi(this);
    view->setScene(scene);

    m_fgcolor=qRgb(settings.value("studio/ink/red", 0).toInt(),
                settings.value("studio/ink/green", 0).toInt(),
                settings.value("studio/ink/blue", 0).toInt());
    m_bgcolor=qRgb(settings.value("studio/paper/red", 0xff).toInt(),
                settings.value("studio/paper/green", 0xff).toInt(),
                settings.value("studio/paper/blue", 0xff).toInt());
    for (int i=0;i<metaObject()->enumerator(0).keyCount();i++) {
        bstyle->addItem(metaObject()->enumerator(0).key(i));
        bstyle->setItemText(i,bstyle_text[i]);
    }
    bstyle->setCurrentIndex(settings.value("studio/symbology", 10).toInt());
        txtData->setText(settings.value("studio/data", "Your Data Here!").toString());
        txtComposite->setText(settings.value("studio/composite_text", "Your Data Here!").toString());
        heightb->setValue(settings.value("studio/appearance/height", 50).toInt());
        bwidth->setValue(settings.value("studio/appearance/border", 50).toInt());
        spnWhitespace->setValue(settings.value("studio/appearance/whitespace", 0).toInt());
        spnScale->setValue(settings.value("studio/appearance/scale", 1.0).toFloat());
        btype->setCurrentIndex(settings.value("studio/appearance/border_type", 0).toInt());
    change_options();
        scene->addItem(&m_bc);
    update_preview();
    connect(bstyle, SIGNAL(currentIndexChanged( int )), SLOT(change_options()));
    connect(bstyle, SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
    connect(heightb, SIGNAL(valueChanged( int )), SLOT(update_preview()));
    connect(bwidth,  SIGNAL(valueChanged( int )), SLOT(update_preview()));
    connect(btype, SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
    connect(txtData, SIGNAL(textChanged( const QString& )), SLOT(update_preview()));
    connect(txtComposite, SIGNAL(textChanged()), SLOT(update_preview()));
    connect(chkComposite, SIGNAL(stateChanged( int )), SLOT(composite_enable()));
    connect(chkComposite, SIGNAL(stateChanged( int )), SLOT(update_preview()));
    connect(cmbCompType, SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
    connect(spnWhitespace, SIGNAL(valueChanged( int )), SLOT(update_preview()));
    connect(btnAbout, SIGNAL(clicked( bool )), SLOT(about()));
    connect(btnSave, SIGNAL(clicked( bool )), SLOT(save()));
    connect(spnScale, SIGNAL(valueChanged( double )), SLOT(change_print_scale()));
    connect(btnExit, SIGNAL(clicked( bool )), SLOT(quit_now()));
    connect(btnReset, SIGNAL(clicked( bool )), SLOT(reset_view()));
    connect(btnMoreData, SIGNAL(clicked( bool )), SLOT(open_data_dialog()));
    connect(btnSequence, SIGNAL(clicked( bool )), SLOT(open_sequence_dialog()));
    connect(chkHRTHide, SIGNAL(stateChanged( int )), SLOT(update_preview()));
    connect(chkAutoHeight, SIGNAL(stateChanged( int )), SLOT(autoheight_clicked()));
    connect(btnCopySVG, SIGNAL(clicked( bool )), SLOT(copy_to_clipboard_svg()));
    connect(btnCopyBMP, SIGNAL(clicked( bool )), SLOT(copy_to_clipboard_bmp()));
}

MainWindow::~MainWindow()
{
    QSettings settings;
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329












330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559

















560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972













973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034



1035

1036
1037
1038
1039
1040
1041
1042
1043
1044
{
    QWidget::resizeEvent(event);
    update_preview();
}

void MainWindow::reset_view()
{
	m_fgcolor=qRgb(0,0,0);
	m_bgcolor=qRgb(0xff,0xff,0xff);
	update_preview();
}

bool MainWindow::save()
{
        QSettings settings;
        QFileDialog save_dialog;
        QString filename;
        QString suffix;

        save_dialog.setAcceptMode(QFileDialog::AcceptSave);
        save_dialog.setWindowTitle("Save Barcode Image");
        save_dialog.setDirectory(settings.value("studio/default_dir", QDir::toNativeSeparators(QDir::homePath())).toString());

#ifdef NO_PNG
        suffix = settings.value("studio/default_suffix", "gif").toString();
        save_dialog.setNameFilter(tr("Encapsulated Post Script (*.eps);;Graphics Interchange Format (*.gif);;Scalable Vector Graphic (*.svg);;Windows Bitmap (*.bmp);;ZSoft PC Painter Image (*.pcx);;Extended Metafile (*.emf);;Tagged Image File Format (*.tif)"));
#else
        suffix = settings.value("studio/default_suffix", "png").toString();
        save_dialog.setNameFilter(tr("Portable Network Graphic (*.png);;Encapsulated Post Script (*.eps);;Graphics Interchange Format (*.gif);;Scalable Vector Graphic (*.svg);;Windows Bitmap (*.bmp);;ZSoft PC Painter Image (*.pcx);;Extended Metafile (*.emf);;Tagged Image File Format (*.tif)"));
#endif

        if (QString::compare(suffix, "png", Qt::CaseInsensitive) == 0)
            save_dialog.selectNameFilter("Portable Network Graphic (*.png)");
        if (QString::compare(suffix, "eps", Qt::CaseInsensitive) == 0)
            save_dialog.selectNameFilter("Encapsulated Post Script (*.eps)");
        if (QString::compare(suffix, "gif", Qt::CaseInsensitive) == 0)
            save_dialog.selectNameFilter("Graphics Interchange Format (*.gif)");
        if (QString::compare(suffix, "svg", Qt::CaseInsensitive) == 0)
            save_dialog.selectNameFilter("Scalable Vector Graphic (*.svg)");
        if (QString::compare(suffix, "bmp", Qt::CaseInsensitive) == 0)
            save_dialog.selectNameFilter("Windows Bitmap (*.bmp)");
        if (QString::compare(suffix, "pcx", Qt::CaseInsensitive) == 0)
            save_dialog.selectNameFilter("ZSoft PC Painter Image (*.pcx)");
        if (QString::compare(suffix, "emf", Qt::CaseInsensitive) == 0)
            save_dialog.selectNameFilter("Extended Metafile (*.emf)");
        if (QString::compare(suffix, "tif", Qt::CaseInsensitive) == 0)
            save_dialog.selectNameFilter("Tagged Image File Format (*.tif)");

        if (save_dialog.exec()) {
            filename = save_dialog.selectedFiles().at(0);
            if ((filename.lastIndexOf(".") == -1) || (filename.lastIndexOf(".") < (filename.length() - 5))) {
                suffix = save_dialog.selectedNameFilter();
                suffix = suffix.mid((suffix.lastIndexOf(".") + 1), 3);
                filename.append(".");
                filename.append(suffix);
            } else {
                suffix = filename.right(filename.length() - (filename.lastIndexOf('.') + 1));
            }
        } else {
            return false;
        }

	if(m_bc.bc.save_to_file(filename) == false) {
            if (m_bc.bc.getError() > 4) {
		QMessageBox::critical(this,tr("Save Error"),m_bc.bc.error_message());
                return false;
            } else {
                QMessageBox::warning(this, tr("Save Warning"),m_bc.bc.error_message());
                return true;
            }
	}

        settings.setValue("studio/default_dir", filename.mid(0, filename.lastIndexOf(QDir::separator())));
        settings.setValue("studio/default_suffix", suffix);
	return true;
}

void MainWindow::about()
{
	QMessageBox::about(this, tr("About Zint"),
               tr("<h2>Zint Barcode Studio 2.6.5</h2>"
					   "<p>A free barcode generator"
                       "<p>Instruction manual is available at the project homepage:<br>"
                       "<a href=\"http://www.zint.org.uk\">http://www.zint.org.uk</a>"
                       "<p>Copyright &copy; 2006-2018 Robin Stuart and others.<br>"
                       "Qt back end by BogDan Vatra<br>"
                       "Windows port by Harald Oehlmann</p>"
                       "<p>Qt version " QT_VERSION_STR
					   "<p>With thanks to Norbert Szab&oacute;, Robert Elliott, "
                           "Milton Neal and many others at Sourceforge."
					   "<p>Released under the GNU General Public License ver. 3 or later.<br>"
					   "\"QR Code\" is a Registered Trademark of Denso Corp.<br>"
					   "\"Telepen\" is a Registered Trademark of SB Electronics."
					   "<p><table border=1><tr><td><small>Currently supported standards include:<br>"
					   "EN 797:1996, EN 798:1996, EN 12323:2005, ISO/IEC 15417:2007,<br>"
                       "ISO/IEC 15438:2015, ISO/IEC 16022:2006, ISO/IEC 16023:2000,<br>"
                       "ISO/IEC 16388:2007, ISO/IEC 18004:2015, ISO/IEC 24723:2010,<br>"
					   "ISO/IEC 24724:2011, ISO/IEC 24728:2006, ISO/IEC 24778:2008,<br>"
					   "ISO/IEC 29158:2019, ANSI-HIBC 2.3-2009, ANSI/AIM BC6-2000,<br>"
                       "ANSI/AIM BC12-1998, AIMD014 (v 1.63), USPS-B-3200"
                       "</small></td></tr></table>"

			     ));
}

int MainWindow::open_data_dialog()
{
	int retval;
	DataWindow dlg(txtData->text());
	retval = dlg.exec();
	if (dlg.Valid == 1)
		txtData->setText(dlg.DataOutput);
	return retval;
}

int MainWindow::open_sequence_dialog()
{
	SequenceWindow dlg;
	dlg.barcode = &m_bc;
	return dlg.exec();
}

void MainWindow::on_fgcolor_clicked()
{
    QColor temp = m_fgcolor;
	m_fgcolor=QColorDialog::getColor(m_fgcolor,this,"Set foreground colour");
        if (m_fgcolor.isValid()) {
            update_preview();
        } else {
            m_fgcolor = temp;
        }
}

void MainWindow::on_bgcolor_clicked()
{
    QColor temp = m_bgcolor;
	m_bgcolor=QColorDialog::getColor(m_bgcolor,this,"Set background colour");
        if (m_bgcolor.isValid()) {
            update_preview();
        } else {
            m_bgcolor = temp;
        }












}

void MainWindow::change_print_scale()
{
	/* This value is only used when printing (saving) to file */
	m_bc.bc.setScale((float)spnScale->value());
}

void MainWindow::quit_now()
{
	close();
}

void MainWindow::copy_to_clipboard_svg()
{
    QClipboard *clipboard = QGuiApplication::clipboard();
    QMimeData *data = new QMimeData;
    QString filename = ".zint.svg";
    double scale = spnScale->value();

    spnScale->setValue(5);

    if (!m_bc.bc.save_to_file(filename)) {
            return;
    }

    data->setImageData(QImage(filename));
    clipboard->setMimeData(data, QClipboard::Clipboard);

    QFile::remove(filename);

    spnScale->setValue(scale);
}

void MainWindow::copy_to_clipboard_bmp()
{
    QClipboard *clipboard = QGuiApplication::clipboard();
    QMimeData *data = new QMimeData;
    QString filename = ".zint.bmp";

    if (!m_bc.bc.save_to_file(filename)) {
            return;
    }

    data->setImageData(QImage(filename));
    clipboard->setMimeData(data, QClipboard::Clipboard);

    QFile::remove(filename);
}

void MainWindow::change_options()
{
	QUiLoader uiload;

	if (tabMain->count()==3)
		tabMain->removeTab(1);

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODE128)
	{
		QFile file(":/grpC128.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Code 128"));
		chkComposite->setText(tr("Add 2D Component (GS1-128 only)"));
		connect(m_optionWidget->findChild<QObject*>("radC128EAN"), SIGNAL(toggled( bool )), SLOT(composite_ean_check()));
		connect(m_optionWidget->findChild<QObject*>("radC128Stand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radC128CSup"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radC128EAN"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radC128HIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
	}
	else
		chkComposite->setText(tr("Add 2D Component"));


	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_PDF417)
	{
		QFile file(":/grpPDF417.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("PDF417"));
		connect(m_optionWidget->findChild<QObject*>("codewords"),  SIGNAL(valueChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbPDFECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbPDFCols"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radPDFTruncated"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radPDFStand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radPDFHIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_MICROPDF417)
	{
		QFile file(":/grpMicroPDF.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Micro PDF417"));
		connect(m_optionWidget->findChild<QObject*>("cmbMPDFCols"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radMPDFStand"), SIGNAL(toggled( bool )), SLOT(update_preview()));
	}

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_DOTCODE)
    {
        QFile file(":/grpDotCode.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("DotCode"));
        connect(m_optionWidget->findChild<QObject*>("cmbDotCols"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radDotStan"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radDotGs1"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("txtDotSize"), SIGNAL(textChanged( QString )), SLOT(update_preview()));
    }

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_AZTEC)
	{
		QFile file(":/grpAztec.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Aztec Code"));
		connect(m_optionWidget->findChild<QObject*>("radAztecAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radAztecSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radAztecECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbAztecSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbAztecECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radAztecStand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radAztecGS1"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radAztecHIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_MSI_PLESSEY)
	{
		QFile file(":/grpMSICheck.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("MSI Plessey"));
		connect(m_optionWidget->findChild<QObject*>("cmbMSICheck"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
	}

	if((metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODE39) ||
		(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_EXCODE39))
	{
		QFile file(":/grpC39.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Code 39"));
		connect(m_optionWidget->findChild<QObject*>("radC39Stand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radC39Check"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radC39HIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_EXCODE39)
		{
			if(m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->isChecked() == true)
			{
				m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->setChecked(false);
				m_optionWidget->findChild<QRadioButton*>("radC39Stand")->setChecked(true);
			}
			m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->setEnabled(false);
		}
		else
			m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->setEnabled(true);
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODE16K)
	{
		QFile file(":/grpC16k.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Code 16K"));
		connect(m_optionWidget->findChild<QObject*>("radC16kStand"), SIGNAL(toggled( bool )), SLOT(update_preview()));
	}

        if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODABLOCKF)
        {
                QFile file (":/grpCodablockF.ui");
                if (!file.open(QIODevice::ReadOnly))
                    return;
                m_optionWidget=uiload.load(&file);
                file.close();
                tabMain->insertTab(1,m_optionWidget,tr("Codablock-F"));
                connect(m_optionWidget->findChild<QObject*>("radCbfAutosize"), SIGNAL(toggled( bool )), SLOT(update_preview()));
                connect(m_optionWidget->findChild<QObject*>("radCbfSetWidth"), SIGNAL(toggled( bool )), SLOT(update_preview()));
                connect(m_optionWidget->findChild<QObject*>("radCbfSetHeight"), SIGNAL(toggled( bool )), SLOT(update_preview()));
                connect(m_optionWidget->findChild<QObject*>("cmbCbfWidth"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
                connect(m_optionWidget->findChild<QObject*>("cmbCbfHeight"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        }

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_DATAMATRIX)
	{
		QFile file(":/grpDM.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Data Matrix"));
		connect(m_optionWidget->findChild<QObject*>("radDM200Stand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radDM200GS1"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radDM200HIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbDM200Size"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("chkDMRectangle"), SIGNAL(stateChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("chkDMRE"), SIGNAL(stateChanged( int )), SLOT(update_preview()));
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_QRCODE)
	{
		QFile file(":/grpQR.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("QR Code"));
		connect(m_optionWidget->findChild<QObject*>("radQRAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radQRSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radQRECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbQRSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbQRECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radQRStand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radQRGS1"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radQRHIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));

















	}

        if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_HANXIN)
        {
                QFile file (":/grpHX.ui");
                if (!file.open(QIODevice::ReadOnly))
                    return;
                m_optionWidget=uiload.load(&file);
                file.close();
                tabMain->insertTab(1,m_optionWidget,tr("Han Xin Code"));
                connect(m_optionWidget->findChild<QObject*>("radHXAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
                connect(m_optionWidget->findChild<QObject*>("radHXSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
                connect(m_optionWidget->findChild<QObject*>("radHXECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
                connect(m_optionWidget->findChild<QObject*>("cmbHXSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
                connect(m_optionWidget->findChild<QObject*>("cmbHXECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        }

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_MICROQR)
	{
		QFile file(":/grpMQR.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Micro QR Code"));
		connect(m_optionWidget->findChild<QObject*>("radMQRAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radMQRSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radMQRECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbMQRSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbMQRECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_GRIDMATRIX)
	{
		QFile file(":/grpGrid.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Grid Matrix"));
		connect(m_optionWidget->findChild<QObject*>("radGridAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radGridSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radGridECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbGridSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbGridECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_MAXICODE)
	{
		QFile file(":/grpMaxicode.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Maxicode"));
		connect(m_optionWidget->findChild<QObject*>("cmbMaxiMode"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("cmbMaxiMode"), SIGNAL(currentIndexChanged( int )), SLOT(maxi_primary()));
		connect(m_optionWidget->findChild<QObject*>("txtMaxiPrimary"), SIGNAL(textChanged( const QString& )), SLOT(update_preview()));
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CHANNEL)
	{
		QFile file(":/grpChannel.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Channel Code"));
		connect(m_optionWidget->findChild<QObject*>("cmbChannel"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODEONE)
	{
		QFile file(":/grpCodeOne.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Code One"));
		connect(m_optionWidget->findChild<QObject*>("cmbC1Size"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
		connect(m_optionWidget->findChild<QObject*>("radC1GS1"), SIGNAL(toggled( bool )), SLOT(update_preview()));
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODE49)
	{
		QFile file(":/grpC49.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("Code 49"));
		connect(m_optionWidget->findChild<QObject*>("radC49GS1"), SIGNAL(toggled( bool )), SLOT(update_preview()));
	}

	if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_RSS_EXPSTACK)
	{
		QFile file(":/grpDBExtend.ui");
		if (!file.open(QIODevice::ReadOnly))
			return;
		m_optionWidget=uiload.load(&file);
		file.close();
		tabMain->insertTab(1,m_optionWidget,tr("GS1 DataBar Stacked"));
		connect(m_optionWidget->findChild<QObject*>("cmbCols"), SIGNAL(currentIndexChanged ( int )), SLOT(update_preview()));
	}

	switch(metaObject()->enumerator(0).value(bstyle->currentIndex()))
	{
		case BARCODE_CODE128:
		case BARCODE_EANX:
		case BARCODE_UPCA:
		case BARCODE_UPCE:
		case BARCODE_RSS14:
		case BARCODE_RSS_LTD:
		case BARCODE_RSS_EXP:
		case BARCODE_RSS14STACK:
		case BARCODE_RSS14STACK_OMNI:
		case BARCODE_RSS_EXPSTACK:
			grpComposite->show();
			break;
		default:
			chkComposite->setChecked(false);
			grpComposite->hide();
			break;
	}
	tabMain->setCurrentIndex(0);
}

void MainWindow::composite_enable()
{
	if(chkComposite->isChecked() == true)
	{
		lblCompType->setEnabled(true);
		cmbCompType->setEnabled(true);
		lblComposite->setEnabled(true);
		txtComposite->setEnabled(true);
		if (metaObject()->enumerator(0).value(bstyle->currentIndex())==BARCODE_CODE128)
			m_optionWidget->findChild<QRadioButton*>("radC128EAN")->setChecked(true);
	}
	else
	{
		lblCompType->setEnabled(false);
		cmbCompType->setEnabled(false);
		lblComposite->setEnabled(false);
		txtComposite->setEnabled(false);
	}
}

void MainWindow::composite_ean_check()
{
	if (metaObject()->enumerator(0).value(bstyle->currentIndex())!=BARCODE_CODE128)
		return;
	if(!m_optionWidget->findChild<QRadioButton*>("radC128EAN")->isChecked())
		chkComposite->setChecked(false);
}

void MainWindow::maxi_primary()
{
	if (metaObject()->enumerator(0).value(bstyle->currentIndex())!=BARCODE_MAXICODE)
		return;
	if(m_optionWidget->findChild<QComboBox*>("cmbMaxiMode")->currentIndex() == 0) {
		m_optionWidget->findChild<QLabel*>("lblMaxiPrimary")->setEnabled(true);
		m_optionWidget->findChild<QLineEdit*>("txtMaxiPrimary")->setEnabled(true);
	} else {
		m_optionWidget->findChild<QLabel*>("lblMaxiPrimary")->setEnabled(false);
		m_optionWidget->findChild<QLineEdit*>("txtMaxiPrimary")->setEnabled(false);
	}
}

void MainWindow::update_preview()
{
        int width = view->geometry().width();
        int height = view->geometry().height();

	//m_bc.ar=(Zint::QZint::AspectRatioMode)1;
	if(chkComposite->isChecked() == true) {
		m_bc.bc.setPrimaryMessage(txtData->text());
		m_bc.bc.setText(txtComposite->toPlainText());
	} else {
		m_bc.bc.setText(txtData->text());
		/*m_bc.bc.setPrimaryMessage(txtComposite->text());*/
	}
	m_bc.bc.setSecurityLevel(0);
	m_bc.bc.setWidth(0);
	m_bc.bc.setInputMode(UNICODE_MODE);
	m_bc.bc.setHideText(0);
	if(chkHRTHide->isChecked() == false) {
		m_bc.bc.setHideText(1);
	}
	switch(metaObject()->enumerator(0).value(bstyle->currentIndex()))
	{
		case BARCODE_CODE128:
			if(m_optionWidget->findChild<QRadioButton*>("radC128Stand")->isChecked())
				m_bc.bc.setSymbol(BARCODE_CODE128);

			if(m_optionWidget->findChild<QRadioButton*>("radC128CSup")->isChecked())
				m_bc.bc.setSymbol(BARCODE_CODE128B);

			if(m_optionWidget->findChild<QRadioButton*>("radC128EAN")->isChecked())
			{
				if(chkComposite->isChecked())
					m_bc.bc.setSymbol(BARCODE_EAN128_CC);
				else
					m_bc.bc.setSymbol(BARCODE_EAN128);
			}

			if(m_optionWidget->findChild<QRadioButton*>("radC128HIBC")->isChecked())
				m_bc.bc.setSymbol(BARCODE_HIBC_128);
			break;

		case BARCODE_EANX:
			if(chkComposite->isChecked())
				m_bc.bc.setSymbol(BARCODE_EANX_CC);
			else
				m_bc.bc.setSymbol(BARCODE_EANX);
			break;

		case BARCODE_UPCA:
			if(chkComposite->isChecked())
				m_bc.bc.setSymbol(BARCODE_UPCA_CC);
			else
				m_bc.bc.setSymbol(BARCODE_UPCA);
			break;

		case BARCODE_UPCE:
			if(chkComposite->isChecked())
				m_bc.bc.setSymbol(BARCODE_UPCE_CC);
			else
				m_bc.bc.setSymbol(BARCODE_UPCE);
			break;

		case BARCODE_RSS14:
			if(chkComposite->isChecked())
				m_bc.bc.setSymbol(BARCODE_RSS14_CC);
			else
				m_bc.bc.setSymbol(BARCODE_RSS14);
			break;

		case BARCODE_RSS_LTD:
			if(chkComposite->isChecked())
				m_bc.bc.setSymbol(BARCODE_RSS_LTD_CC);
			else
				m_bc.bc.setSymbol(BARCODE_RSS_LTD);
			break;

		case BARCODE_RSS_EXP:
			if(chkComposite->isChecked())
				m_bc.bc.setSymbol(BARCODE_RSS_EXP_CC);
			else
				m_bc.bc.setSymbol(BARCODE_RSS_EXP);
			break;

		case BARCODE_RSS14STACK:
			if(chkComposite->isChecked())
				m_bc.bc.setSymbol(BARCODE_RSS14STACK_CC);
			else
				m_bc.bc.setSymbol(BARCODE_RSS14STACK);
			break;

		case BARCODE_RSS14STACK_OMNI:
			if(chkComposite->isChecked())
				m_bc.bc.setSymbol(BARCODE_RSS14_OMNI_CC);
			else
				m_bc.bc.setSymbol(BARCODE_RSS14STACK_OMNI);
			break;

		case BARCODE_RSS_EXPSTACK:
			if(chkComposite->isChecked())
				m_bc.bc.setSymbol(BARCODE_RSS_EXPSTACK_CC);
			else
				m_bc.bc.setSymbol(BARCODE_RSS_EXPSTACK);

			if(m_optionWidget->findChild<QComboBox*>("cmbCols")->currentIndex() != 0)
				m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbCols")->currentIndex());
			break;

		case BARCODE_PDF417:
			m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbPDFCols")->currentIndex());
			m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbPDFECC")->currentIndex()-1);
			m_bc.bc.setPdf417CodeWords(m_optionWidget->findChild<QSpinBox*>("codewords")->value());
			if(m_optionWidget->findChild<QRadioButton*>("radPDFStand")->isChecked())
				m_bc.bc.setSymbol(BARCODE_PDF417);

			if(m_optionWidget->findChild<QRadioButton*>("radPDFTruncated")->isChecked())
				m_bc.bc.setSymbol(BARCODE_PDF417TRUNC);

			if(m_optionWidget->findChild<QRadioButton*>("radPDFHIBC")->isChecked())
				m_bc.bc.setSymbol(BARCODE_HIBC_PDF);
			break;

		case BARCODE_MICROPDF417:
			m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbMPDFCols")->currentIndex());
			if(m_optionWidget->findChild<QRadioButton*>("radMPDFStand")->isChecked())
				m_bc.bc.setSymbol(BARCODE_MICROPDF417);

			if(m_optionWidget->findChild<QRadioButton*>("radMPDFHIBC")->isChecked())
				m_bc.bc.setSymbol(BARCODE_HIBC_MICPDF);
			break;

        case BARCODE_DOTCODE:
            m_bc.bc.setSymbol(BARCODE_DOTCODE);
            m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbDotCols")->currentIndex());
            if(m_optionWidget->findChild<QRadioButton*>("radDotGs1")->isChecked())
                m_bc.bc.setInputMode(GS1_MODE);
            m_bc.bc.setDotSize(m_optionWidget->findChild<QLineEdit*>("txtDotSize")->text().toFloat());
            break;

		case BARCODE_AZTEC:
			m_bc.bc.setSymbol(BARCODE_AZTEC);
			if(m_optionWidget->findChild<QRadioButton*>("radAztecSize")->isChecked())
				m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbAztecSize")->currentIndex() + 1);

			if(m_optionWidget->findChild<QRadioButton*>("radAztecECC")->isChecked())
				m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbAztecECC")->currentIndex() + 1);

			if(m_optionWidget->findChild<QRadioButton*>("radAztecGS1")->isChecked())
				m_bc.bc.setInputMode(GS1_MODE);
			if(m_optionWidget->findChild<QRadioButton*>("radAztecHIBC")->isChecked())
				m_bc.bc.setSymbol(BARCODE_HIBC_AZTEC);
			break;

		case BARCODE_MSI_PLESSEY:
			m_bc.bc.setSymbol(BARCODE_MSI_PLESSEY);
			m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbMSICheck")->currentIndex());
			break;

		case BARCODE_CODE39:
			if(m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->isChecked())
				m_bc.bc.setSymbol(BARCODE_HIBC_39);
			else
			{
				m_bc.bc.setSymbol(BARCODE_CODE39);
				if(m_optionWidget->findChild<QRadioButton*>("radC39Check")->isChecked())
					m_bc.bc.setWidth(1);
			}
			break;

		case BARCODE_EXCODE39:
			m_bc.bc.setSymbol(BARCODE_EXCODE39);
			if(m_optionWidget->findChild<QRadioButton*>("radC39Check")->isChecked())
				m_bc.bc.setWidth(1);

			break;
		case BARCODE_CODE16K:
			m_bc.bc.setSymbol(BARCODE_CODE16K);
			if(m_optionWidget->findChild<QRadioButton*>("radC16kStand")->isChecked())
				m_bc.bc.setInputMode(UNICODE_MODE);
			else
				m_bc.bc.setInputMode(GS1_MODE);
			break;

            case BARCODE_CODABLOCKF:
                m_bc.bc.setSymbol(BARCODE_CODABLOCKF);
                if(m_optionWidget->findChild<QRadioButton*>("radCbfSetWidth")->isChecked())
                    m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbCbfWidth")->currentIndex() + 6);
                // Height selection uses option 1 in zint_symbol
                if(m_optionWidget->findChild<QRadioButton*>("radCbfSetHeight")->isChecked())
                    m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbCbfHeight")->currentIndex() + 1);
                break;

		case BARCODE_DATAMATRIX:
			m_bc.bc.setSecurityLevel(1);
			if(m_optionWidget->findChild<QRadioButton*>("radDM200HIBC")->isChecked())
				m_bc.bc.setSymbol(BARCODE_HIBC_DM);
			else
				m_bc.bc.setSymbol(BARCODE_DATAMATRIX);

			if(m_optionWidget->findChild<QRadioButton*>("radDM200GS1")->isChecked())
				m_bc.bc.setInputMode(GS1_MODE);

			m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbDM200Size")->currentIndex());
                        
                        if (m_optionWidget->findChild<QComboBox*>("cmbDM200Size")->currentIndex() == 0) {
                            // Supressing rectangles or allowing DMRE only makes sense if in automatic size mode
                            findChild<QCheckBox*>("chkDMRectangle")->setEnabled(true);
                            findChild<QCheckBox*>("chkDMRE")->setEnabled(true);
                            if(m_optionWidget->findChild<QCheckBox*>("chkDMRectangle")->isChecked())
                                    m_bc.bc.setOption3(DM_SQUARE);
                            else {
                                    if(m_optionWidget->findChild<QCheckBox*>("chkDMRE")->isChecked())
                                            m_bc.bc.setOption3(DM_DMRE);
                                    else
                                            m_bc.bc.setOption3(0);
                            }
                        } else {
                            findChild<QCheckBox*>("chkDMRectangle")->setEnabled(false);
                            findChild<QCheckBox*>("chkDMRE")->setEnabled(false);
                            m_bc.bc.setOption3(0);
                        }
			break;

		case BARCODE_QRCODE:
			if(m_optionWidget->findChild<QRadioButton*>("radQRHIBC")->isChecked())
				m_bc.bc.setSymbol(BARCODE_HIBC_QR);
			else
				m_bc.bc.setSymbol(BARCODE_QRCODE);

			if(m_optionWidget->findChild<QRadioButton*>("radQRGS1")->isChecked())
				m_bc.bc.setInputMode(GS1_MODE);

			if(m_optionWidget->findChild<QRadioButton*>("radQRSize")->isChecked())
				m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbQRSize")->currentIndex() + 1);

			if(m_optionWidget->findChild<QRadioButton*>("radQRECC")->isChecked())
				m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbQRECC")->currentIndex() + 1);
			break;

		case BARCODE_MICROQR:
			m_bc.bc.setSymbol(BARCODE_MICROQR);
			if(m_optionWidget->findChild<QRadioButton*>("radMQRSize")->isChecked())
				m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbMQRSize")->currentIndex() + 1);

			if(m_optionWidget->findChild<QRadioButton*>("radMQRECC")->isChecked())
				m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbMQRECC")->currentIndex() + 1);













			break;

		case BARCODE_GRIDMATRIX:
			m_bc.bc.setSymbol(BARCODE_GRIDMATRIX);
			if(m_optionWidget->findChild<QRadioButton*>("radGridSize")->isChecked())
				m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbGridSize")->currentIndex() + 1);

			if(m_optionWidget->findChild<QRadioButton*>("radGridECC")->isChecked())
				m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbGridECC")->currentIndex() + 1);
			break;

		case BARCODE_MAXICODE:
			m_bc.bc.setSymbol(BARCODE_MAXICODE);
			if(m_optionWidget->findChild<QComboBox*>("cmbMaxiMode")->currentIndex() == 0)
			{
				m_bc.bc.setSecurityLevel(2);
				m_bc.bc.setPrimaryMessage(m_optionWidget->findChild<QLineEdit*>("txtMaxiPrimary")->text());
			}
			else
				m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbMaxiMode")->currentIndex() + 3);
			break;

		case BARCODE_CHANNEL:
			m_bc.bc.setSymbol(BARCODE_CHANNEL);
			if(m_optionWidget->findChild<QComboBox*>("cmbChannel")->currentIndex() == 0)
				m_bc.bc.setWidth(0);
			else
				m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbChannel")->currentIndex() + 2);
			break;

		case BARCODE_CODEONE:
			m_bc.bc.setSymbol(BARCODE_CODEONE);
			if(m_optionWidget->findChild<QRadioButton*>("radC1GS1")->isChecked())
				m_bc.bc.setInputMode(GS1_MODE);
			m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbC1Size")->currentIndex());
			break;

		case BARCODE_CODE49:
			m_bc.bc.setSymbol(BARCODE_CODE49);
			if(m_optionWidget->findChild<QRadioButton*>("radC49GS1")->isChecked())
				m_bc.bc.setInputMode(GS1_MODE);
			break;

                case BARCODE_HANXIN:
                        m_bc.bc.setSymbol(BARCODE_HANXIN);
			if(m_optionWidget->findChild<QRadioButton*>("radHXSize")->isChecked())
				m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbHXSize")->currentIndex() + 1);

			if(m_optionWidget->findChild<QRadioButton*>("radHXECC")->isChecked())
				m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbHXECC")->currentIndex() + 1);
                        break;

		default:
			m_bc.bc.setSymbol(metaObject()->enumerator(0).value(bstyle->currentIndex()));
			break;
	}

	if(chkComposite->isChecked())
		m_bc.bc.setSecurityLevel(cmbCompType->currentIndex());

	m_bc.bc.setBorderType((Zint::QZint::BorderType)(btype->currentIndex()*2));
	m_bc.bc.setBorderWidth(bwidth->value());



	m_bc.bc.setHeight(heightb->value());

	m_bc.bc.setWhitespace(spnWhitespace->value());
	m_bc.bc.setFgColor(m_fgcolor);
	m_bc.bc.setBgColor(m_bgcolor);
        m_bc.setSize(width - 10, height - 10);
	m_bc.update();
        scene->setSceneRect(0, 0, width - 10, height - 10);
        scene->update();
}








|
|
|




|
|
|
|

|
|
|


|
|

|
|


|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|

|

|





|



|




|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<




|
|
|
|
|
|




|
|
|





|
|
|
|
|
|





|
|
|
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>




|
|




|












|

















|










|

|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

<
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|















|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|




|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|




|
|
|
|




|
|
|
|
|
|
|
|
|




|
|

|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|

|
|
|
|
|
|
|

|
|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|

|
|
|

|
|
|
<
|
|

|
|

|
|
|

|
|
|
|

|
|
|









|
|
|
|

|
|

|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|










|
|
|
|
|
|

|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|

|
|

|
|

|
|
|

|
|
|
|

|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
|

|
|
|
|

|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|

|
|
|
|
|
|

|
|
|
|
|

|
|
|
|

|
|
|

|
|
|
|

|
|

|
|
>
>
>
|
>
|
|
|
|
|
|
|

<
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287


288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413

414
415
416
417
418
419
420
421

422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762

763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860

861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082

{
    QWidget::resizeEvent(event);
    update_preview();
}

void MainWindow::reset_view()
{
    m_fgcolor=qRgb(0,0,0);
    m_bgcolor=qRgb(0xff,0xff,0xff);
    update_preview();
}

bool MainWindow::save()
{
    QSettings settings;
    QFileDialog save_dialog;
    QString filename;
    QString suffix;

    save_dialog.setAcceptMode(QFileDialog::AcceptSave);
    save_dialog.setWindowTitle("Save Barcode Image");
    save_dialog.setDirectory(settings.value("studio/default_dir", QDir::toNativeSeparators(QDir::homePath())).toString());

#ifdef NO_PNG
    suffix = settings.value("studio/default_suffix", "gif").toString();
    save_dialog.setNameFilter(tr("Encapsulated Post Script (*.eps);;Graphics Interchange Format (*.gif);;Scalable Vector Graphic (*.svg);;Windows Bitmap (*.bmp);;ZSoft PC Painter Image (*.pcx);;Extended Metafile (*.emf);;Tagged Image File Format (*.tif)"));
#else
    suffix = settings.value("studio/default_suffix", "png").toString();
    save_dialog.setNameFilter(tr("Portable Network Graphic (*.png);;Encapsulated Post Script (*.eps);;Graphics Interchange Format (*.gif);;Scalable Vector Graphic (*.svg);;Windows Bitmap (*.bmp);;ZSoft PC Painter Image (*.pcx);;Extended Metafile (*.emf);;Tagged Image File Format (*.tif)"));
#endif

    if (QString::compare(suffix, "png", Qt::CaseInsensitive) == 0)
        save_dialog.selectNameFilter("Portable Network Graphic (*.png)");
    if (QString::compare(suffix, "eps", Qt::CaseInsensitive) == 0)
        save_dialog.selectNameFilter("Encapsulated Post Script (*.eps)");
    if (QString::compare(suffix, "gif", Qt::CaseInsensitive) == 0)
        save_dialog.selectNameFilter("Graphics Interchange Format (*.gif)");
    if (QString::compare(suffix, "svg", Qt::CaseInsensitive) == 0)
        save_dialog.selectNameFilter("Scalable Vector Graphic (*.svg)");
    if (QString::compare(suffix, "bmp", Qt::CaseInsensitive) == 0)
        save_dialog.selectNameFilter("Windows Bitmap (*.bmp)");
    if (QString::compare(suffix, "pcx", Qt::CaseInsensitive) == 0)
        save_dialog.selectNameFilter("ZSoft PC Painter Image (*.pcx)");
    if (QString::compare(suffix, "emf", Qt::CaseInsensitive) == 0)
        save_dialog.selectNameFilter("Extended Metafile (*.emf)");
    if (QString::compare(suffix, "tif", Qt::CaseInsensitive) == 0)
        save_dialog.selectNameFilter("Tagged Image File Format (*.tif)");

    if (save_dialog.exec()) {
        filename = save_dialog.selectedFiles().at(0);
        if ((filename.lastIndexOf(".") == -1) || (filename.lastIndexOf(".") < (filename.length() - 5))) {
            suffix = save_dialog.selectedNameFilter();
            suffix = suffix.mid((suffix.lastIndexOf(".") + 1), 3);
            filename.append(".");
            filename.append(suffix);
        } else {
            suffix = filename.right(filename.length() - (filename.lastIndexOf('.') + 1));
        }
    } else {
        return false;
    }

    if(m_bc.bc.save_to_file(filename) == false) {
            if (m_bc.bc.getError() > 4) {
        QMessageBox::critical(this,tr("Save Error"),m_bc.bc.error_message());
                return false;
            } else {
                QMessageBox::warning(this, tr("Save Warning"),m_bc.bc.error_message());
                return true;
            }
    }

        settings.setValue("studio/default_dir", filename.mid(0, filename.lastIndexOf(QDir::separator())));
        settings.setValue("studio/default_suffix", suffix);
    return true;
}

void MainWindow::about()
{
    QMessageBox::about(this, tr("About Zint"),
       tr("<h2>Zint Barcode Studio 2.7.0</h2>"
           "<p>A free barcode generator"
           "<p>Instruction manual is available at the project homepage:<br>"
           "<a href=\"http://www.zint.org.uk\">http://www.zint.org.uk</a>"
           "<p>Copyright &copy; 2006-2018 Robin Stuart and others.<br>"
           "Qt back end by BogDan Vatra<br>"
           "Windows port by Harald Oehlmann</p>"
           "<p>Qt version " QT_VERSION_STR
           "<p>With thanks to Norbert Szab&oacute;, Robert Elliott, "
               "Milton Neal and many others at Sourceforge."
           "<p>Released under the GNU General Public License ver. 3 or later.<br>"
           "\"QR Code\" is a Registered Trademark of Denso Corp.<br>"
           "\"Telepen\" is a Registered Trademark of SB Electronics."
           "<p><table border=1><tr><td><small>Currently supported standards include:<br>"
           "EN 797:1996, EN 798:1996, EN 12323:2005, ISO/IEC 15417:2007,<br>"
           "ISO/IEC 15438:2015, ISO/IEC 16022:2006, ISO/IEC 16023:2000,<br>"
           "ISO/IEC 16388:2007, ISO/IEC 18004:2015, ISO/IEC 24723:2010,<br>"
           "ISO/IEC 24724:2011, ISO/IEC 24728:2006, ISO/IEC 24778:2008,<br>"
           "ISO/IEC 21471:2019, ANSI-HIBC 2.3-2009, ANSI/AIM BC6-2000,<br>"
           "ANSI/AIM BC12-1998, AIMD014 (v 1.63), USPS-B-3200"
           "</small></td></tr></table>"));


}

int MainWindow::open_data_dialog()
{
    int retval;
    DataWindow dlg(txtData->text());
    retval = dlg.exec();
    if (dlg.Valid == 1)
        txtData->setText(dlg.DataOutput);
    return retval;
}

int MainWindow::open_sequence_dialog()
{
    SequenceWindow dlg;
    dlg.barcode = &m_bc;
    return dlg.exec();
}

void MainWindow::on_fgcolor_clicked()
{
    QColor temp = m_fgcolor;
    m_fgcolor=QColorDialog::getColor(m_fgcolor,this,"Set foreground colour");
    if (m_fgcolor.isValid()) {
        update_preview();
    } else {
        m_fgcolor = temp;
    }
}

void MainWindow::on_bgcolor_clicked()
{
    QColor temp = m_bgcolor;
    m_bgcolor=QColorDialog::getColor(m_bgcolor,this,"Set background colour");
    if (m_bgcolor.isValid()) {
        update_preview();
    } else {
        m_bgcolor = temp;
    }
}

void MainWindow::autoheight_clicked()
{
    if (chkAutoHeight->isChecked()) {
        lblHeight->setEnabled(false);
        heightb->setEnabled(false);
    } else {
        lblHeight->setEnabled(true);
        heightb->setEnabled(true);
    }
    update_preview();
}

void MainWindow::change_print_scale()
{
    /* This value is only used when printing (saving) to file */
    m_bc.bc.setScale((float)spnScale->value());
}

void MainWindow::quit_now()
{
    close();
}

void MainWindow::copy_to_clipboard_svg()
{
    QClipboard *clipboard = QGuiApplication::clipboard();
    QMimeData *data = new QMimeData;
    QString filename = ".zint.svg";
    double scale = spnScale->value();

    spnScale->setValue(5);

    if (!m_bc.bc.save_to_file(filename)) {
        return;
    }

    data->setImageData(QImage(filename));
    clipboard->setMimeData(data, QClipboard::Clipboard);

    QFile::remove(filename);

    spnScale->setValue(scale);
}

void MainWindow::copy_to_clipboard_bmp()
{
    QClipboard *clipboard = QGuiApplication::clipboard();
    QMimeData *data = new QMimeData;
    QString filename = ".zint.bmp";

    if (!m_bc.bc.save_to_file(filename)) {
        return;
    }

    data->setImageData(QImage(filename));
    clipboard->setMimeData(data, QClipboard::Clipboard);

    QFile::remove(filename);
}

void MainWindow::change_options()
{
    QUiLoader uiload;

    if (tabMain->count()==3)
        tabMain->removeTab(1);

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODE128)
    {
        QFile file(":/grpC128.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Code 128"));
        chkComposite->setText(tr("Add 2D Component (GS1-128 only)"));
        connect(m_optionWidget->findChild<QObject*>("radC128EAN"), SIGNAL(toggled( bool )), SLOT(composite_ean_check()));
        connect(m_optionWidget->findChild<QObject*>("radC128Stand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radC128CSup"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radC128EAN"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radC128HIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
    }
    else
        chkComposite->setText(tr("Add 2D Component"));


    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_PDF417)
    {
        QFile file(":/grpPDF417.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("PDF417"));

        connect(m_optionWidget->findChild<QObject*>("cmbPDFECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbPDFCols"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radPDFTruncated"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radPDFStand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radPDFHIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_MICROPDF417)
    {
        QFile file(":/grpMicroPDF.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Micro PDF417"));
        connect(m_optionWidget->findChild<QObject*>("cmbMPDFCols"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radMPDFStand"), SIGNAL(toggled( bool )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_DOTCODE)
    {
        QFile file(":/grpDotCode.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("DotCode"));
        connect(m_optionWidget->findChild<QObject*>("cmbDotCols"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radDotStan"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radDotGs1"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("txtDotSize"), SIGNAL(textChanged( QString )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_AZTEC)
    {
        QFile file(":/grpAztec.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Aztec Code"));
        connect(m_optionWidget->findChild<QObject*>("radAztecAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radAztecSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radAztecECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbAztecSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbAztecECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radAztecStand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radAztecGS1"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radAztecHIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_MSI_PLESSEY)
    {
        QFile file(":/grpMSICheck.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("MSI Plessey"));
        connect(m_optionWidget->findChild<QObject*>("cmbMSICheck"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
    }

    if((metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODE39) ||
        (metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_EXCODE39))
    {
        QFile file(":/grpC39.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Code 39"));
        connect(m_optionWidget->findChild<QObject*>("radC39Stand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radC39Check"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radC39HIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_EXCODE39)
        {
            if(m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->isChecked() == true)
            {
                m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->setChecked(false);
                m_optionWidget->findChild<QRadioButton*>("radC39Stand")->setChecked(true);
            }
            m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->setEnabled(false);
        }
        else
            m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->setEnabled(true);
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODE16K)
    {
        QFile file(":/grpC16k.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Code 16K"));
        connect(m_optionWidget->findChild<QObject*>("radC16kStand"), SIGNAL(toggled( bool )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODABLOCKF)
    {
        QFile file (":/grpCodablockF.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Codablock-F"));
        connect(m_optionWidget->findChild<QObject*>("radCbfAutosize"), SIGNAL(toggled( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radCbfSetWidth"), SIGNAL(toggled( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radCbfSetHeight"), SIGNAL(toggled( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbCbfWidth"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbCbfHeight"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_DATAMATRIX)
    {
        QFile file(":/grpDM.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Data Matrix"));
        connect(m_optionWidget->findChild<QObject*>("radDM200Stand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radDM200GS1"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radDM200HIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbDM200Size"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("chkDMRectangle"), SIGNAL(stateChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("chkDMRE"), SIGNAL(stateChanged( int )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_QRCODE)
    {
        QFile file(":/grpQR.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("QR Code"));
        connect(m_optionWidget->findChild<QObject*>("radQRAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radQRSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radQRECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbQRSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbQRECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radQRStand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radQRGS1"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radQRHIBC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_RMQR)
    {
        QFile file(":/grpRMQR.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("rMQR Code"));
        connect(m_optionWidget->findChild<QObject*>("radRMQRAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radRMQRSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radRMQRECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbRMQRSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbRMQRECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radRMQRStand"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radRMQRGS1"), SIGNAL(clicked( bool )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_HANXIN)
    {
        QFile file (":/grpHX.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Han Xin Code"));
        connect(m_optionWidget->findChild<QObject*>("radHXAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radHXSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radHXECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbHXSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbHXECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_MICROQR)
    {
        QFile file(":/grpMQR.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Micro QR Code"));
        connect(m_optionWidget->findChild<QObject*>("radMQRAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radMQRSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radMQRECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbMQRSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbMQRECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_GRIDMATRIX)
    {
        QFile file(":/grpGrid.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Grid Matrix"));
        connect(m_optionWidget->findChild<QObject*>("radGridAuto"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radGridSize"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radGridECC"), SIGNAL(clicked( bool )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbGridSize"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbGridECC"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_MAXICODE)
    {
        QFile file(":/grpMaxicode.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Maxicode"));
        connect(m_optionWidget->findChild<QObject*>("cmbMaxiMode"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("cmbMaxiMode"), SIGNAL(currentIndexChanged( int )), SLOT(maxi_primary()));
        connect(m_optionWidget->findChild<QObject*>("txtMaxiPrimary"), SIGNAL(textChanged( const QString& )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CHANNEL)
    {
        QFile file(":/grpChannel.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Channel Code"));
        connect(m_optionWidget->findChild<QObject*>("cmbChannel"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODEONE)
    {
        QFile file(":/grpCodeOne.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Code One"));
        connect(m_optionWidget->findChild<QObject*>("cmbC1Size"), SIGNAL(currentIndexChanged( int )), SLOT(update_preview()));
        connect(m_optionWidget->findChild<QObject*>("radC1GS1"), SIGNAL(toggled( bool )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_CODE49)
    {
        QFile file(":/grpC49.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("Code 49"));
        connect(m_optionWidget->findChild<QObject*>("radC49GS1"), SIGNAL(toggled( bool )), SLOT(update_preview()));
    }

    if(metaObject()->enumerator(0).value(bstyle->currentIndex()) == BARCODE_RSS_EXPSTACK)
    {
        QFile file(":/grpDBExtend.ui");
        if (!file.open(QIODevice::ReadOnly))
            return;
        m_optionWidget=uiload.load(&file);
        file.close();
        tabMain->insertTab(1,m_optionWidget,tr("GS1 DataBar Stacked"));
        connect(m_optionWidget->findChild<QObject*>("cmbCols"), SIGNAL(currentIndexChanged ( int )), SLOT(update_preview()));
    }

    switch(metaObject()->enumerator(0).value(bstyle->currentIndex()))
    {
        case BARCODE_CODE128:
        case BARCODE_EANX:
        case BARCODE_UPCA:
        case BARCODE_UPCE:
        case BARCODE_RSS14:
        case BARCODE_RSS_LTD:
        case BARCODE_RSS_EXP:
        case BARCODE_RSS14STACK:
        case BARCODE_RSS14STACK_OMNI:
        case BARCODE_RSS_EXPSTACK:
            grpComposite->show();
            break;
        default:
            chkComposite->setChecked(false);
            grpComposite->hide();
            break;
    }
    tabMain->setCurrentIndex(0);
}

void MainWindow::composite_enable()
{
    if(chkComposite->isChecked() == true)
    {
        lblCompType->setEnabled(true);
        cmbCompType->setEnabled(true);
        lblComposite->setEnabled(true);
        txtComposite->setEnabled(true);
        if (metaObject()->enumerator(0).value(bstyle->currentIndex())==BARCODE_CODE128)
            m_optionWidget->findChild<QRadioButton*>("radC128EAN")->setChecked(true);
    }
    else
    {
        lblCompType->setEnabled(false);
        cmbCompType->setEnabled(false);
        lblComposite->setEnabled(false);
        txtComposite->setEnabled(false);
    }
}

void MainWindow::composite_ean_check()
{
    if (metaObject()->enumerator(0).value(bstyle->currentIndex())!=BARCODE_CODE128)
        return;
    if(!m_optionWidget->findChild<QRadioButton*>("radC128EAN")->isChecked())
        chkComposite->setChecked(false);
}

void MainWindow::maxi_primary()
{
    if (metaObject()->enumerator(0).value(bstyle->currentIndex())!=BARCODE_MAXICODE)
        return;
    if(m_optionWidget->findChild<QComboBox*>("cmbMaxiMode")->currentIndex() == 0) {
        m_optionWidget->findChild<QLabel*>("lblMaxiPrimary")->setEnabled(true);
        m_optionWidget->findChild<QLineEdit*>("txtMaxiPrimary")->setEnabled(true);
    } else {
        m_optionWidget->findChild<QLabel*>("lblMaxiPrimary")->setEnabled(false);
        m_optionWidget->findChild<QLineEdit*>("txtMaxiPrimary")->setEnabled(false);
    }
}

void MainWindow::update_preview()
{
    int width = view->geometry().width();
    int height = view->geometry().height();

    //m_bc.ar=(Zint::QZint::AspectRatioMode)1;
    if(chkComposite->isChecked() == true) {
        m_bc.bc.setPrimaryMessage(txtData->text());
        m_bc.bc.setText(txtComposite->toPlainText());
    } else {
        m_bc.bc.setText(txtData->text());

    }
    m_bc.bc.setSecurityLevel(0);
    m_bc.bc.setWidth(0);
    m_bc.bc.setInputMode(UNICODE_MODE);
    m_bc.bc.setHideText(0);
    if(chkHRTHide->isChecked() == false) {
        m_bc.bc.setHideText(1);
    }
    switch(metaObject()->enumerator(0).value(bstyle->currentIndex()))
    {
        case BARCODE_CODE128:
            if(m_optionWidget->findChild<QRadioButton*>("radC128Stand")->isChecked())
                m_bc.bc.setSymbol(BARCODE_CODE128);

            if(m_optionWidget->findChild<QRadioButton*>("radC128CSup")->isChecked())
                m_bc.bc.setSymbol(BARCODE_CODE128B);

            if(m_optionWidget->findChild<QRadioButton*>("radC128EAN")->isChecked())
            {
                if(chkComposite->isChecked())
                    m_bc.bc.setSymbol(BARCODE_EAN128_CC);
                else
                    m_bc.bc.setSymbol(BARCODE_EAN128);
            }

            if(m_optionWidget->findChild<QRadioButton*>("radC128HIBC")->isChecked())
                m_bc.bc.setSymbol(BARCODE_HIBC_128);
            break;

        case BARCODE_EANX:
            if(chkComposite->isChecked())
                m_bc.bc.setSymbol(BARCODE_EANX_CC);
            else
                m_bc.bc.setSymbol(BARCODE_EANX);
            break;

        case BARCODE_UPCA:
            if(chkComposite->isChecked())
                m_bc.bc.setSymbol(BARCODE_UPCA_CC);
            else
                m_bc.bc.setSymbol(BARCODE_UPCA);
            break;

        case BARCODE_UPCE:
            if(chkComposite->isChecked())
                m_bc.bc.setSymbol(BARCODE_UPCE_CC);
            else
                m_bc.bc.setSymbol(BARCODE_UPCE);
            break;

        case BARCODE_RSS14:
            if(chkComposite->isChecked())
                m_bc.bc.setSymbol(BARCODE_RSS14_CC);
            else
                m_bc.bc.setSymbol(BARCODE_RSS14);
            break;

        case BARCODE_RSS_LTD:
            if(chkComposite->isChecked())
                m_bc.bc.setSymbol(BARCODE_RSS_LTD_CC);
            else
                m_bc.bc.setSymbol(BARCODE_RSS_LTD);
            break;

        case BARCODE_RSS_EXP:
            if(chkComposite->isChecked())
                m_bc.bc.setSymbol(BARCODE_RSS_EXP_CC);
            else
                m_bc.bc.setSymbol(BARCODE_RSS_EXP);
            break;

        case BARCODE_RSS14STACK:
            if(chkComposite->isChecked())
                m_bc.bc.setSymbol(BARCODE_RSS14STACK_CC);
            else
                m_bc.bc.setSymbol(BARCODE_RSS14STACK);
            break;

        case BARCODE_RSS14STACK_OMNI:
            if(chkComposite->isChecked())
                m_bc.bc.setSymbol(BARCODE_RSS14_OMNI_CC);
            else
                m_bc.bc.setSymbol(BARCODE_RSS14STACK_OMNI);
            break;

        case BARCODE_RSS_EXPSTACK:
            if(chkComposite->isChecked())
                m_bc.bc.setSymbol(BARCODE_RSS_EXPSTACK_CC);
            else
                m_bc.bc.setSymbol(BARCODE_RSS_EXPSTACK);

            if(m_optionWidget->findChild<QComboBox*>("cmbCols")->currentIndex() != 0)
                m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbCols")->currentIndex());
            break;

        case BARCODE_PDF417:
            m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbPDFCols")->currentIndex());
            m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbPDFECC")->currentIndex()-1);

            if(m_optionWidget->findChild<QRadioButton*>("radPDFStand")->isChecked())
                m_bc.bc.setSymbol(BARCODE_PDF417);

            if(m_optionWidget->findChild<QRadioButton*>("radPDFTruncated")->isChecked())
                m_bc.bc.setSymbol(BARCODE_PDF417TRUNC);

            if(m_optionWidget->findChild<QRadioButton*>("radPDFHIBC")->isChecked())
                m_bc.bc.setSymbol(BARCODE_HIBC_PDF);
            break;

        case BARCODE_MICROPDF417:
            m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbMPDFCols")->currentIndex());
            if(m_optionWidget->findChild<QRadioButton*>("radMPDFStand")->isChecked())
                m_bc.bc.setSymbol(BARCODE_MICROPDF417);

            if(m_optionWidget->findChild<QRadioButton*>("radMPDFHIBC")->isChecked())
                m_bc.bc.setSymbol(BARCODE_HIBC_MICPDF);
            break;

        case BARCODE_DOTCODE:
            m_bc.bc.setSymbol(BARCODE_DOTCODE);
            m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbDotCols")->currentIndex());
            if(m_optionWidget->findChild<QRadioButton*>("radDotGs1")->isChecked())
                m_bc.bc.setInputMode(GS1_MODE);
            m_bc.bc.setDotSize(m_optionWidget->findChild<QLineEdit*>("txtDotSize")->text().toFloat());
            break;

        case BARCODE_AZTEC:
            m_bc.bc.setSymbol(BARCODE_AZTEC);
            if(m_optionWidget->findChild<QRadioButton*>("radAztecSize")->isChecked())
                m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbAztecSize")->currentIndex() + 1);

            if(m_optionWidget->findChild<QRadioButton*>("radAztecECC")->isChecked())
                m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbAztecECC")->currentIndex() + 1);

            if(m_optionWidget->findChild<QRadioButton*>("radAztecGS1")->isChecked())
                m_bc.bc.setInputMode(GS1_MODE);
            if(m_optionWidget->findChild<QRadioButton*>("radAztecHIBC")->isChecked())
                m_bc.bc.setSymbol(BARCODE_HIBC_AZTEC);
            break;

        case BARCODE_MSI_PLESSEY:
            m_bc.bc.setSymbol(BARCODE_MSI_PLESSEY);
            m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbMSICheck")->currentIndex());
            break;

        case BARCODE_CODE39:
            if(m_optionWidget->findChild<QRadioButton*>("radC39HIBC")->isChecked())
                m_bc.bc.setSymbol(BARCODE_HIBC_39);
            else
            {
                m_bc.bc.setSymbol(BARCODE_CODE39);
                if(m_optionWidget->findChild<QRadioButton*>("radC39Check")->isChecked())
                    m_bc.bc.setWidth(1);
            }
            break;

        case BARCODE_EXCODE39:
            m_bc.bc.setSymbol(BARCODE_EXCODE39);
            if(m_optionWidget->findChild<QRadioButton*>("radC39Check")->isChecked())
                m_bc.bc.setWidth(1);

            break;
        case BARCODE_CODE16K:
            m_bc.bc.setSymbol(BARCODE_CODE16K);
            if(m_optionWidget->findChild<QRadioButton*>("radC16kStand")->isChecked())
                m_bc.bc.setInputMode(UNICODE_MODE);
            else
                m_bc.bc.setInputMode(GS1_MODE);
            break;

            case BARCODE_CODABLOCKF:
                m_bc.bc.setSymbol(BARCODE_CODABLOCKF);
                if(m_optionWidget->findChild<QRadioButton*>("radCbfSetWidth")->isChecked())
                    m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbCbfWidth")->currentIndex() + 6);
                // Height selection uses option 1 in zint_symbol
                if(m_optionWidget->findChild<QRadioButton*>("radCbfSetHeight")->isChecked())
                    m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbCbfHeight")->currentIndex() + 1);
                break;

        case BARCODE_DATAMATRIX:
            m_bc.bc.setSecurityLevel(1);
            if(m_optionWidget->findChild<QRadioButton*>("radDM200HIBC")->isChecked())
                m_bc.bc.setSymbol(BARCODE_HIBC_DM);
            else
                m_bc.bc.setSymbol(BARCODE_DATAMATRIX);

            if(m_optionWidget->findChild<QRadioButton*>("radDM200GS1")->isChecked())
                m_bc.bc.setInputMode(GS1_MODE);

            m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbDM200Size")->currentIndex());

            if (m_optionWidget->findChild<QComboBox*>("cmbDM200Size")->currentIndex() == 0) {
                // Supressing rectangles or allowing DMRE only makes sense if in automatic size mode
                findChild<QCheckBox*>("chkDMRectangle")->setEnabled(true);
                findChild<QCheckBox*>("chkDMRE")->setEnabled(true);
                if(m_optionWidget->findChild<QCheckBox*>("chkDMRectangle")->isChecked())
                        m_bc.bc.setOption3(DM_SQUARE);
                else {
                    if(m_optionWidget->findChild<QCheckBox*>("chkDMRE")->isChecked())
                        m_bc.bc.setOption3(DM_DMRE);
                    else
                        m_bc.bc.setOption3(0);
                }
            } else {
                findChild<QCheckBox*>("chkDMRectangle")->setEnabled(false);
                findChild<QCheckBox*>("chkDMRE")->setEnabled(false);
                m_bc.bc.setOption3(0);
            }
            break;

        case BARCODE_QRCODE:
            if(m_optionWidget->findChild<QRadioButton*>("radQRHIBC")->isChecked())
                m_bc.bc.setSymbol(BARCODE_HIBC_QR);
            else
                m_bc.bc.setSymbol(BARCODE_QRCODE);

            if(m_optionWidget->findChild<QRadioButton*>("radQRGS1")->isChecked())
                m_bc.bc.setInputMode(GS1_MODE);

            if(m_optionWidget->findChild<QRadioButton*>("radQRSize")->isChecked())
                m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbQRSize")->currentIndex() + 1);

            if(m_optionWidget->findChild<QRadioButton*>("radQRECC")->isChecked())
                m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbQRECC")->currentIndex() + 1);
            break;

        case BARCODE_MICROQR:
            m_bc.bc.setSymbol(BARCODE_MICROQR);
            if(m_optionWidget->findChild<QRadioButton*>("radMQRSize")->isChecked())
                m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbMQRSize")->currentIndex() + 1);

            if(m_optionWidget->findChild<QRadioButton*>("radMQRECC")->isChecked())
                m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbMQRECC")->currentIndex() + 1);
            break;

        case BARCODE_RMQR:
            m_bc.bc.setSymbol(BARCODE_RMQR);

            if(m_optionWidget->findChild<QRadioButton*>("radRMQRGS1")->isChecked())
                m_bc.bc.setInputMode(GS1_MODE);

            if(m_optionWidget->findChild<QRadioButton*>("radRMQRSize")->isChecked())
                m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbRMQRSize")->currentIndex() + 1);

            if(m_optionWidget->findChild<QRadioButton*>("radRMQRECC")->isChecked())
                m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbRMQRECC")->currentIndex() * 2 + 2);
            break;

        case BARCODE_GRIDMATRIX:
            m_bc.bc.setSymbol(BARCODE_GRIDMATRIX);
            if(m_optionWidget->findChild<QRadioButton*>("radGridSize")->isChecked())
                m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbGridSize")->currentIndex() + 1);

            if(m_optionWidget->findChild<QRadioButton*>("radGridECC")->isChecked())
                m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbGridECC")->currentIndex() + 1);
            break;

        case BARCODE_MAXICODE:
            m_bc.bc.setSymbol(BARCODE_MAXICODE);
            if(m_optionWidget->findChild<QComboBox*>("cmbMaxiMode")->currentIndex() == 0)
            {
                m_bc.bc.setSecurityLevel(2);
                m_bc.bc.setPrimaryMessage(m_optionWidget->findChild<QLineEdit*>("txtMaxiPrimary")->text());
            }
            else
                m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbMaxiMode")->currentIndex() + 3);
            break;

        case BARCODE_CHANNEL:
            m_bc.bc.setSymbol(BARCODE_CHANNEL);
            if(m_optionWidget->findChild<QComboBox*>("cmbChannel")->currentIndex() == 0)
                m_bc.bc.setWidth(0);
            else
                m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbChannel")->currentIndex() + 2);
            break;

        case BARCODE_CODEONE:
            m_bc.bc.setSymbol(BARCODE_CODEONE);
            if(m_optionWidget->findChild<QRadioButton*>("radC1GS1")->isChecked())
                m_bc.bc.setInputMode(GS1_MODE);
            m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbC1Size")->currentIndex());
            break;

        case BARCODE_CODE49:
            m_bc.bc.setSymbol(BARCODE_CODE49);
            if(m_optionWidget->findChild<QRadioButton*>("radC49GS1")->isChecked())
                m_bc.bc.setInputMode(GS1_MODE);
            break;

        case BARCODE_HANXIN:
            m_bc.bc.setSymbol(BARCODE_HANXIN);
            if(m_optionWidget->findChild<QRadioButton*>("radHXSize")->isChecked())
                m_bc.bc.setWidth(m_optionWidget->findChild<QComboBox*>("cmbHXSize")->currentIndex() + 1);

            if(m_optionWidget->findChild<QRadioButton*>("radHXECC")->isChecked())
                m_bc.bc.setSecurityLevel(m_optionWidget->findChild<QComboBox*>("cmbHXECC")->currentIndex() + 1);
            break;

        default:
            m_bc.bc.setSymbol(metaObject()->enumerator(0).value(bstyle->currentIndex()));
            break;
    }

    if(chkComposite->isChecked())
        m_bc.bc.setSecurityLevel(cmbCompType->currentIndex());

    m_bc.bc.setBorderType((Zint::QZint::BorderType)(btype->currentIndex()*2));
    m_bc.bc.setBorderWidth(bwidth->value());
    if(chkAutoHeight->isChecked()) {
        m_bc.bc.setHeight(0);
    } else {
        m_bc.bc.setHeight(heightb->value());
    }
    m_bc.bc.setWhitespace(spnWhitespace->value());
    m_bc.bc.setFgColor(m_fgcolor);
    m_bc.bc.setBgColor(m_bgcolor);
    m_bc.setSize(width - 10, height - 10);
    m_bc.update();
    scene->setSceneRect(0, 0, width - 10, height - 10);
    scene->update();
}

Changes to jni/zint/frontend_qt/mainwindow.h.
1
2
3
4
5
6
7
8
9
10
/***************************************************************************
 *   Copyright (C) 2008 by BogDan Vatra <bogdan@licentia.eu>               *
 *   Copyright (C) 2009-2016 by Robin Stuart <rstuart114@gmail.com>        *
 *                                                                         *
 *   This program is free software: you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation, either version 3 of the License, or     *
 *   (at your option) any later version.                                   *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *


|







1
2
3
4
5
6
7
8
9
10
/***************************************************************************
 *   Copyright (C) 2008 by BogDan Vatra <bogdan@licentia.eu>               *
 *   Copyright (C) 2009-2019 by Robin Stuart <rstuart114@gmail.com>        *
 *                                                                         *
 *   This program is free software: you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation, either version 3 of the License, or     *
 *   (at your option) any later version.                                   *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123

124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
class QAction;
class QActionGroup;
class QLabel;
class QMenu;

class MainWindow : public QWidget, private Ui::mainWindow
{
	Q_OBJECT

	Q_ENUMS(BarcodeTypes)

public:
	enum BarcodeTypes
	{
		AUSREDIRECT	=68,
		AUSREPLY	=66,
		AUSROUTE	=67,
		AUSPOST		=63,
		AZTEC		=92,
		AZRUNE		=128,
		CHANNEL		=140,
		CODABAR		=18,
                CODABLOCK       =74,
		CODE11		=1,
		CODE128		=20,
		CODE16K		=23,
		C25LOGIC	=6,
		C25IATA		=4,
		C25IND		=7,
		C25INTER	=3,
		C25MATRIX	=2,
		CODE32		=129,
		CODE39		=8,
		EXCODE39	=9,
		CODE49		=24,
		CODE93		=25,
		CODE_ONE	=141,
		DATAMATRIX	=71,
		DPIDENT		=22,
		DPLEIT		=21,
                DOTCODE         =115,
		KIX		=90,
		EAN14		=72,
		EANX		=13,
		FIM		=49,
		FLAT		=28,
		GRIDMATRIX	=142,
		RSS_EXP		=31,
		RSS_EXPSTACK	=81,
		RSS_LTD		=30,
		RSS14		=29,
		RSS14STACK	=79,
		RSS14STACK_OMNI	=80,
                HANXIN          =116,
		ITF14		=89,
		ISBNX		=69,
		JAPANPOST	=76,
		KOREAPOST	=77,
		LOGMARS		=50,
		MAXICODE	=57,
		MICROPDF417	=84,
		MICROQR		=97,
		MSI_PLESSEY	=47,
		NVE18		=75,
		PDF417		=55,
		PHARMA		=51,
		PHARMA_TWO	=53,
		PZN		=52,
		PLANET		=82,
		POSTNET		=40,
		QRCODE		=58,

		RM4SCC		=70,
                MAILMARK        =121,
		TELEPEN		=32,
		TELEPEN_NUM	=87,
		PLESSEY		=86,
                UPNQR           =143,
		UPCA		=34,
		UPCE		=37,
		ONECODE		=85
	};

public:
	MainWindow(QWidget* parent = 0, Qt::WindowFlags fl = 0);
	~MainWindow();


public slots:
	void update_preview();
	void change_options();
	void on_fgcolor_clicked();
	void on_bgcolor_clicked();
	void composite_enable();
	void composite_ean_check();
	void maxi_primary();
	void change_print_scale();


protected:
    void resizeEvent(QResizeEvent *event);

private slots:
	bool save();
	void about();
	void quit_now();
	void reset_view();
	int open_data_dialog();
	int open_sequence_dialog();
    void copy_to_clipboard_svg();
    void copy_to_clipboard_bmp();

private:
/*	void createActions();
	void createMenus(); */

	QColor m_fgcolor,m_bgcolor;
	BarcodeItem m_bc;
	QWidget *m_optionWidget;
        QGraphicsScene *scene;
/*     QMenu *fileMenu;
     QMenu *helpMenu;
     QAction *saveAct;
     QAction *aboutQtAct; */
};

#endif










|

|


|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|


|
|



|
|
|
|
|
|
|
|
>





|
|
|
|
|
|




<
<
<
|
|
|
|
<
<
<
<



<
<
<
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140



141
142
143
144




145
146
147



class QAction;
class QActionGroup;
class QLabel;
class QMenu;

class MainWindow : public QWidget, private Ui::mainWindow
{
    Q_OBJECT

    Q_ENUMS(BarcodeTypes)

public:
    enum BarcodeTypes
    {
        AUSREDIRECT      = 68,
        AUSREPLY         = 66,
        AUSROUTE         = 67,
        AUSPOST          = 63,
        AZTEC            = 92,
        AZRUNE           = 128,
        CHANNEL          = 140,
        CODABAR          = 18,
        CODABLOCK        = 74,
        CODE11           = 1,
        CODE128          = 20,
        CODE16K          = 23,
        C25LOGIC         = 6,
        C25IATA          = 4,
        C25IND           = 7,
        C25INTER         = 3,
        C25MATRIX        = 2,
        CODE32           = 129,
        CODE39           = 8,
        EXCODE39         = 9,
        CODE49           = 24,
        CODE93           = 25,
        CODE_ONE         = 141,
        DATAMATRIX       = 71,
        DPIDENT          = 22,
        DPLEIT           = 21,
        DOTCODE          = 115,
        KIX              = 90,
        EAN14            = 72,
        EANX             = 13,
        FIM              = 49,
        FLAT             = 28,
        GRIDMATRIX       = 142,
        RSS_EXP          = 31,
        RSS_EXPSTACK     = 81,
        RSS_LTD          = 30,
        RSS14            = 29,
        RSS14STACK       = 79,
        RSS14STACK_OMNI  = 80,
        HANXIN           = 116,
        ITF14            = 89,
        ISBNX            = 69,
        JAPANPOST        = 76,
        KOREAPOST        = 77,
        LOGMARS          = 50,
        MAXICODE         = 57,
        MICROPDF417      = 84,
        MICROQR          = 97,
        MSI_PLESSEY      = 47,
        NVE18            = 75,
        PDF417           = 55,
        PHARMA           = 51,
        PHARMA_TWO       = 53,
        PZN              = 52,
        PLANET           = 82,
        POSTNET          = 40,
        QRCODE           = 58,
        RMQR             = 145,
        RM4SCC           = 70,
        MAILMARK         = 121,
        TELEPEN          = 32,
        TELEPEN_NUM      = 87,
        PLESSEY          = 86,
        UPNQR            = 143,
        UPCA             = 34,
        UPCE             = 37,
        ONECODE          = 85
    };

public:
    MainWindow(QWidget* parent = 0, Qt::WindowFlags fl = 0);
    ~MainWindow();


public slots:
    void update_preview();
    void change_options();
    void on_fgcolor_clicked();
    void on_bgcolor_clicked();
    void composite_enable();
    void composite_ean_check();
    void maxi_primary();
    void change_print_scale();
    void autoheight_clicked();

protected:
    void resizeEvent(QResizeEvent *event);

private slots:
    bool save();
    void about();
    void quit_now();
    void reset_view();
    int open_data_dialog();
    int open_sequence_dialog();
    void copy_to_clipboard_svg();
    void copy_to_clipboard_bmp();

private:



    QColor m_fgcolor,m_bgcolor;
    BarcodeItem m_bc;
    QWidget *m_optionWidget;
    QGraphicsScene *scene;




};

#endif



Changes to jni/zint/frontend_qt/resources.qrc.
20
21
22
23
24
25
26

27
28
        <file>grpC49.ui</file>
        <file>grpGrid.ui</file>
        <file>grpDBExtend.ui</file>
        <file>images/zint.png</file>
        <file>grpHX.ui</file>
        <file>grpDotCode.ui</file>
        <file>grpCodablockF.ui</file>

    </qresource>
</RCC>







>


20
21
22
23
24
25
26
27
28
29
        <file>grpC49.ui</file>
        <file>grpGrid.ui</file>
        <file>grpDBExtend.ui</file>
        <file>images/zint.png</file>
        <file>grpHX.ui</file>
        <file>grpDotCode.ui</file>
        <file>grpCodablockF.ui</file>
        <file>grpRMQR.ui</file>
    </qresource>
</RCC>
Changes to jni/zint/win32/libzint.vcxproj.
315
316
317
318
319
320
321



322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345

346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362

363
364
365
366
367
368
369
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_LIB|Win32'">true</ExcludedFromBuild>
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_LIB|x64'">true</ExcludedFromBuild>
    </ClCompile>
    <ClCompile Include="..\backend\dmatrix.c" />
    <ClCompile Include="..\backend\dotcode.c" />
    <ClCompile Include="..\backend\eci.c" />
    <ClCompile Include="..\backend\emf.c" />



    <ClCompile Include="..\backend\gif.c" />
    <ClCompile Include="..\backend\gridmtx.c" />
    <ClCompile Include="..\backend\gs1.c" />
    <ClCompile Include="..\backend\hanxin.c" />
    <ClCompile Include="..\backend\imail.c" />
    <ClCompile Include="..\backend\large.c" />
    <ClCompile Include="..\backend\library.c" />
    <ClCompile Include="..\backend\mailmark.c" />
    <ClCompile Include="..\backend\maxicode.c" />
    <ClCompile Include="..\backend\medical.c" />
    <ClCompile Include="..\backend\pcx.c" />
    <ClCompile Include="..\backend\pdf417.c" />
    <ClCompile Include="..\backend\plessey.c" />
    <ClCompile Include="..\backend\png.c" />
    <ClCompile Include="..\backend\postal.c" />
    <ClCompile Include="..\backend\ps.c" />
    <ClCompile Include="..\backend\qr.c" />
    <ClCompile Include="..\backend\raster.c" />
    <ClCompile Include="..\backend\reedsol.c" />
    <ClCompile Include="..\backend\render.c" />
    <ClCompile Include="..\backend\rss.c" />
    <ClCompile Include="..\backend\svg.c" />
    <ClCompile Include="..\backend\telepen.c" />
    <ClCompile Include="..\backend\tif.c" />

    <ClCompile Include="..\backend\upcean.c" />
    <ClCompile Include="..\backend\vector.c" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="..\backend\aztec.h" />
    <ClInclude Include="..\backend\bmp.h" />
    <ClInclude Include="..\backend\code1.h" />
    <ClInclude Include="..\backend\code49.h" />
    <ClInclude Include="..\backend\common.h" />
    <ClInclude Include="..\backend\composite.h" />
    <ClInclude Include="..\backend\dm200.h" />
    <ClInclude Include="..\backend\dmatrix.h" />
    <ClInclude Include="..\backend\eci.h" />
    <ClInclude Include="..\backend\emf.h" />
    <ClInclude Include="..\backend\font.h" />
    <ClInclude Include="..\backend\gb18030.h" />
    <ClInclude Include="..\backend\gb2312.h" />

    <ClInclude Include="..\backend\gridmtx.h" />
    <ClInclude Include="..\backend\gs1.h" />
    <ClInclude Include="..\backend\hanxin.h" />
    <ClInclude Include="..\backend\large.h" />
    <ClInclude Include="..\backend\maxicode.h" />
    <ClInclude Include="..\backend\maxipng.h" />
    <ClInclude Include="..\backend\ms_stdint.h" />







>
>
>



















|
|



>

















>







315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_LIB|Win32'">true</ExcludedFromBuild>
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_LIB|x64'">true</ExcludedFromBuild>
    </ClCompile>
    <ClCompile Include="..\backend\dmatrix.c" />
    <ClCompile Include="..\backend\dotcode.c" />
    <ClCompile Include="..\backend\eci.c" />
    <ClCompile Include="..\backend\emf.c" />
    <ClCompile Include="..\backend\gb18030.c" />
    <ClCompile Include="..\backend\gb2312.c" />
    <ClCompile Include="..\backend\general_field.c" />
    <ClCompile Include="..\backend\gif.c" />
    <ClCompile Include="..\backend\gridmtx.c" />
    <ClCompile Include="..\backend\gs1.c" />
    <ClCompile Include="..\backend\hanxin.c" />
    <ClCompile Include="..\backend\imail.c" />
    <ClCompile Include="..\backend\large.c" />
    <ClCompile Include="..\backend\library.c" />
    <ClCompile Include="..\backend\mailmark.c" />
    <ClCompile Include="..\backend\maxicode.c" />
    <ClCompile Include="..\backend\medical.c" />
    <ClCompile Include="..\backend\pcx.c" />
    <ClCompile Include="..\backend\pdf417.c" />
    <ClCompile Include="..\backend\plessey.c" />
    <ClCompile Include="..\backend\png.c" />
    <ClCompile Include="..\backend\postal.c" />
    <ClCompile Include="..\backend\ps.c" />
    <ClCompile Include="..\backend\qr.c" />
    <ClCompile Include="..\backend\raster.c" />
    <ClCompile Include="..\backend\reedsol.c" />
    <ClCompile Include="..\backend\rss.c" />
    <ClCompile Include="..\backend\sjis.c" />
    <ClCompile Include="..\backend\svg.c" />
    <ClCompile Include="..\backend\telepen.c" />
    <ClCompile Include="..\backend\tif.c" />
    <ClCompile Include="..\backend\ultra.c" />
    <ClCompile Include="..\backend\upcean.c" />
    <ClCompile Include="..\backend\vector.c" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="..\backend\aztec.h" />
    <ClInclude Include="..\backend\bmp.h" />
    <ClInclude Include="..\backend\code1.h" />
    <ClInclude Include="..\backend\code49.h" />
    <ClInclude Include="..\backend\common.h" />
    <ClInclude Include="..\backend\composite.h" />
    <ClInclude Include="..\backend\dm200.h" />
    <ClInclude Include="..\backend\dmatrix.h" />
    <ClInclude Include="..\backend\eci.h" />
    <ClInclude Include="..\backend\emf.h" />
    <ClInclude Include="..\backend\font.h" />
    <ClInclude Include="..\backend\gb18030.h" />
    <ClInclude Include="..\backend\gb2312.h" />
    <ClInclude Include="..\backend\general_field.h" />
    <ClInclude Include="..\backend\gridmtx.h" />
    <ClInclude Include="..\backend\gs1.h" />
    <ClInclude Include="..\backend\hanxin.h" />
    <ClInclude Include="..\backend\large.h" />
    <ClInclude Include="..\backend\maxicode.h" />
    <ClInclude Include="..\backend\maxipng.h" />
    <ClInclude Include="..\backend\ms_stdint.h" />
Changes to jni/zint/win32/zint_cmdline_vc6/zint.rc.
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 2,6,3,0
 PRODUCTVERSION 2,6,3,0
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904e4"
        BEGIN
            VALUE "Comments", "\0"
            VALUE "CompanyName", "\0"
            VALUE "FileDescription", "zint barcode generator\0"
            VALUE "FileVersion", "2.6.5.0\0"
            VALUE "InternalName", "zint.exe\0"
            VALUE "LegalCopyright", "Copyright © 2018 Robin Stuart\0"
            VALUE "LegalTrademarks", "\0"
            VALUE "License", "GNU General Public License version 3\0"
            VALUE "OriginalFilename", "zint.exe\0"
            VALUE "PrivateBuild", "\0"
            VALUE "ProductName", "zint\0"
            VALUE "ProductVersion", "2.6.5.0\0"
            VALUE "SpecialBuild", "\0"
            VALUE "WWW", "http://www.sourceforge.net/projects/zint\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1252







|
|

















|

|





|







27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 2,6,7,0
 PRODUCTVERSION 2,6,7,0
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904e4"
        BEGIN
            VALUE "Comments", "\0"
            VALUE "CompanyName", "\0"
            VALUE "FileDescription", "zint barcode generator\0"
            VALUE "FileVersion", "2.6.7.0\0"
            VALUE "InternalName", "zint.exe\0"
            VALUE "LegalCopyright", "Copyright © 2019 Robin Stuart\0"
            VALUE "LegalTrademarks", "\0"
            VALUE "License", "GNU General Public License version 3\0"
            VALUE "OriginalFilename", "zint.exe\0"
            VALUE "PrivateBuild", "\0"
            VALUE "ProductName", "zint\0"
            VALUE "ProductVersion", "2.6.7.0\0"
            VALUE "SpecialBuild", "\0"
            VALUE "WWW", "http://www.sourceforge.net/projects/zint\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1252
Changes to jni/zint/win32/zint_cmdline_vc6/zint_cmdline_vc6.dsp.
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\backend" /I "..\..\..\zlib" /I "..\..\..\lpng" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /D ZINT_VERSION="\"2.6.5\"" /c
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386







|







38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\backend" /I "..\..\..\zlib" /I "..\..\..\lpng" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /D ZINT_VERSION="\"2.6.7\"" /c
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
147
148
149
150
151
152
153












154
155
156
157
158
159
160
SOURCE=..\..\backend\eci.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\emf.c
# End Source File
# Begin Source File













SOURCE=..\..\frontend\getopt.c
# End Source File
# Begin Source File

SOURCE=..\..\frontend\getopt1.c
# End Source File







>
>
>
>
>
>
>
>
>
>
>
>







147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
SOURCE=..\..\backend\eci.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\emf.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\gb18030.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\gb2312.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\general_field.c
# End Source File
# Begin Source File

SOURCE=..\..\frontend\getopt.c
# End Source File
# Begin Source File

SOURCE=..\..\frontend\getopt1.c
# End Source File
236
237
238
239
240
241
242
243
244
245
246
247
248
249




250
251
252
253
254
255
256
# End Source File
# Begin Source File

SOURCE=..\..\backend\reedsol.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\render.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\rss.c
# End Source File
# Begin Source File





SOURCE=..\..\backend\svg.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\telepen.c
# End Source File







<
<
<
<



>
>
>
>







248
249
250
251
252
253
254




255
256
257
258
259
260
261
262
263
264
265
266
267
268
# End Source File
# Begin Source File

SOURCE=..\..\backend\reedsol.c
# End Source File
# Begin Source File





SOURCE=..\..\backend\rss.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\sjis.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\svg.c
# End Source File
# Begin Source File

SOURCE=..\..\backend\telepen.c
# End Source File
Changes to jni/zint/zint.nsi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; @(#) $Id: zint.nsi,v 1.1 2009/11/17 22:23:06 hooper114 Exp $
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
; ver 1.0.0.1 20090914 tgotic removed WinSxS check
;******************************************************************************
!define PRODUCT_NAME "Zint"
!define PRODUCT_EXE "qtZint.exe"
!define PRODUCT_VERSION "2.6.4.0"
!define PRODUCT_WEB_SITE "http://www.zint.org.uk"
!define PRODUCT_PUBLISHER "Robin Stuart & BogDan Vatra"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_EXE}"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
;******************************************************************************
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; @(#) $Id: zint.nsi,v 1.1 2009/11/17 22:23:06 hooper114 Exp $
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
; ver 1.0.0.1 20090914 tgotic removed WinSxS check
;******************************************************************************
!define PRODUCT_NAME "Zint"
!define PRODUCT_EXE "qtZint.exe"
!define PRODUCT_VERSION "2.6.7.0"
!define PRODUCT_WEB_SITE "http://www.zint.org.uk"
!define PRODUCT_PUBLISHER "Robin Stuart & BogDan Vatra"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_EXE}"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
;******************************************************************************
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
Changes to jni/zint/zint.spec.
1
2
3
4
5
6
7
8
9
Name:      zint
Version:   2.6.5
Release:   2%{?dist}
Summary:   A barcode generator and library
License:   GPLv3+
URL:       http://www.zint.org.uk
Source:    http://downloads.sourceforge.net/project/%{name}/%{name}/%{version}/%{name}-%{version}.src.tar.gz
Group:     Applications/Engineering
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

|







1
2
3
4
5
6
7
8
9
Name:      zint
Version:   2.7.0
Release:   2%{?dist}
Summary:   A barcode generator and library
License:   GPLv3+
URL:       http://www.zint.org.uk
Source:    http://downloads.sourceforge.net/project/%{name}/%{name}/%{version}/%{name}-%{version}.src.tar.gz
Group:     Applications/Engineering
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
133
134
135
136
137
138
139






140
141
142
143
144
145
146
%files -n %{name}-qt-devel
%defattr(-,root,root,-)
%{_includedir}/qzint.h
%{_libdir}/libQZint.so


%changelog







* Mon Sep 1 2019 Harald Oehlmann <oehhar@sourceforge.net> - 2.6.5
- Version -> 2.6.5

* Fri Aug 30 2019 Harald Oehlmann <oehhar@sourceforge.net> - 2.6.4
- Version -> 2.6.4








>
>
>
>
>
>







133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
%files -n %{name}-qt-devel
%defattr(-,root,root,-)
%{_includedir}/qzint.h
%{_libdir}/libQZint.so


%changelog

* Thu Dec 5 2019 Harald Oehlmann <oehhar@sourceforge.net> - 2.7.0
- Version -> 2.7.0

* Wed Sep 18 2019 Harald Oehlmann <oehhar@sourceforge.net> - 2.6.6
- Version -> 2.6.6

* Mon Sep 1 2019 Harald Oehlmann <oehhar@sourceforge.net> - 2.6.5
- Version -> 2.6.5

* Fri Aug 30 2019 Harald Oehlmann <oehhar@sourceforge.net> - 2.6.4
- Version -> 2.6.4